1 | #ifndef SASS_AST_DEF_MACROS_H |
2 | #define SASS_AST_DEF_MACROS_H |
3 | |
4 | // Helper class to switch a flag and revert once we go out of scope |
5 | template <class T> |
6 | class LocalOption { |
7 | private: |
8 | T* var; // pointer to original variable |
9 | T orig; // copy of the original option |
10 | public: |
11 | LocalOption(T& var) |
12 | { |
13 | this->var = &var; |
14 | this->orig = var; |
15 | } |
16 | LocalOption(T& var, T orig) |
17 | { |
18 | this->var = &var; |
19 | this->orig = var; |
20 | *(this->var) = orig; |
21 | } |
22 | void reset() |
23 | { |
24 | *(this->var) = this->orig; |
25 | } |
26 | ~LocalOption() { |
27 | *(this->var) = this->orig; |
28 | } |
29 | }; |
30 | |
31 | #define LOCAL_FLAG(name,opt) LocalOption<bool> flag_##name(name, opt) |
32 | #define LOCAL_COUNT(name,opt) LocalOption<size_t> cnt_##name(name, opt) |
33 | |
34 | #define NESTING_GUARD(name) \ |
35 | LocalOption<size_t> cnt_##name(name, name + 1); \ |
36 | if (name > MAX_NESTING) throw Exception::NestingLimitError(pstate, traces); \ |
37 | |
38 | #define ADD_PROPERTY(type, name)\ |
39 | protected:\ |
40 | type name##_;\ |
41 | public:\ |
42 | type name() const { return name##_; }\ |
43 | type name(type name##__) { return name##_ = name##__; }\ |
44 | private: |
45 | |
46 | #define HASH_PROPERTY(type, name)\ |
47 | protected:\ |
48 | type name##_;\ |
49 | public:\ |
50 | type name() const { return name##_; }\ |
51 | type name(type name##__) { hash_ = 0; return name##_ = name##__; }\ |
52 | private: |
53 | |
54 | #define ADD_CONSTREF(type, name) \ |
55 | protected: \ |
56 | type name##_; \ |
57 | public: \ |
58 | const type& name() const { return name##_; } \ |
59 | void name(type name##__) { name##_ = name##__; } \ |
60 | private: |
61 | |
62 | #define HASH_CONSTREF(type, name) \ |
63 | protected: \ |
64 | type name##_; \ |
65 | public: \ |
66 | const type& name() const { return name##_; } \ |
67 | void name(type name##__) { hash_ = 0; name##_ = name##__; } \ |
68 | private: |
69 | |
70 | #ifdef DEBUG_SHARED_PTR |
71 | |
72 | #define ATTACH_ABSTRACT_AST_OPERATIONS(klass) \ |
73 | virtual klass* copy(sass::string, size_t) const = 0; \ |
74 | virtual klass* clone(sass::string, size_t) const = 0; \ |
75 | |
76 | #define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \ |
77 | klass(const klass* ptr); \ |
78 | virtual klass* copy(sass::string, size_t) const override = 0; \ |
79 | virtual klass* clone(sass::string, size_t) const override = 0; \ |
80 | |
81 | #define ATTACH_AST_OPERATIONS(klass) \ |
82 | klass(const klass* ptr); \ |
83 | virtual klass* copy(sass::string, size_t) const override; \ |
84 | virtual klass* clone(sass::string, size_t) const override; \ |
85 | |
86 | #else |
87 | |
88 | #define ATTACH_ABSTRACT_AST_OPERATIONS(klass) \ |
89 | virtual klass* copy() const = 0; \ |
90 | virtual klass* clone() const = 0; \ |
91 | |
92 | #define ATTACH_VIRTUAL_AST_OPERATIONS(klass) \ |
93 | klass(const klass* ptr); \ |
94 | virtual klass* copy() const override = 0; \ |
95 | virtual klass* clone() const override = 0; \ |
96 | |
97 | #define ATTACH_AST_OPERATIONS(klass) \ |
98 | klass(const klass* ptr); \ |
99 | virtual klass* copy() const override; \ |
100 | virtual klass* clone() const override; \ |
101 | |
102 | #endif |
103 | |
104 | #define ATTACH_VIRTUAL_CMP_OPERATIONS(klass) \ |
105 | virtual bool operator==(const klass& rhs) const = 0; \ |
106 | virtual bool operator!=(const klass& rhs) const { return !(*this == rhs); }; \ |
107 | |
108 | #define ATTACH_CMP_OPERATIONS(klass) \ |
109 | virtual bool operator==(const klass& rhs) const; \ |
110 | virtual bool operator!=(const klass& rhs) const { return !(*this == rhs); }; \ |
111 | |
112 | #ifdef DEBUG_SHARED_PTR |
113 | |
114 | #define IMPLEMENT_AST_OPERATORS(klass) \ |
115 | klass* klass::copy(sass::string file, size_t line) const { \ |
116 | klass* cpy = SASS_MEMORY_NEW(klass, this); \ |
117 | cpy->trace(file, line); \ |
118 | return cpy; \ |
119 | } \ |
120 | klass* klass::clone(sass::string file, size_t line) const { \ |
121 | klass* cpy = copy(file, line); \ |
122 | cpy->cloneChildren(); \ |
123 | return cpy; \ |
124 | } \ |
125 | |
126 | #else |
127 | |
128 | #define IMPLEMENT_AST_OPERATORS(klass) \ |
129 | klass* klass::copy() const { \ |
130 | return SASS_MEMORY_NEW(klass, this); \ |
131 | } \ |
132 | klass* klass::clone() const { \ |
133 | klass* cpy = copy(); \ |
134 | cpy->cloneChildren(); \ |
135 | return cpy; \ |
136 | } \ |
137 | |
138 | #endif |
139 | |
140 | #endif |
141 | |