Graphviz 14.1.3~dev.20260124.0732
Loading...
Searching...
No Matches
pointset.c
Go to the documentation of this file.
1
3/*************************************************************************
4 * Copyright (c) 2011 AT&T Intellectual Property
5 * All rights reserved. This program and the accompanying materials
6 * are made available under the terms of the Eclipse Public License v1.0
7 * which accompanies this distribution, and is available at
8 * https://www.eclipse.org/legal/epl-v10.html
9 *
10 * Contributors: Details at https://graphviz.org
11 *************************************************************************/
12
13#include "config.h"
14
15#include <common/render.h>
16#include <common/pointset.h>
17#include <stddef.h>
18#include <util/alloc.h>
19
20typedef struct {
23} pair;
24
25static pair *mkPair(pointf p) {
26 pair *pp = gv_alloc(sizeof(pair));
27 pp->id = p;
28 return pp;
29}
30
31static int cmppair(void *k1, void *k2) {
32 const pointf *key1 = k1;
33 const pointf *key2 = k2;
34 if (key1->x > key2->x)
35 return 1;
36 else if (key1->x < key2->x)
37 return -1;
38 else if (key1->y > key2->y)
39 return 1;
40 else if (key1->y < key2->y)
41 return -1;
42 else
43 return 0;
44}
45
46static int cmpmpair(void *k1, void *k2) {
47 const point *key1 = k1;
48 const point *key2 = k2;
49 if (key1->x > key2->x)
50 return 1;
51 else if (key1->x < key2->x)
52 return -1;
53 else if (key1->y > key2->y)
54 return 1;
55 else if (key1->y < key2->y)
56 return -1;
57 else
58 return 0;
59}
60
62 offsetof(pair, id),
63 sizeof(pointf),
64 offsetof(pair, link),
65 0,
66 free,
67 cmppair,
68};
69
71{
72 return (dtopen(&intPairDisc, Dtoset));
73}
74
76{
77 dtclose(ps);
78}
79
81 pair *pp;
82
83 pp = mkPair(pt);
84 if (dtinsert(ps, pp) != pp)
85 free(pp);
86}
87
88void addPS(PointSet *ps, double x, double y) {
89 const pointf pt = {.x = x, .y = y};
90 pair *pp = mkPair(pt);
91 if (dtinsert(ps, pp) != pp)
92 free(pp);
93}
94
96 pair p;
97 p.id = pt;
98 return dtsearch(ps, &p) ? 1 : 0;
99}
100
101int isInPS(PointSet *ps, double x, double y) {
102 return inPS(ps, (pointf){.x = x, .y = y});
103}
104
106{
107 return dtsize(ps);
108}
109
111 const size_t n = (size_t)dtsize(ps);
112 pointf *pts = gv_calloc(n, sizeof(pointf));
113 pair *p;
114 pointf *pp = pts;
115
116 for (p = (pair *) dtflatten(ps); p;
117 p = (pair *)dtlink(ps, p)) {
118 *pp++ = p->id;
119 }
120
121 return pts;
122}
123
124typedef struct {
127 int v;
128} mpair;
129
130static void *mkMPair(void *p, Dtdisc_t *disc) {
131 (void)disc;
132 mpair *obj = p;
133 mpair *ap = gv_alloc(sizeof(mpair));
134 ap->id = obj->id;
135 ap->v = obj->v;
136 return ap;
137}
138
140 offsetof(mpair, id),
141 sizeof(point),
142 offsetof(mpair, link),
143 mkMPair,
144 free,
145 cmpmpair,
146};
147
149{
150 return dtopen(&intMPairDisc, Dtoset);
151}
152
154{
155 dtclear(ps);
156}
157
159{
160 dtclose(ps);
161}
162
163int insertPM(PointMap * pm, int x, int y, int value)
164{
165 mpair *p;
166 mpair dummy;
167
168 dummy.id.x = x;
169 dummy.id.y = y;
170 dummy.v = value;
171 p = dtinsert(pm, &dummy);
172 return p->v;
173}
Memory allocation wrappers that exit on failure.
static void * gv_calloc(size_t nmemb, size_t size)
Definition alloc.h:26
static void * gv_alloc(size_t size)
Definition alloc.h:47
CDT_API Dtlink_t * dtflatten(Dt_t *)
Definition dtflatten.c:12
#define dtclear(d)
Definition cdt.h:189
#define dtsearch(d, o)
Definition cdt.h:184
CDT_API int dtsize(Dt_t *)
Definition dtsize.c:14
#define dtlink(d, e)
Definition cdt.h:176
#define dtinsert(d, o)
Definition cdt.h:186
CDT_API int dtclose(Dt_t *)
Definition dtclose.c:10
CDT_API Dtmethod_t * Dtoset
ordered set (self-adjusting tree)
Definition dttree.c:306
CDT_API Dt_t * dtopen(Dtdisc_t *, Dtmethod_t *)
Definition dtopen.c:11
static Dtdisc_t disc
Definition exparse.y:209
struct pointf_s pointf
void free(void *)
static int * ps
Definition lu.c:53
std::unordered_map< std::pair< int, int >, int, PointHash > PointMap
void addPS(PointSet *ps, double x, double y)
Definition pointset.c:88
static pair * mkPair(pointf p)
Definition pointset.c:25
static int cmpmpair(void *k1, void *k2)
Definition pointset.c:46
static Dtdisc_t intMPairDisc
Definition pointset.c:139
void insertPS(PointSet *ps, pointf pt)
Definition pointset.c:80
static void * mkMPair(void *p, Dtdisc_t *disc)
Definition pointset.c:130
PointSet * newPS(void)
Definition pointset.c:70
static Dtdisc_t intPairDisc
Definition pointset.c:61
void clearPM(PointMap *ps)
Definition pointset.c:153
int insertPM(PointMap *pm, int x, int y, int value)
Definition pointset.c:163
void freePS(PointSet *ps)
Definition pointset.c:75
int isInPS(PointSet *ps, double x, double y)
Definition pointset.c:101
pointf * pointsOf(PointSet *ps)
Definition pointset.c:110
PointMap * newPM(void)
Definition pointset.c:148
static int cmppair(void *k1, void *k2)
Definition pointset.c:31
int sizeOf(PointSet *ps)
Definition pointset.c:105
int inPS(PointSet *ps, pointf pt)
Definition pointset.c:95
void freePM(PointMap *ps)
Definition pointset.c:158
point containers PointSet and PointMap
Definition cdt.h:98
int v
Definition pointset.c:127
Dtlink_t link
Definition pointset.c:125
point id
Definition pointset.c:126
pointf id
Definition pointset.c:22
Dtlink_t link
Definition pointset.c:21
Definition geom.h:27
int y
Definition geom.h:27
int x
Definition geom.h:27
double x
Definition geom.h:29
double y
Definition geom.h:29