DocumentOrderedMap.h [plain text]
#ifndef DocumentOrderedMap_h
#define DocumentOrderedMap_h
#include <wtf/HashCountedSet.h>
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
#include <wtf/text/AtomicStringImpl.h>
namespace WebCore {
class Element;
class TreeScope;
class DocumentOrderedMap {
public:
void add(AtomicStringImpl*, Element*);
void remove(AtomicStringImpl*, Element*);
void clear();
bool contains(AtomicStringImpl*) const;
bool containsSingle(AtomicStringImpl*) const;
bool containsMultiple(AtomicStringImpl*) const;
Element* getElementById(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByName(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByMapName(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByLowercasedMapName(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByLabelForAttribute(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByWindowNamedItem(AtomicStringImpl*, const TreeScope*) const;
Element* getElementByDocumentNamedItem(AtomicStringImpl*, const TreeScope*) const;
const Vector<Element*>* getAllElementsById(AtomicStringImpl*, const TreeScope*) const;
void checkConsistency() const;
private:
template<bool keyMatches(AtomicStringImpl*, Element*)> Element* get(AtomicStringImpl*, const TreeScope*) const;
struct MapEntry {
MapEntry()
: element(0)
, count(0)
{ }
explicit MapEntry(Element* firstElement)
: element(firstElement)
, count(1)
{ }
Element* element;
unsigned count;
Vector<Element*> orderedList;
};
typedef HashMap<AtomicStringImpl*, MapEntry> Map;
mutable Map m_map;
};
inline bool DocumentOrderedMap::containsSingle(AtomicStringImpl* id) const
{
Map::const_iterator it = m_map.find(id);
return it != m_map.end() && it->value.count == 1;
}
inline bool DocumentOrderedMap::contains(AtomicStringImpl* id) const
{
return m_map.contains(id);
}
inline bool DocumentOrderedMap::containsMultiple(AtomicStringImpl* id) const
{
Map::const_iterator it = m_map.find(id);
return it != m_map.end() && it->value.count > 1;
}
}
#endif // DocumentOrderedMap_h