| Index: Source/core/html/CollectionIndexCache.h
|
| diff --git a/Source/core/html/CollectionIndexCache.h b/Source/core/html/CollectionIndexCache.h
|
| index efd4aa9475d1f18ca1bfe8d2aea0d0b9df8a2465..b2aa72bb5fbdae2483fe4cbf27910b6a0fdd88b0 100644
|
| --- a/Source/core/html/CollectionIndexCache.h
|
| +++ b/Source/core/html/CollectionIndexCache.h
|
| @@ -36,7 +36,7 @@
|
|
|
| namespace WebCore {
|
|
|
| -template <typename Collection>
|
| +template <typename Collection, typename NodeType>
|
| class CollectionIndexCache {
|
| public:
|
| CollectionIndexCache();
|
| @@ -59,11 +59,11 @@ public:
|
| }
|
|
|
| unsigned nodeCount(const Collection&);
|
| - Node* nodeAt(const Collection&, unsigned index);
|
| + NodeType* nodeAt(const Collection&, unsigned index);
|
|
|
| void invalidate();
|
|
|
| - ALWAYS_INLINE void setCachedNode(Node* node, unsigned index)
|
| + ALWAYS_INLINE void setCachedNode(NodeType* node, unsigned index)
|
| {
|
| ASSERT(node);
|
| m_currentNode = node;
|
| @@ -71,11 +71,11 @@ public:
|
| }
|
|
|
| private:
|
| - Node* nodeBeforeOrAfterCachedNode(const Collection&, unsigned index, const ContainerNode& root);
|
| + NodeType* nodeBeforeOrAfterCachedNode(const Collection&, unsigned index, const ContainerNode& root);
|
| bool isLastNodeCloserThanLastOrCachedNode(unsigned index) const;
|
| bool isFirstNodeCloserThanCachedNode(unsigned index) const;
|
|
|
| - ALWAYS_INLINE Node* cachedNode() const { return m_currentNode; }
|
| + ALWAYS_INLINE NodeType* cachedNode() const { return m_currentNode; }
|
| ALWAYS_INLINE unsigned cachedNodeIndex() const { ASSERT(cachedNode()); return m_cachedNodeIndex; }
|
|
|
| ALWAYS_INLINE bool isCachedNodeCountValid() const { return m_isLengthCacheValid; }
|
| @@ -86,14 +86,14 @@ private:
|
| m_isLengthCacheValid = true;
|
| }
|
|
|
| - Node* m_currentNode;
|
| + NodeType* m_currentNode;
|
| unsigned m_cachedNodeCount;
|
| unsigned m_cachedNodeIndex;
|
| unsigned m_isLengthCacheValid : 1;
|
| };
|
|
|
| -template <typename Collection>
|
| -CollectionIndexCache<Collection>::CollectionIndexCache()
|
| +template <typename Collection, typename NodeType>
|
| +CollectionIndexCache<Collection, NodeType>::CollectionIndexCache()
|
| : m_currentNode(0)
|
| , m_cachedNodeCount(0)
|
| , m_cachedNodeIndex(0)
|
| @@ -101,15 +101,15 @@ CollectionIndexCache<Collection>::CollectionIndexCache()
|
| {
|
| }
|
|
|
| -template <typename Collection>
|
| -void CollectionIndexCache<Collection>::invalidate()
|
| +template <typename Collection, typename NodeType>
|
| +void CollectionIndexCache<Collection, NodeType>::invalidate()
|
| {
|
| m_currentNode = 0;
|
| m_isLengthCacheValid = false;
|
| }
|
|
|
| -template <typename Collection>
|
| -inline unsigned CollectionIndexCache<Collection>::nodeCount(const Collection& collection)
|
| +template <typename Collection, typename NodeType>
|
| +inline unsigned CollectionIndexCache<Collection, NodeType>::nodeCount(const Collection& collection)
|
| {
|
| if (isCachedNodeCountValid())
|
| return cachedNodeCount();
|
| @@ -120,8 +120,8 @@ inline unsigned CollectionIndexCache<Collection>::nodeCount(const Collection& co
|
| return cachedNodeCount();
|
| }
|
|
|
| -template <typename Collection>
|
| -inline Node* CollectionIndexCache<Collection>::nodeAt(const Collection& collection, unsigned index)
|
| +template <typename Collection, typename NodeType>
|
| +inline NodeType* CollectionIndexCache<Collection, NodeType>::nodeAt(const Collection& collection, unsigned index)
|
| {
|
| if (cachedNode() && cachedNodeIndex() == index)
|
| return cachedNode();
|
| @@ -131,11 +131,11 @@ inline Node* CollectionIndexCache<Collection>::nodeAt(const Collection& collecti
|
|
|
| ContainerNode& root = collection.rootNode();
|
| if (isCachedNodeCountValid() && collection.canTraverseBackward() && isLastNodeCloserThanLastOrCachedNode(index)) {
|
| - Node* lastNode = collection.itemBefore(0);
|
| + NodeType* lastNode = collection.itemBefore(0);
|
| ASSERT(lastNode);
|
| setCachedNode(lastNode, cachedNodeCount() - 1);
|
| } else if (!cachedNode() || isFirstNodeCloserThanCachedNode(index) || (!collection.canTraverseBackward() && index < cachedNodeIndex())) {
|
| - Node* firstNode = collection.traverseToFirstElement(root);
|
| + NodeType* firstNode = collection.traverseToFirstElement(root);
|
| if (!firstNode) {
|
| setCachedNodeCount(0);
|
| return 0;
|
| @@ -150,11 +150,11 @@ inline Node* CollectionIndexCache<Collection>::nodeAt(const Collection& collecti
|
| return nodeBeforeOrAfterCachedNode(collection, index, root);
|
| }
|
|
|
| -template <typename Collection>
|
| -inline Node* CollectionIndexCache<Collection>::nodeBeforeOrAfterCachedNode(const Collection& collection, unsigned index, const ContainerNode &root)
|
| +template <typename Collection, typename NodeType>
|
| +inline NodeType* CollectionIndexCache<Collection, NodeType>::nodeBeforeOrAfterCachedNode(const Collection& collection, unsigned index, const ContainerNode &root)
|
| {
|
| unsigned currentIndex = cachedNodeIndex();
|
| - Node* currentNode = cachedNode();
|
| + NodeType* currentNode = cachedNode();
|
| ASSERT(currentNode);
|
| ASSERT(currentIndex != index);
|
|
|
| @@ -182,8 +182,8 @@ inline Node* CollectionIndexCache<Collection>::nodeBeforeOrAfterCachedNode(const
|
| return currentNode;
|
| }
|
|
|
| -template <typename Collection>
|
| -ALWAYS_INLINE bool CollectionIndexCache<Collection>::isLastNodeCloserThanLastOrCachedNode(unsigned index) const
|
| +template <typename Collection, typename NodeType>
|
| +ALWAYS_INLINE bool CollectionIndexCache<Collection, NodeType>::isLastNodeCloserThanLastOrCachedNode(unsigned index) const
|
| {
|
| ASSERT(isCachedNodeCountValid());
|
| unsigned distanceFromLastNode = cachedNodeCount() - index;
|
| @@ -193,8 +193,8 @@ ALWAYS_INLINE bool CollectionIndexCache<Collection>::isLastNodeCloserThanLastOrC
|
| return cachedNodeIndex() < index && distanceFromLastNode < index - cachedNodeIndex();
|
| }
|
|
|
| -template <typename Collection>
|
| -ALWAYS_INLINE bool CollectionIndexCache<Collection>::isFirstNodeCloserThanCachedNode(unsigned index) const
|
| +template <typename Collection, typename NodeType>
|
| +ALWAYS_INLINE bool CollectionIndexCache<Collection, NodeType>::isFirstNodeCloserThanCachedNode(unsigned index) const
|
| {
|
| if (cachedNodeIndex() < index)
|
| return false;
|
|
|