1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef IOS_PUBLIC_CONSUMER_BASE_SUPPORTS_USER_DATA_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define IOS_PUBLIC_CONSUMER_BASE_SUPPORTS_USER_DATA_H_ 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ios { 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SupportsUserDataInternal; 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This is a helper for classes that want to allow users to stash random data by 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// key. At destruction all the objects will be destructed. 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SupportsUserData { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SupportsUserData(); 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Derive from this class and add your own data members to associate extra 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // information with this object. Alternatively, add this as a public base 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // class to any class with a virtual destructor. 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class Data { 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~Data() {} 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The user data allows the clients to associate data with this object. 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Multiple user data values can be stored under different keys. 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This object will TAKE OWNERSHIP of the given data pointer, and will 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // delete the object if it is changed or the object is destroyed. 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Data* GetUserData(const void* key) const; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetUserData(const void* key, Data* data); 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void RemoveUserData(const void* key); 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // SupportsUserData is not thread-safe, and on debug build will assert it is 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // only used on one thread. Calling this method allows the caller to hand 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the SupportsUserData instance across threads. Use only if you are taking 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // full control of the synchronization of that handover. 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void DetachUserDataThread(); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected: 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~SupportsUserData(); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Owned by this object and scoped to its lifetime. 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SupportsUserDataInternal* internal_helper_; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace ios 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // IOS_PUBLIC_CONSUMER_BASE_SUPPORTS_USER_DATA_H_ 51