blob: bb6b501c918275a154de5f0c0ba4ee06d84d3ff0 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PropertyHandle_h
#define PropertyHandle_h
#include "core/CSSPropertyNames.h"
#include "core/CoreExport.h"
#include "core/dom/QualifiedName.h"
#include "wtf/Allocator.h"
namespace blink {
class CORE_EXPORT PropertyHandle {
ALLOW_ONLY_INLINE_ALLOCATION();
public:
explicit PropertyHandle(CSSPropertyID property)
: handleType(HandleCSSProperty)
, property(property)
{
ASSERT(property != CSSPropertyInvalid);
}
explicit PropertyHandle(const QualifiedName& attributeName)
: handleType(HandleSVGAttribute)
, attribute(&attributeName)
{
}
bool operator==(const PropertyHandle&) const;
bool operator!=(const PropertyHandle& other) const { return !(*this == other); }
unsigned hash() const;
bool isCSSProperty() const { return handleType == HandleCSSProperty; }
CSSPropertyID cssProperty() const { ASSERT(isCSSProperty()); return property; }
bool isSVGAttribute() const { return handleType == HandleSVGAttribute; }
const QualifiedName* svgAttribute() const { ASSERT(isSVGAttribute()); return attribute; }
private:
enum HandleType {
HandleEmptyValueForHashTraits,
HandleDeletedValueForHashTraits,
HandleCSSProperty,
HandleSVGAttribute,
};
explicit PropertyHandle(HandleType handleType)
: handleType(handleType)
, attribute(nullptr)
{
}
static PropertyHandle emptyValueForHashTraits() { return PropertyHandle(HandleEmptyValueForHashTraits); }
static PropertyHandle deletedValueForHashTraits() { return PropertyHandle(HandleDeletedValueForHashTraits); }
bool isDeletedValueForHashTraits() { return handleType == HandleDeletedValueForHashTraits; }
HandleType handleType;
union {
CSSPropertyID property;
const QualifiedName* attribute;
};
friend struct ::WTF::HashTraits<blink::PropertyHandle>;
};
} // namespace blink
namespace WTF {
template<> struct DefaultHash<blink::PropertyHandle> {
struct Hash {
STATIC_ONLY(Hash);
static unsigned hash(const blink::PropertyHandle& handle) { return handle.hash(); }
static bool equal(const blink::PropertyHandle& a, const blink::PropertyHandle& b) { return a == b; }
static const bool safeToCompareToEmptyOrDeleted = true;
};
};
template<> struct HashTraits<blink::PropertyHandle> : SimpleClassHashTraits<blink::PropertyHandle> {
static const bool needsDestruction = false;
static void constructDeletedValue(blink::PropertyHandle& slot, bool)
{
new (NotNull, &slot) blink::PropertyHandle(blink::PropertyHandle::deletedValueForHashTraits());
}
static bool isDeletedValue(blink::PropertyHandle value)
{
return value.isDeletedValueForHashTraits();
}
static blink::PropertyHandle emptyValue()
{
return blink::PropertyHandle::emptyValueForHashTraits();
}
};
} // namespace WTF
#endif // PropertyHandle_h