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
14namespace content {
15
16// Do not declare a NotificationDetails directly--use either
17// "Details<detailsclassname>(detailsclasspointer)" or
18// NotificationService::NoDetails().
19class CONTENT_EXPORT NotificationDetails {
20 public:
21  NotificationDetails() : ptr_(NULL) {}
22  NotificationDetails(const NotificationDetails& other) : ptr_(other.ptr_) {}
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.
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:
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
46template <class T>
47class Details : public NotificationDetails {
48 public:
49  // TODO(erg): Our code hard relies on implicit conversion
50  Details(T* ptr) : NotificationDetails(ptr) {}  // NOLINT
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.
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