ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
vec_int.h
Go to the documentation of this file.
1//===--- vec_int.h ----------------------------------------------------------===
2//
3// satoko: Satisfiability solver
4//
5// This file is distributed under the BSD 2-Clause License.
6// See LICENSE for details.
7//
8//===------------------------------------------------------------------------===
9#ifndef satoko__utils__vec__vec_int_h
10#define satoko__utils__vec__vec_int_h
11
12#include <assert.h>
13#include <stdio.h>
14#include <string.h>
15
16#include "../mem.h"
17
20
21typedef struct vec_int_t_ vec_int_t;
22struct vec_int_t_ {
23 unsigned cap;
24 unsigned size;
25 int *data;
26};
27
28//===------------------------------------------------------------------------===
29// Vector Macros
30//===------------------------------------------------------------------------===
31#define vec_int_foreach(vec, entry, i) \
32 for (i = 0; (i < vec->size) && (((entry) = vec_int_at(vec, i)), 1); i++)
33
34#define vec_int_foreach_start(vec, entry, i, start) \
35 for (i = start; (i < vec_int_size(vec)) && (((entry) = vec_int_at(vec, i)), 1); i++)
36
37#define vec_int_foreach_stop(vec, entry, i, stop) \
38 for (i = 0; (i < stop) && (((entry) = vec_int_at(vec, i)), 1); i++)
39
40//===------------------------------------------------------------------------===
41// Vector API
42//===------------------------------------------------------------------------===
43static inline vec_int_t *vec_int_alloc(unsigned cap)
44{
46
47 if (cap > 0 && cap < 16)
48 cap = 16;
49 p->size = 0;
50 p->cap = cap;
51 p->data = p->cap ? satoko_alloc(int, p->cap) : NULL;
52 return p;
53}
54
55static inline vec_int_t *vec_int_alloc_exact(unsigned cap)
56{
58
59 p->size = 0;
60 p->cap = cap;
61 p->data = p->cap ? satoko_alloc(int, p->cap) : NULL;
62 return p;
63}
64
65static inline vec_int_t *vec_int_init(unsigned size, int value)
66{
68
69 p->cap = size;
70 p->size = size;
71 p->data = p->cap ? satoko_alloc(int, p->cap) : NULL;
72 memset(p->data, value, sizeof(int) * p->size);
73 return p;
74}
75
76static inline void vec_int_free(vec_int_t *p)
77{
78 if (p->data != NULL)
79 satoko_free(p->data);
81}
82
83static inline unsigned vec_int_size(vec_int_t *p)
84{
85 return p->size;
86}
87
88static inline void vec_int_resize(vec_int_t *p, unsigned new_size)
89{
90 p->size = new_size;
91 if (p->cap >= new_size)
92 return;
93 p->data = satoko_realloc(int, p->data, new_size);
94 assert(p->data != NULL);
95 p->cap = new_size;
96}
97
98static inline void vec_int_reserve(vec_int_t *p, unsigned new_cap)
99{
100 if (p->cap >= new_cap)
101 return;
102 p->data = satoko_realloc(int, p->data, new_cap);
103 assert(p->data != NULL);
104 p->cap = new_cap;
105}
106
107static inline unsigned vec_int_capacity(vec_int_t *p)
108{
109 return p->cap;
110}
111
112static inline int vec_int_empty(vec_int_t *p)
113{
114 return p->size ? 0 : 1;
115}
116
117static inline void vec_int_erase(vec_int_t *p)
118{
119 satoko_free(p->data);
120 p->size = 0;
121 p->cap = 0;
122}
123
124static inline int vec_int_at(vec_int_t *p, unsigned i)
125{
126 assert(i >= 0 && i < p->size);
127 return p->data[i];
128}
129
130static inline int *vec_int_at_ptr(vec_int_t *p, unsigned i)
131{
132 assert(i >= 0 && i < p->size);
133 return p->data + i;
134}
135
136static inline void vec_int_duplicate(vec_int_t *dest, const vec_int_t *src)
137{
138 assert(dest != NULL && src != NULL);
139 vec_int_resize(dest, src->cap);
140 memcpy(dest->data, src->data, sizeof(int) * src->cap);
141 dest->size = src->size;
142}
143
144static inline void vec_int_copy(vec_int_t *dest, const vec_int_t *src)
145{
146 assert(dest != NULL && src != NULL);
147 vec_int_resize(dest, src->size);
148 memcpy(dest->data, src->data, sizeof(int) * src->size);
149 dest->size = src->size;
150}
151
152static inline void vec_int_push_back(vec_int_t *p, int value)
153{
154 if (p->size == p->cap) {
155 if (p->cap < 16)
156 vec_int_reserve(p, 16);
157 else
158 vec_int_reserve(p, 2 * p->cap);
159 }
160 p->data[p->size] = value;
161 p->size++;
162}
163
164static inline void vec_int_assign(vec_int_t *p, unsigned i, int value)
165{
166 assert((i >= 0) && (i < vec_int_size(p)));
167 p->data[i] = value;
168}
169
170static inline void vec_int_insert(vec_int_t *p, unsigned i, int value)
171{
172 assert((i >= 0) && (i < vec_int_size(p)));
173 vec_int_push_back(p, 0);
174 memmove(p->data + i + 1, p->data + i, (p->size - i - 2) * sizeof(int));
175 p->data[i] = value;
176}
177
178static inline void vec_int_drop(vec_int_t *p, unsigned i)
179{
180 assert((i >= 0) && (i < vec_int_size(p)));
181 memmove(p->data + i, p->data + i + 1, (p->size - i - 1) * sizeof(int));
182 p->size -= 1;
183}
184
185static inline void vec_int_clear(vec_int_t *p)
186{
187 p->size = 0;
188}
189
190static inline int vec_int_asc_compare(const void *p1, const void *p2)
191{
192 const int *pp1 = (const int *) p1;
193 const int *pp2 = (const int *) p2;
194
195 if (*pp1 < *pp2)
196 return -1;
197 if (*pp1 > *pp2)
198 return 1;
199 return 0;
200}
201
202static inline int vec_int_desc_compare(const void* p1, const void* p2)
203{
204 const int *pp1 = (const int *) p1;
205 const int *pp2 = (const int *) p2;
206
207 if (*pp1 > *pp2)
208 return -1;
209 if (*pp1 < *pp2)
210 return 1;
211 return 0;
212}
213
214static inline void vec_int_sort(vec_int_t* p, int ascending)
215{
216 if (ascending)
217 qsort((void *) p->data, (size_t)p->size, sizeof(int),
218 (int (*)(const void*, const void*)) vec_int_asc_compare);
219 else
220 qsort((void *) p->data, (size_t)p->size, sizeof(int),
221 (int (*)(const void*, const void*)) vec_int_desc_compare);
222}
223
224static inline long vec_int_memory(vec_int_t *p)
225{
226 return p == NULL ? 0 : sizeof(int) * p->cap + sizeof(vec_int_t);
227}
228
229static inline void vec_int_print(vec_int_t *p)
230{
231 unsigned i;
232 assert(p != NULL);
233 fprintf(stdout, "Vector has %u(%u) entries: {", p->size, p->cap);
234 for (i = 0; i < p->size; i++)
235 fprintf(stdout, " %d", p->data[i]);
236 fprintf(stdout, " }\n");
237}
238
240#endif /* satoko__utils__vec__vec_int_h */
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
ABC_NAMESPACE_IMPL_START typedef signed char value
Cube * p
Definition exorList.c:222
unsigned long long size
Definition giaNewBdd.h:39
#define satoko_free(p)
Definition mem.h:20
#define satoko_realloc(type, ptr, n_elements)
Definition mem.h:19
#define satoko_alloc(type, n_elements)
Definition mem.h:17
unsigned cap
Definition vec_int.h:23
unsigned size
Definition vec_int.h:24
int * data
Definition vec_int.h:25
#define assert(ex)
Definition util_old.h:213
char * memcpy()
char * memset()
char * memmove()
typedefABC_NAMESPACE_HEADER_START struct vec_int_t_ vec_int_t
Definition vec_int.h:21