#include "core/css/RuleSet.h"
#include "core/css/SelectorChecker.h"
+#include "platform/heap/Handle.h"
#include "wtf/RefPtr.h"
#include "wtf/Vector.h"
-namespace WebCore {
+namespace blink {
class StylePropertySet;
-class StyleRule;
-class RuleRange {
-public:
- RuleRange() : m_firstRuleIndex(-1), m_lastRuleIndex(-1) { }
- RuleRange(int firstRuleIndex, int lastRuleIndex) : m_firstRuleIndex(firstRuleIndex), m_lastRuleIndex(lastRuleIndex) { }
-
- int first() const { return m_firstRuleIndex; }
- int last() const { return m_lastRuleIndex; }
-
- bool collapsed() const { return m_firstRuleIndex == -1; }
-
- void setLast(int position) { m_lastRuleIndex = position; }
-
- void shiftLast(int position)
- {
- m_lastRuleIndex = position;
- if (m_firstRuleIndex == -1)
- m_firstRuleIndex = position;
- }
-
- void shiftLastByOne()
- {
- ++m_lastRuleIndex;
- if (m_firstRuleIndex == -1)
- m_firstRuleIndex = m_lastRuleIndex;
- }
-
-private:
- int m_firstRuleIndex;
- int m_lastRuleIndex;
+struct RuleRange {
+ RuleRange(int& firstRuleIndex, int& lastRuleIndex): firstRuleIndex(firstRuleIndex), lastRuleIndex(lastRuleIndex) { }
+ int& firstRuleIndex;
+ int& lastRuleIndex;
};
-inline bool operator==(const RuleRange& a, const RuleRange& b)
-{
- return a.first() == b.first() && a.last() == b.last();
-}
-
-class MatchRanges {
-public:
- MatchRanges() { }
-
- RuleRange& UARuleRange() { return m_uaRuleRange; }
- RuleRange& authorRuleRange() { return m_authorRuleRange; }
- RuleRange& userRuleRange() { return m_userRuleRange; }
-
- const RuleRange& UARuleRange() const { return m_uaRuleRange; }
- const RuleRange& authorRuleRange() const { return m_authorRuleRange; }
- const RuleRange& userRuleRange() const { return m_userRuleRange; }
-
-private:
- RuleRange m_uaRuleRange;
- RuleRange m_authorRuleRange;
- RuleRange m_userRuleRange;
+struct MatchRanges {
+ MatchRanges() : firstUARule(-1), lastUARule(-1), firstAuthorRule(-1), lastAuthorRule(-1) { }
+ int firstUARule;
+ int lastUARule;
+ int firstAuthorRule;
+ int lastAuthorRule;
+ RuleRange UARuleRange() { return RuleRange(firstUARule, lastUARule); }
+ RuleRange authorRuleRange() { return RuleRange(firstAuthorRule, lastAuthorRule); }
};
struct MatchedProperties {
+ ALLOW_ONLY_INLINE_ALLOCATION();
+public:
MatchedProperties();
~MatchedProperties();
- RefPtr<StylePropertySet> properties;
+ void trace(Visitor*);
+
+ RefPtrWillBeMember<StylePropertySet> properties;
+
union {
struct {
unsigned linkMatchType : 2;
unsigned whitelistType : 2;
- };
+ } m_types;
// Used to make sure all memory is zero-initialized since we compute the hash over the bytes of this object.
void* possiblyPaddedMember;
};
};
+} // namespace blink
+
+WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::MatchedProperties);
+
+namespace blink {
+
class MatchResult {
STACK_ALLOCATED();
public:
MatchResult() : isCacheable(true) { }
- Vector<MatchedProperties, 64> matchedProperties;
- WillBeHeapVector<RawPtrWillBeMember<StyleRule>, 64> matchedRules;
+ WillBeHeapVector<MatchedProperties, 64> matchedProperties;
MatchRanges ranges;
bool isCacheable;
- void addMatchedProperties(const StylePropertySet* properties, StyleRule* = 0, unsigned linkMatchType = SelectorChecker::MatchAll, PropertyWhitelistType = PropertyWhitelistNone);
+ void addMatchedProperties(const StylePropertySet* properties, unsigned linkMatchType = SelectorChecker::MatchAll, PropertyWhitelistType = PropertyWhitelistNone);
};
inline bool operator==(const MatchRanges& a, const MatchRanges& b)
{
- return a.UARuleRange() == b.UARuleRange() && a.authorRuleRange() == b.authorRuleRange() && a.userRuleRange() == b.userRuleRange();
+ return a.firstUARule == b.firstUARule
+ && a.lastUARule == b.lastUARule
+ && a.firstAuthorRule == b.firstAuthorRule
+ && a.lastAuthorRule == b.lastAuthorRule;
}
inline bool operator!=(const MatchRanges& a, const MatchRanges& b)
inline bool operator==(const MatchedProperties& a, const MatchedProperties& b)
{
- return a.properties == b.properties && a.linkMatchType == b.linkMatchType;
+ return a.properties == b.properties && a.m_types.linkMatchType == b.m_types.linkMatchType;
}
inline bool operator!=(const MatchedProperties& a, const MatchedProperties& b)
return !(a == b);
}
-} // namespace WebCore
+} // namespace blink
#endif // MatchResult_h