Skip to content

Commit c3e4ca5

Browse files
authored
Merge pull request #2769 from mgreter/feature/improve-compare-operators
improve compare operators (merging in good faith that appveyor CI will come back green too).
2 parents 7141c01 + 41e0775 commit c3e4ca5

16 files changed

+817
-352
lines changed

src/ast.hpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ namespace Sass {
131131
//////////////////////////////////////////////////////////////////////
132132
class Expression : public AST_Node {
133133
public:
134-
enum Concrete_Type {
134+
enum Type {
135135
NONE,
136136
BOOLEAN,
137137
NUMBER,
@@ -148,21 +148,15 @@ namespace Sass {
148148
VARIABLE,
149149
NUM_TYPES
150150
};
151-
enum Simple_Type {
152-
SIMPLE,
153-
ATTR_SEL,
154-
PSEUDO_SEL,
155-
WRAPPED_SEL,
156-
};
157151
private:
158152
// expressions in some contexts shouldn't be evaluated
159153
ADD_PROPERTY(bool, is_delayed)
160154
ADD_PROPERTY(bool, is_expanded)
161155
ADD_PROPERTY(bool, is_interpolant)
162-
ADD_PROPERTY(Concrete_Type, concrete_type)
156+
ADD_PROPERTY(Type, concrete_type)
163157
public:
164158
Expression(ParserState pstate,
165-
bool d = false, bool e = false, bool i = false, Concrete_Type ct = NONE)
159+
bool d = false, bool e = false, bool i = false, Type ct = NONE)
166160
: AST_Node(pstate),
167161
is_delayed_(d),
168162
is_expanded_(e),
@@ -183,7 +177,10 @@ namespace Sass {
183177
static std::string type_name() { return ""; }
184178
virtual bool is_false() { return false; }
185179
// virtual bool is_true() { return !is_false(); }
180+
virtual bool operator< (const Expression& rhs) const { return false; }
186181
virtual bool operator== (const Expression& rhs) const { return false; }
182+
inline bool operator>(const Expression& rhs) const { return rhs < *this; }
183+
inline bool operator!=(const Expression& rhs) const { return !(rhs == *this); }
187184
virtual bool eq(const Expression& rhs) const { return *this == rhs; };
188185
virtual void set_delayed(bool delayed) { is_delayed(delayed); }
189186
virtual bool has_interpolant() const { return is_interpolant(); }
@@ -244,6 +241,7 @@ namespace Sass {
244241
T& operator[](size_t i) { return elements_[i]; }
245242
virtual const T& at(size_t i) const { return elements_.at(i); }
246243
virtual T& at(size_t i) { return elements_.at(i); }
244+
const T& get(size_t i) const { return elements_[i]; }
247245
const T& operator[](size_t i) const { return elements_[i]; }
248246
virtual void append(T element)
249247
{
@@ -361,7 +359,7 @@ namespace Sass {
361359
/////////////////////////////////////////////////////////////////////////
362360
class Statement : public AST_Node {
363361
public:
364-
enum Statement_Type {
362+
enum Type {
365363
NONE,
366364
RULESET,
367365
MEDIA,
@@ -387,11 +385,11 @@ namespace Sass {
387385
IF
388386
};
389387
private:
390-
ADD_PROPERTY(Statement_Type, statement_type)
388+
ADD_PROPERTY(Type, statement_type)
391389
ADD_PROPERTY(size_t, tabs)
392390
ADD_PROPERTY(bool, group_end)
393391
public:
394-
Statement(ParserState pstate, Statement_Type st = NONE, size_t t = 0)
392+
Statement(ParserState pstate, Type st = NONE, size_t t = 0)
395393
: AST_Node(pstate), statement_type_(st), tabs_(t), group_end_(false)
396394
{ }
397395
Statement(const Statement* ptr)

src/ast_fwd_decl.hpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,9 @@ namespace Sass {
239239
class Placeholder_Selector;
240240
typedef Placeholder_Selector* Placeholder_Selector_Ptr;
241241
typedef Placeholder_Selector const* Placeholder_Selector_Ptr_Const;
242-
class Element_Selector;
243-
typedef Element_Selector* Element_Selector_Ptr;
244-
typedef Element_Selector const* Element_Selector_Ptr_Const;
242+
class Type_Selector;
243+
typedef Type_Selector* Type_Selector_Ptr;
244+
typedef Type_Selector const* Type_Selector_Ptr_Const;
245245
class Class_Selector;
246246
typedef Class_Selector* Class_Selector_Ptr;
247247
typedef Class_Selector const* Class_Selector_Ptr_Const;
@@ -345,7 +345,7 @@ namespace Sass {
345345
IMPL_MEM_OBJ(Selector_Schema);
346346
IMPL_MEM_OBJ(Simple_Selector);
347347
IMPL_MEM_OBJ(Placeholder_Selector);
348-
IMPL_MEM_OBJ(Element_Selector);
348+
IMPL_MEM_OBJ(Type_Selector);
349349
IMPL_MEM_OBJ(Class_Selector);
350350
IMPL_MEM_OBJ(Id_Selector);
351351
IMPL_MEM_OBJ(Attribute_Selector);
@@ -365,21 +365,29 @@ namespace Sass {
365365
return ex.isNull() ? 0 : ex->hash();
366366
}
367367
};
368+
template <class T>
369+
bool OrderFunction(const T& lhs, const T& rhs) {
370+
return !lhs.isNull() && !rhs.isNull() && *lhs < *rhs;
371+
};
368372
struct OrderNodes {
369373
template <class T>
370374
bool operator() (const T& lhs, const T& rhs) const {
371-
return !lhs.isNull() && !rhs.isNull() && *lhs < *rhs;
375+
return OrderFunction<T>(lhs, rhs);
372376
}
373377
};
374-
struct CompareNodes {
375-
template <class T>
376-
bool operator() (const T& lhs, const T& rhs) const {
378+
template <class T>
379+
bool CompareFunction(const T& lhs, const T& rhs) {
377380
// code around sass logic issue. 1px == 1 is true
378381
// but both items are still different keys in maps
379382
if (dynamic_cast<Number*>(lhs.ptr()))
380383
if (dynamic_cast<Number*>(rhs.ptr()))
381384
return lhs->hash() == rhs->hash();
382385
return !lhs.isNull() && !rhs.isNull() && *lhs == *rhs;
386+
}
387+
struct CompareNodes {
388+
template <class T>
389+
bool operator() (const T& lhs, const T& rhs) const {
390+
return CompareFunction<T>(lhs, rhs);
383391
}
384392
};
385393

@@ -423,6 +431,9 @@ namespace Sass {
423431
typedef std::pair<Complex_Selector_Obj, SubSetMapPairs> SubSetMapResult;
424432
typedef std::vector<SubSetMapResult> SubSetMapResults;
425433

434+
#define OrderSelectors OrderFunction<Selector_Obj>
435+
typedef std::set<Selector_Obj, OrderNodes> SelectorSet;
436+
426437
typedef std::deque<Complex_Selector_Obj> ComplexSelectorDeque;
427438
typedef std::set<Simple_Selector_Obj, OrderNodes> SimpleSelectorSet;
428439
typedef std::set<Complex_Selector_Obj, OrderNodes> ComplexSelectorSet;

0 commit comments

Comments
 (0)