Allow implicit conversion from Ref<T> to T&
[WebKit-https.git] / Source / WebCore / dom / ChildNodeList.h
index 646289d..7e923ee 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
- * Copyright (C) 2004, 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2007, 2013 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #ifndef ChildNodeList_h
 #define ChildNodeList_h
 
-#include "DynamicNodeList.h"
-#include <wtf/PassRefPtr.h>
+#include "CollectionIndexCache.h"
+#include "NodeList.h"
+#include <wtf/Ref.h>
+#include <wtf/RefPtr.h>
 
 namespace WebCore {
 
-    class ChildNodeList : public DynamicNodeList {
-    public:
-        static PassRefPtr<ChildNodeList> create(PassRefPtr<Node> rootNode)
-        {
-            return adoptRef(new ChildNodeList(rootNode));
-        }
+class ContainerNode;
 
-        virtual ~ChildNodeList();
+class EmptyNodeList final : public NodeList {
+public:
+    static PassRef<EmptyNodeList> create(Node& owner)
+    {
+        return adoptRef(*new EmptyNodeList(owner));
+    }
+    virtual ~EmptyNodeList();
 
-    protected:
-        explicit ChildNodeList(PassRefPtr<Node> rootNode);
+    Node& ownerNode() { return m_owner; }
 
-        virtual bool nodeMatches(Element*) const;
-    };
+private:
+    explicit EmptyNodeList(Node& owner) : m_owner(owner) { }
+
+    virtual unsigned length() const override { return 0; }
+    virtual Node* item(unsigned) const override { return nullptr; }
+    virtual Node* namedItem(const AtomicString&) const override { return nullptr; }
+    virtual size_t memoryCost() const override { return 0; }
+
+    virtual bool isEmptyNodeList() const override { return true; }
+
+    Ref<Node> m_owner;
+};
+
+class ChildNodeList final : public NodeList {
+public:
+    static PassRef<ChildNodeList> create(ContainerNode& parent)
+    {
+        return adoptRef(*new ChildNodeList(parent));
+    }
+
+    virtual ~ChildNodeList();
+
+    ContainerNode& ownerNode() { return m_parent; }
+
+    void invalidateCache();
+
+    // For CollectionIndexCache
+    Node* collectionBegin() const;
+    Node* collectionLast() const;
+    Node* collectionEnd() const { return nullptr; }
+    void collectionTraverseForward(Node*&, unsigned count, unsigned& traversedCount) const;
+    void collectionTraverseBackward(Node*&, unsigned count) const;
+    bool collectionCanTraverseBackward() const { return true; }
+    void willValidateIndexCache() const { }
+
+private:
+    explicit ChildNodeList(ContainerNode& parent);
+
+    virtual unsigned length() const override;
+    virtual Node* item(unsigned index) const override;
+    virtual Node* namedItem(const AtomicString&) const override;
+    virtual size_t memoryCost() const override { return m_indexCache.memoryCost(); }
+
+    virtual bool isChildNodeList() const override { return true; }
+
+    Ref<ContainerNode> m_parent;
+    mutable CollectionIndexCache<ChildNodeList, Node*> m_indexCache;
+};
 
 } // namespace WebCore