38#define RW_SWAP(Type, a, b) \
52#define Vi_ForEachEntry(v, entry, i) for (i = 0; (i < (v)->size) && (((entry) = Vi_Read((v), i)), 1); i++)
53#define Vi_ForEachEntryReverse(v, entry, i) for (i = (v)->size - 1; (i >= 0) && (((entry) = Vi_Read((v), i)), 1); i--)
54#define Vi_ForEachEntryStart(v, entry, i, start) for (i = start; (i < (v)->size) && (((entry) = Vi_Read((v), i)), 1); i++)
55#define Vi_ForEachEntryStop(v, entry, i, stop) for (i = 0; (i < stop) && (((entry) = Vi_Read((v), i)), 1); i++)
57static inline void Vi_Start(
vi *v,
int cap) {
60 v->
ptr = (
int *)
malloc(
sizeof(
int) * cap);
63static inline vi *Vi_Alloc(
int cap) {
69static inline void Vi_Stop(
vi *v) {
73static inline void Vi_Free(
vi *v) {
78static inline int Vi_Size(
vi *v) {
82static inline int Vi_Space(
vi *v) {
86static inline int *Vi_Array(
vi *v) {
90static inline int Vi_Read(
vi *v,
int k) {
95static inline void Vi_Write(
vi *v,
int k,
int e) {
100static inline void Vi_Shrink(
vi *v,
int k) {
105static inline int Vi_Pop(
vi *v) {
110static inline void Vi_Grow(
vi *v) {
113 int newcap = (v->
cap < 4) ? 8 : (v->cap / 2) * 3;
115 if (v->
ptr == NULL) {
116 printf(
"Failed to realloc memory from %.1f MB to %.1f MB.\n", 4.0 * v->cap / (1 << 20), (float)4.0 * newcap / (1 << 20));
122static inline vi *Vi_Dup(
vi *v) {
123 vi *pNew = Vi_Alloc(v->
size);
129static inline void Vi_Push(
vi *v,
int e) {
134static inline void Vi_PushTwo(
vi *v,
int e1,
int e2) {
139static inline void Vi_PushArray(
vi *v,
int *
p,
int n) {
140 for (
int i = 0; i < n; i++)
144static inline void Vi_PushOrder(
vi *v,
int e) {
147 for (
int i = v->
size - 2; i >= 0; i--) {
148 if (v->
ptr[i] > v->
ptr[i + 1]) {
156static inline void Vi_Fill(
vi *v,
int n,
int fill) {
159 for (i = 0; i < n; i++)
163static inline int Vi_Drop(
vi *v,
int i) {
164 assert(i >= 0 && i < v->size);
165 int Entry = v->
ptr[i];
166 for (; i < v->
size - 1; i++)
167 v->
ptr[i] = v->
ptr[i + 1];
168 Vi_Shrink(v, v->
size - 1);
172static inline int Vi_Find(
vi *v,
int e) {
174 for (j = 0; j < v->
size; j++)
180static inline int Vi_Remove(
vi *v,
int e) {
181 int j = Vi_Find(v, e);
188static inline void Vi_Randomize(
vi *v) {
189 for (
int i = 0; i < v->
size; i++) {
195static inline void Vi_Reverse(
vi *v) {
197 for (i = 0, j = v->
size - 1; i < j; i++, j--)
201static inline void Vi_Print(
vi *v) {
202 printf(
"Array with %d entries:", v->
size);
205 printf(
" %d", entry);
209static inline void Vi_SelectSort(
vi *v) {
210 int *pArray = Vi_Array(v);
211 int nSize = Vi_Size(v);
212 int temp, i, j, best_i;
213 for (i = 0; i < nSize - 1; i++) {
215 for (j = i + 1; j < nSize; j++)
216 if (pArray[j] < pArray[best_i])
219 pArray[i] = pArray[best_i];
220 pArray[best_i] = temp;
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
unsigned Random_Num(int Seed)
#define RW_SWAP(Type, a, b)
#define Vi_ForEachEntry(v, entry, i)