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
5template <class T>
6class 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)\
39protected:\
40 type name##_;\
41public:\
42 type name() const { return name##_; }\
43 type name(type name##__) { return name##_ = name##__; }\
44private:
45
46#define HASH_PROPERTY(type, name)\
47protected:\
48 type name##_;\
49public:\
50 type name() const { return name##_; }\
51 type name(type name##__) { hash_ = 0; return name##_ = name##__; }\
52private:
53
54#define ADD_CONSTREF(type, name) \
55protected: \
56 type name##_; \
57public: \
58 const type& name() const { return name##_; } \
59 void name(type name##__) { name##_ = name##__; } \
60private:
61
62#define HASH_CONSTREF(type, name) \
63protected: \
64 type name##_; \
65public: \
66 const type& name() const { return name##_; } \
67 void name(type name##__) { hash_ = 0; name##_ = name##__; } \
68private:
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

source code of gtk/subprojects/libsass/src/ast_def_macros.hpp