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