Index: content/common/property_bag.h |
=================================================================== |
--- content/common/property_bag.h (revision 111170) |
+++ content/common/property_bag.h (working copy) |
@@ -1,176 +0,0 @@ |
-// Copyright (c) 2011 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 CONTENT_COMMON_PROPERTY_BAG_H_ |
-#define CONTENT_COMMON_PROPERTY_BAG_H_ |
-#pragma once |
- |
-#include <map> |
- |
-#include "base/basictypes.h" |
-#include "content/common/content_export.h" |
- |
-template <typename T> |
-class linked_ptr; |
-class PropertyAccessorBase; |
- |
-// A property bag holds a generalized list of arbitrary metadata called |
-// properties. Each property is a class type derived from PropertyBag::Prop |
-// that can be set and retrieved. |
-// |
-// The property bag is not read or written directly. Instead, callers go |
-// through a PropertyAccessor. The Accessor generates the unique IDs that |
-// identify different properties. The Accessor is templatized to also provide |
-// typesafety to the callers. |
-// |
-// Example: |
-// // Note: you don't want to use Singleton for your Accessor if you're using |
-// // a simple type like int or string as the data, since it will enforce that |
-// // there is only one singleton for that type, which will conflict. If |
-// // you're putting in some struct that's unique to you, go ahead. |
-// PropertyAccessor<int>* my_accessor() const { |
-// static PropertyAccessor<int>* accessor = NULL; |
-// if (!accessor) accessor = new PropertyAccessor<int>; |
-// return accessor; |
-// } |
-// |
-// void doit(SomeObjectThatImplementsPropertyBag* object) { |
-// PropertyAccessor<int>* accessor = my_accessor(); |
-// int* property = accessor->GetProperty(object); |
-// if (property) |
-// ... use property ... |
-// |
-// accessor->SetProperty(object, 22); |
-// } |
-class CONTENT_EXPORT PropertyBag { |
- public: |
- // The type that uniquely identifies a property type. |
- typedef int PropID; |
- enum { NULL_PROP_ID = -1 }; // Invalid property ID. |
- |
- // Properties are all derived from this class. They must be deletable and |
- // copyable |
- class Prop { |
- public: |
- virtual ~Prop() {} |
- |
- // Copies the property and returns a pointer to the new one. The caller is |
- // responsible for managing the lifetime. |
- virtual Prop* copy() = 0; |
- }; |
- |
- PropertyBag(); |
- PropertyBag(const PropertyBag& other); |
- virtual ~PropertyBag(); |
- |
- PropertyBag& operator=(const PropertyBag& other); |
- |
- private: |
- friend class PropertyAccessorBase; |
- |
- typedef std::map<PropID, linked_ptr<Prop> > PropertyMap; |
- |
- // Used by the PropertyAccessor to set the property with the given ID. |
- // Ownership of the given pointer will be transferred to us. Any existing |
- // property matching the given ID will be deleted. |
- void SetProperty(PropID id, Prop* prop); |
- |
- // Used by the PropertyAccessor to retrieve the property with the given ID. |
- // The returned pointer will be NULL if there is no match. Ownership of the |
- // pointer will stay with the property bag. |
- Prop* GetProperty(PropID id); |
- const Prop* GetProperty(PropID id) const; |
- |
- // Deletes the property with the given ID from the bag if it exists. |
- void DeleteProperty(PropID id); |
- |
- PropertyMap props_; |
- |
- // Copy and assign is explicitly allowed for this class. |
-}; |
- |
-// PropertyAccessorBase ------------------------------------------------------- |
- |
-// Manages getting the unique IDs to identify a property. Callers should use |
-// PropertyAccessor below instead. |
-class CONTENT_EXPORT PropertyAccessorBase { |
- public: |
- PropertyAccessorBase(); |
- virtual ~PropertyAccessorBase() {} |
- |
- // Removes our property, if any, from the given property bag. |
- void DeleteProperty(PropertyBag* bag) { |
- bag->DeleteProperty(prop_id_); |
- } |
- |
- protected: |
- void SetPropertyInternal(PropertyBag* bag, PropertyBag::Prop* prop) { |
- bag->SetProperty(prop_id_, prop); |
- } |
- PropertyBag::Prop* GetPropertyInternal(PropertyBag* bag) { |
- return bag->GetProperty(prop_id_); |
- } |
- const PropertyBag::Prop* GetPropertyInternal(const PropertyBag* bag) const { |
- return bag->GetProperty(prop_id_); |
- } |
- |
- private: |
- // Identifier for this property. |
- PropertyBag::PropID prop_id_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PropertyAccessorBase); |
-}; |
- |
-// PropertyAccessor ----------------------------------------------------------- |
- |
-// Provides typesafe accessor functions for a property bag, and manages the |
-// unique identifiers for properties via the PropertyAccessorBase. |
-template<class T> |
-class PropertyAccessor : public PropertyAccessorBase { |
- public: |
- PropertyAccessor() : PropertyAccessorBase() {} |
- virtual ~PropertyAccessor() {} |
- |
- // Makes a copy of the |prop| object for storage. |
- void SetProperty(PropertyBag* bag, const T& prop) { |
- SetPropertyInternal(bag, new Container(prop)); |
- } |
- |
- // Returns our property in the given bag or NULL if there is no match. The |
- // returned pointer's ownership will stay with the property bag. |
- T* GetProperty(PropertyBag* bag) { |
- PropertyBag::Prop* prop = GetPropertyInternal(bag); |
- if (!prop) |
- return NULL; |
- return static_cast<Container*>(prop)->get(); |
- } |
- const T* GetProperty(const PropertyBag* bag) const { |
- const PropertyBag::Prop* prop = GetPropertyInternal(bag); |
- if (!prop) |
- return NULL; |
- return static_cast<const Container*>(prop)->get(); |
- } |
- |
- // See also DeleteProperty on thn PropertyAccessorBase. |
- |
- private: |
- class Container : public PropertyBag::Prop { |
- public: |
- explicit Container(const T& data) : data_(data) {} |
- |
- T* get() { return &data_; } |
- const T* get() const { return &data_; } |
- |
- private: |
- virtual Prop* copy() { |
- return new Container(data_); |
- } |
- |
- T data_; |
- }; |
- |
- DISALLOW_COPY_AND_ASSIGN(PropertyAccessor); |
-}; |
- |
-#endif // CONTENT_COMMON_PROPERTY_BAG_H_ |