Graphviz 13.0.0~dev.20250210.0415
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 <common/render.h>
14#include <common/pointset.h>
15#include <stddef.h>
16#include <util/alloc.h>
17
18typedef struct {
21} pair;
22
23static pair *mkPair(pointf p) {
24 pair *pp = gv_alloc(sizeof(pair));
25 pp->id = p;
26 return pp;
27}
28
29static int cmppair(void *k1, void *k2) {
30 const pointf *key1 = k1;
31 const pointf *key2 = k2;
32 if (key1->x > key2->x)
33 return 1;
34 else if (key1->x < key2->x)
35 return -1;
36 else if (key1->y > key2->y)
37 return 1;
38 else if (key1->y < key2->y)
39 return -1;
40 else
41 return 0;
42}
43
44static int cmpmpair(void *k1, void *k2) {
45 const point *key1 = k1;
46 const point *key2 = k2;
47 if (key1->x > key2->x)
48 return 1;
49 else if (key1->x < key2->x)
50 return -1;
51 else if (key1->y > key2->y)
52 return 1;
53 else if (key1->y < key2->y)
54 return -1;
55 else
56 return 0;
57}
58
60 offsetof(pair, id),
61 sizeof(pointf),
62 offsetof(pair, link),
63 0,
64 free,
65 cmppair,
66};
67
69{
70 return (dtopen(&intPairDisc, Dtoset));
71}
72
74{
75 dtclose(ps);
76}
77
79 pair *pp;
80
81 pp = mkPair(pt);
82 if (dtinsert(ps, pp) != pp)
83 free(pp);
84}
85
86void addPS(PointSet *ps, double x, double y) {
87 const pointf pt = {.x = x, .y = y};
88 pair *pp = mkPair(pt);
89 if (dtinsert(ps, pp) != pp)
90 free(pp);
91}
92
94 pair p;
95 p.id = pt;
96 return dtsearch(ps, &p) ? 1 : 0;
97}
98
99int isInPS(PointSet *ps, double x, double y) {
100 return inPS(ps, (pointf){.x = x, .y = y});
101}
102
104{
105 return dtsize(ps);
106}
107
109 const size_t n = (size_t)dtsize(ps);
110 pointf *pts = gv_calloc(n, sizeof(pointf));
111 pair *p;
112 pointf *pp = pts;
113
114 for (p = (pair *) dtflatten(ps); p;
115 p = (pair *)dtlink(ps, p)) {
116 *pp++ = p->id;
117 }
118
119 return pts;
120}
121
122typedef struct {
125 int v;
126} mpair;
127
128static void *mkMPair(void *p, Dtdisc_t *disc) {
129 (void)disc;
130 mpair *obj = p;
131 mpair *ap = gv_alloc(sizeof(mpair));
132 ap->id = obj->id;
133 ap->v = obj->v;
134 return ap;
135}
136
138 offsetof(mpair, id),
139 sizeof(point),
140 offsetof(mpair, link),
141 mkMPair,
142 free,
143 cmpmpair,
144};
145
147{
148 return dtopen(&intMPairDisc, Dtoset);
149}
150
152{
153 dtclear(ps);
154}
155
157{
158 dtclose(ps);
159}
160
161int insertPM(PointMap * pm, int x, int y, int value)
162{
163 mpair *p;
164 mpair dummy;
165
166 dummy.id.x = x;
167 dummy.id.y = y;
168 dummy.v = value;
169 p = dtinsert(pm, &dummy);
170 return p->v;
171}
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:10
#define dtclear(d)
Definition cdt.h:188
#define dtsearch(d, o)
Definition cdt.h:183
CDT_API int dtsize(Dt_t *)
Definition dtsize.c:12
#define dtlink(d, e)
Definition cdt.h:175
#define dtinsert(d, o)
Definition cdt.h:185
CDT_API int dtclose(Dt_t *)
Definition dtclose.c:8
CDT_API Dtmethod_t * Dtoset
ordered set (self-adjusting tree)
Definition dttree.c:304
CDT_API Dt_t * dtopen(Dtdisc_t *, Dtmethod_t *)
Definition dtopen.c:9
static Dtdisc_t disc
Definition exparse.y:207
struct pointf_s pointf
void free(void *)
static int * ps
Definition lu.c:51
std::unordered_map< std::pair< int, int >, int, PointHash > PointMap
void addPS(PointSet *ps, double x, double y)
Definition pointset.c:86
static pair * mkPair(pointf p)
Definition pointset.c:23
static int cmpmpair(void *k1, void *k2)
Definition pointset.c:44
static Dtdisc_t intMPairDisc
Definition pointset.c:137
void insertPS(PointSet *ps, pointf pt)
Definition pointset.c:78
static void * mkMPair(void *p, Dtdisc_t *disc)
Definition pointset.c:128
PointSet * newPS(void)
Definition pointset.c:68
static Dtdisc_t intPairDisc
Definition pointset.c:59
void clearPM(PointMap *ps)
Definition pointset.c:151
int insertPM(PointMap *pm, int x, int y, int value)
Definition pointset.c:161
void freePS(PointSet *ps)
Definition pointset.c:73
int isInPS(PointSet *ps, double x, double y)
Definition pointset.c:99
pointf * pointsOf(PointSet *ps)
Definition pointset.c:108
PointMap * newPM(void)
Definition pointset.c:146
static int cmppair(void *k1, void *k2)
Definition pointset.c:29
int sizeOf(PointSet *ps)
Definition pointset.c:103
int inPS(PointSet *ps, pointf pt)
Definition pointset.c:93
void freePM(PointMap *ps)
Definition pointset.c:156
point containers PointSet and PointMap
Definition cdt.h:100
int v
Definition pointset.c:125
Dtlink_t link
Definition pointset.c:123
point id
Definition pointset.c:124
pointf id
Definition pointset.c:20
Dtlink_t link
Definition pointset.c:19
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