ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
stack.h
Go to the documentation of this file.
1#ifndef _stack_h_INCLUDED
2#define _stack_h_INCLUDED
3
4#include "global.h"
5
6#include <stdlib.h>
7
9
10#define STACK(TYPE) \
11 struct { \
12 TYPE *begin; \
13 TYPE *end; \
14 TYPE *allocated; \
15 }
16
17#define FULL_STACK(S) ((S).end == (S).allocated)
18#define EMPTY_STACK(S) ((S).begin == (S).end)
19#define SIZE_STACK(S) ((size_t) ((S).end - (S).begin))
20#define CAPACITY_STACK(S) ((size_t) ((S).allocated - (S).begin))
21
22#define INIT_STACK(S) \
23 do { \
24 (S).begin = (S).end = (S).allocated = 0; \
25 } while (0)
26
27#define TOP_STACK(S) (END_STACK (S)[CADICAL_assert (!EMPTY_STACK (S)), -1])
28
29#define PEEK_STACK(S, N) \
30 (BEGIN_STACK (S)[CADICAL_assert ((N) < SIZE_STACK (S)), (N)])
31
32#define POKE_STACK(S, N, E) \
33 do { \
34 PEEK_STACK (S, N) = (E); \
35 } while (0)
36
37#define POP_STACK(S) (CADICAL_assert (!EMPTY_STACK (S)), *--(S).end)
38
39#define PUSH_STACK(S, E) \
40 do { \
41 if (FULL_STACK (S)) \
42 ENLARGE_STACK (S); \
43 *(S).end++ = (E); \
44 } while (0)
45
46#define BEGIN_STACK(S) (S).begin
47
48#define END_STACK(S) (S).end
49
50#define CLEAR_STACK(S) \
51 do { \
52 (S).end = (S).begin; \
53 } while (0)
54
55#define RESIZE_STACK(S, NEW_SIZE) \
56 do { \
57 const size_t TMP_NEW_SIZE = (NEW_SIZE); \
58 CADICAL_assert (TMP_NEW_SIZE <= SIZE_STACK (S)); \
59 (S).end = (S).begin + TMP_NEW_SIZE; \
60 } while (0)
61
62#define SET_END_OF_STACK(S, P) \
63 do { \
64 CADICAL_assert (BEGIN_STACK (S) <= (P)); \
65 CADICAL_assert ((P) <= END_STACK (S)); \
66 if ((P) == END_STACK (S)) \
67 break; \
68 (S).end = (P); \
69 } while (0)
70
71#define RELEASE_STACK(S) \
72 do { \
73 DEALLOC ((S).begin, CAPACITY_STACK (S)); \
74 INIT_STACK (S); \
75 } while (0)
76
77#define REMOVE_STACK(T, S, E) \
78 do { \
79 CADICAL_assert (!EMPTY_STACK (S)); \
80 T *END_REMOVE_STACK = END_STACK (S); \
81 T *P_REMOVE_STACK = BEGIN_STACK (S); \
82 while (*P_REMOVE_STACK != (E)) { \
83 P_REMOVE_STACK++; \
84 CADICAL_assert (P_REMOVE_STACK != END_REMOVE_STACK); \
85 } \
86 P_REMOVE_STACK++; \
87 while (P_REMOVE_STACK != END_REMOVE_STACK) { \
88 P_REMOVE_STACK[-1] = *P_REMOVE_STACK; \
89 P_REMOVE_STACK++; \
90 } \
91 (S).end--; \
92 } while (0)
93
94#define all_stack(T, E, S) \
95 T E, *E##_PTR = BEGIN_STACK (S), *const E##_END = END_STACK (S); \
96 E##_PTR != E##_END && (E = *E##_PTR, true); \
97 ++E##_PTR
98
99#define all_pointers(T, E, S) \
100 T *E, *const *E##_PTR = BEGIN_STACK (S), \
101 *const *const E##_END = END_STACK (S); \
102 E##_PTR != E##_END && (E = *E##_PTR, true); \
103 ++E##_PTR
104
105// clang-format off
106
107typedef STACK (char) chars;
108typedef STACK (int) ints;
109typedef STACK (size_t) sizes;
110typedef STACK (unsigned) unsigneds;
111
112// clang-format on
113
115
116#endif
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define STACK(TYPE)
Definition stack.h:10