Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / resolver / MatchResult.h
index a3e5374..ece7efd 100644 (file)
 
 #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)
@@ -126,7 +101,7 @@ 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)
@@ -134,6 +109,6 @@ inline bool operator!=(const MatchedProperties& a, const MatchedProperties& b)
     return !(a == b);
 }
 
-} // namespace WebCore
+} // namespace blink
 
 #endif // MatchResult_h