summaryrefslogtreecommitdiffstats
path: root/base/supports_user_data.h
diff options
context:
space:
mode:
Diffstat (limited to 'base/supports_user_data.h')
-rw-r--r--base/supports_user_data.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/base/supports_user_data.h b/base/supports_user_data.h
index 0296a3e..1c90e01 100644
--- a/base/supports_user_data.h
+++ b/base/supports_user_data.h
@@ -9,6 +9,7 @@
#include "base/base_export.h"
#include "base/memory/linked_ptr.h"
+#include "base/memory/ref_counted.h"
namespace base {
@@ -42,6 +43,25 @@ class BASE_EXPORT SupportsUserData {
DISALLOW_COPY_AND_ASSIGN(SupportsUserData);
};
+// Adapter class that releases a refcounted object when the
+// SupportsUserData::Data object is deleted.
+template <typename T>
+class UserDataAdapter : public base::SupportsUserData::Data {
+ public:
+ static T* Get(SupportsUserData* supports_user_data, const char* key) {
+ UserDataAdapter* data =
+ static_cast<UserDataAdapter*>(supports_user_data->GetUserData(key));
+ return static_cast<T*>(data->object_.get());
+ }
+
+ UserDataAdapter(T* object) : object_(object) {}
+
+ private:
+ scoped_refptr<T> object_;
+
+ DISALLOW_COPY_AND_ASSIGN(UserDataAdapter);
+};
+
} // namespace base
#endif // BASE_SUPPORTS_USER_DATA_H_