Project
Loading...
Searching...
No Matches
observer_ptr.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef FRAMEWORK_OBSERVER_PTR_H
13#define FRAMEWORK_OBSERVER_PTR_H
14
15#include <cstddef>
16#include <type_traits>
17
18namespace o2
19{
20
21template <typename W>
23{
24 public:
25 using element_type = W;
26
27 constexpr observer_ptr() noexcept = default;
28 constexpr observer_ptr(std::nullptr_t) noexcept {}
29 explicit observer_ptr(element_type* ptr) noexcept : mptr{ptr} {}
30 template <typename W2, typename std::enable_if<std::is_convertible<W2*, element_type*>::value, int>::type = 1>
31 observer_ptr(observer_ptr<W2> other) noexcept : mptr{other.get()}
32 {
33 }
34 observer_ptr(const observer_ptr& other) = default;
36
37 constexpr element_type* release() noexcept
38 {
39 auto tmp = *this;
40 this->reset();
41 return tmp.get();
42 }
43 constexpr void reset(element_type* p = nullptr) noexcept { *this = p; }
44 constexpr void swap(observer_ptr& other) noexcept
45 {
47 *this = other;
48 other = tmp;
49 };
50 constexpr void swap(std::nullptr_t) noexcept
51 {
52 *this = nullptr;
53 };
54 constexpr element_type* get() const noexcept { return mptr; }
55 constexpr std::add_lvalue_reference_t<element_type> operator*() const { return *get(); }
56 constexpr element_type* operator->() const noexcept { return get(); }
57 constexpr std::add_lvalue_reference_t<observer_ptr<element_type>> operator=(const std::add_lvalue_reference_t<observer_ptr<element_type>> other)
58 {
59 mptr = other.mptr;
60 return *this;
61 }
62 constexpr std::add_lvalue_reference_t<observer_ptr<element_type>> operator=(element_type* const other)
63 {
64 mptr = other;
65 return *this;
66 }
67
68 constexpr explicit operator element_type*() const noexcept { return get(); }
69 constexpr explicit operator bool() const noexcept { return get() != nullptr; }
70
71 private:
72 element_type* mptr{nullptr};
73};
74
75template <typename W>
77{
78 return observer_ptr(p);
79}
80
81template <class W1, class W2>
83{
84 return p1.get() == p2.get();
85}
86
87template <class W1, class W2>
89{
90 return !(p1 == p2);
91}
92
93template <class W>
94bool operator==(const observer_ptr<W>& p, std::nullptr_t) noexcept
95{
96 return !p;
97}
98
99template <class W>
100bool operator==(std::nullptr_t, const observer_ptr<W>& p) noexcept
101{
102 return !p;
103}
104
105template <class W>
106bool operator!=(const observer_ptr<W>& p, std::nullptr_t) noexcept
107{
108 return static_cast<bool>(p);
109}
110
111template <class W>
112bool operator!=(std::nullptr_t, const observer_ptr<W>& p) noexcept
113{
114 return static_cast<bool>(p);
115}
116
117template <class W1, class W2>
119{
120 return p1.get() < p2.get();
121}
122
123template <class W1, class W2>
125{
126 return p1.get() > p2.get();
127}
128
129template <class W1, class W2>
131{
132 return p1.get() <= p2.get();
133}
134
135template <class W1, class W2>
137{
138 return p1.get() >= p2.get();
139}
140
141} //namespace o2
142
143namespace std
144{
145template <class W>
146void swap(o2::observer_ptr<W>& lhs, o2::observer_ptr<W>& rhs) noexcept
147{
148 lhs.swap(rhs);
149}
150template <class T>
151struct hash<o2::observer_ptr<T>> {
152 std::size_t operator()(const o2::observer_ptr<T>& in) const noexcept
153 {
154 return std::hash<T*>()(in.get());
155 };
156};
157} //namespace std
158
159#endif
constexpr int p2()
constexpr int p1()
constexpr to accelerate the coordinates changing
TBranch * ptr
observer_ptr(observer_ptr< W2 > other) noexcept
constexpr element_type * release() noexcept
constexpr element_type * get() const noexcept
observer_ptr(const observer_ptr &other)=default
constexpr element_type * operator->() const noexcept
constexpr void swap(observer_ptr &other) noexcept
constexpr std::add_lvalue_reference_t< observer_ptr< element_type > > operator=(element_type *const other)
constexpr std::add_lvalue_reference_t< element_type > operator*() const
constexpr std::add_lvalue_reference_t< observer_ptr< element_type > > operator=(const std::add_lvalue_reference_t< observer_ptr< element_type > > other)
constexpr void reset(element_type *p=nullptr) noexcept
constexpr observer_ptr() noexcept=default
observer_ptr(observer_ptr &&other)=default
observer_ptr(element_type *ptr) noexcept
constexpr void swap(std::nullptr_t) noexcept
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
bool operator!=(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
bool operator<=(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
observer_ptr< W > make_observer(W *p) noexcept
bool operator>=(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
bool operator<(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
bool operator>(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
bool operator==(const observer_ptr< W1 > &p1, const observer_ptr< W2 > &p2)
Defining DataPointCompositeObject explicitly as copiable.
VectorOfTObjectPtrs other