| Index: Source/platform/Supplementable.h
|
| diff --git a/Source/platform/Supplementable.h b/Source/platform/Supplementable.h
|
| index 7d238da4040fdde9c212a643ea4e4c870e0a8d12..83e22f7b7376579367a02097233144aeecbe96e2 100644
|
| --- a/Source/platform/Supplementable.h
|
| +++ b/Source/platform/Supplementable.h
|
| @@ -26,6 +26,7 @@
|
| #ifndef Supplementable_h
|
| #define Supplementable_h
|
|
|
| +#include "heap/Handle.h"
|
| #include "wtf/Assertions.h"
|
| #include "wtf/HashMap.h"
|
| #include "wtf/OwnPtr.h"
|
| @@ -87,37 +88,70 @@ namespace WebCore {
|
| // Note that reattachThread() does nothing if assertion is not enabled.
|
| //
|
|
|
| +template<typename T, bool isGarbageCollected>
|
| +class SupplementBase;
|
| +
|
| +template<typename T, bool isGarbageCollected>
|
| +class SupplementableBase;
|
| +
|
| +template<typename T, bool isGarbageCollected>
|
| +struct SupplementableTraits;
|
| +
|
| template<typename T>
|
| -class Supplementable;
|
| +struct SupplementableTraits<T, true> {
|
| + typedef PassOwnPtrWillBeRawPtr<SupplementBase<T, true> > SupplementArgumentType;
|
| + typedef WillBeHeapHashMap<const char*, OwnPtrWillBeMember<SupplementBase<T, true> >, PtrHash<const char*> > SupplementMap;
|
| +};
|
|
|
| template<typename T>
|
| -class Supplement {
|
| +struct SupplementableTraits<T, false> {
|
| + typedef PassOwnPtr<SupplementBase<T, false> > SupplementArgumentType;
|
| + typedef HashMap<const char*, OwnPtr<SupplementBase<T, false> >, PtrHash<const char*> > SupplementMap;
|
| +};
|
| +
|
| +template<bool>
|
| +class SupplementTracing;
|
| +
|
| +template<>
|
| +class SupplementTracing<true> : public GarbageCollectedMixin {
|
| +public:
|
| + virtual void trace(Visitor*) = 0;
|
| +};
|
| +
|
| +template<>
|
| +class SupplementTracing<false> {
|
| +public:
|
| + virtual void trace(Visitor*) { }
|
| +};
|
| +
|
| +template<typename T, bool isGarbageCollected = false>
|
| +class SupplementBase : public SupplementTracing<isGarbageCollected> {
|
| public:
|
| - virtual ~Supplement() { }
|
| + virtual ~SupplementBase() { }
|
| #if SECURITY_ASSERT_ENABLED
|
| virtual bool isRefCountedWrapper() const { return false; }
|
| #endif
|
|
|
| - static void provideTo(Supplementable<T>& host, const char* key, PassOwnPtr<Supplement<T> > supplement)
|
| + static void provideTo(SupplementableBase<T, isGarbageCollected>& host, const char* key, typename SupplementableTraits<T, isGarbageCollected>::SupplementArgumentType supplement)
|
| {
|
| host.provideSupplement(key, supplement);
|
| }
|
|
|
| - static Supplement<T>* from(Supplementable<T>& host, const char* key)
|
| + static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isGarbageCollected>& host, const char* key)
|
| {
|
| return host.requireSupplement(key);
|
| }
|
|
|
| - static Supplement<T>* from(Supplementable<T>* host, const char* key)
|
| + static SupplementBase<T, isGarbageCollected>* from(SupplementableBase<T, isGarbageCollected>* host, const char* key)
|
| {
|
| return host ? host->requireSupplement(key) : 0;
|
| }
|
| };
|
|
|
| -template<typename T>
|
| -class Supplementable {
|
| +template<typename T, bool isGarbageCollected = false>
|
| +class SupplementableBase {
|
| public:
|
| - void provideSupplement(const char* key, PassOwnPtr<Supplement<T> > supplement)
|
| + void provideSupplement(const char* key, typename SupplementableTraits<T, isGarbageCollected>::SupplementArgumentType supplement)
|
| {
|
| ASSERT(m_threadId == currentThread());
|
| ASSERT(!m_supplements.get(key));
|
| @@ -130,7 +164,7 @@ public:
|
| m_supplements.remove(key);
|
| }
|
|
|
| - Supplement<T>* requireSupplement(const char* key)
|
| + SupplementBase<T, isGarbageCollected>* requireSupplement(const char* key)
|
| {
|
| ASSERT(m_threadId == currentThread());
|
| return m_supplements.get(key);
|
| @@ -143,19 +177,45 @@ public:
|
| #endif
|
| }
|
|
|
| + void trace(Visitor* visitor)
|
| + {
|
| + visitor->trace(m_supplements);
|
| + }
|
| +
|
| #if !ASSERT_DISABLED
|
| protected:
|
| - Supplementable() : m_threadId(currentThread()) { }
|
| + SupplementableBase() : m_threadId(currentThread()) { }
|
| #endif
|
|
|
| private:
|
| - typedef HashMap<const char*, OwnPtr<Supplement<T> >, PtrHash<const char*> > SupplementMap;
|
| - SupplementMap m_supplements;
|
| + typename SupplementableTraits<T, isGarbageCollected>::SupplementMap m_supplements;
|
| #if !ASSERT_DISABLED
|
| ThreadIdentifier m_threadId;
|
| #endif
|
| };
|
|
|
| +template<typename T>
|
| +class HeapSupplement : public SupplementBase<T, true> { };
|
| +
|
| +template<typename T>
|
| +class HeapSupplementable : public SupplementableBase<T, true> { };
|
| +
|
| +template<typename T>
|
| +class Supplement : public SupplementBase<T, false> { };
|
| +
|
| +template<typename T>
|
| +class Supplementable : public SupplementableBase<T, false> { };
|
| +
|
| +template<typename T>
|
| +struct ThreadingTrait<WebCore::SupplementBase<T, true> > {
|
| + static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
|
| +};
|
| +
|
| +template<typename T>
|
| +struct ThreadingTrait<WebCore::SupplementableBase<T, true> > {
|
| + static const ThreadAffinity Affinity = ThreadingTrait<T>::Affinity;
|
| +};
|
| +
|
| } // namespace WebCore
|
|
|
| #endif // Supplementable_h
|
|
|