• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // This file defines the type used to provide details for NotificationService
6 // notifications.
7 
8 #ifndef CONTENT_PUBLIC_BROWSER_NOTIFICATION_DETAILS_H_
9 #define CONTENT_PUBLIC_BROWSER_NOTIFICATION_DETAILS_H_
10 
11 #include "base/basictypes.h"
12 #include "content/common/content_export.h"
13 
14 namespace content {
15 
16 // Do not declare a NotificationDetails directly--use either
17 // "Details<detailsclassname>(detailsclasspointer)" or
18 // NotificationService::NoDetails().
19 class CONTENT_EXPORT NotificationDetails {
20  public:
NotificationDetails()21   NotificationDetails() : ptr_(NULL) {}
NotificationDetails(const NotificationDetails & other)22   NotificationDetails(const NotificationDetails& other) : ptr_(other.ptr_) {}
~NotificationDetails()23   ~NotificationDetails() {}
24 
25   // NotificationDetails can be used as the index for a map; this method
26   // returns the pointer to the current details as an identifier, for use as a
27   // map index.
map_key()28   uintptr_t map_key() const { return reinterpret_cast<uintptr_t>(ptr_); }
29 
30   bool operator!=(const NotificationDetails& other) const {
31     return ptr_ != other.ptr_;
32   }
33 
34   bool operator==(const NotificationDetails& other) const {
35     return ptr_ == other.ptr_;
36   }
37 
38  protected:
NotificationDetails(const void * ptr)39    explicit NotificationDetails(const void* ptr) : ptr_(ptr) {}
40 
41   // Declaring this const allows Details<T> to be used with both T = Foo and
42   // T = const Foo.
43   const void* ptr_;
44 };
45 
46 template <class T>
47 class Details : public NotificationDetails {
48  public:
49   // TODO(erg): Our code hard relies on implicit conversion
Details(T * ptr)50   Details(T* ptr) : NotificationDetails(ptr) {}  // NOLINT
Details(const NotificationDetails & other)51   Details(const NotificationDetails& other)      // NOLINT
52     : NotificationDetails(other) {}
53 
54   T* operator->() const { return ptr(); }
55   // The casts here allow this to compile with both T = Foo and T = const Foo.
ptr()56   T* ptr() const { return static_cast<T*>(const_cast<void*>(ptr_)); }
57 };
58 
59 }  // namespace content
60 
61 #endif  // CONTENT_PUBLIC_BROWSER_NOTIFICATION_DETAILS_H_
62