Bitcoin Core  0.20.99
P2P Digital Currency
ref.h
Go to the documentation of this file.
1 // Copyright (c) 2020 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_UTIL_REF_H
6 #define BITCOIN_UTIL_REF_H
7 
8 #include <util/check.h>
9 
10 #include <typeindex>
11 
12 namespace util {
13 
21 class Ref
22 {
23 public:
24  Ref() = default;
25  template<typename T> Ref(T& value) { Set(value); }
26  template<typename T> T& Get() const { CHECK_NONFATAL(Has<T>()); return *static_cast<T*>(m_value); }
27  template<typename T> void Set(T& value) { m_value = &value; m_type = std::type_index(typeid(T)); }
28  template<typename T> bool Has() const { return m_value && m_type == std::type_index(typeid(T)); }
29  void Clear() { m_value = nullptr; m_type = std::type_index(typeid(void)); }
30 
31 private:
32  void* m_value = nullptr;
33  std::type_index m_type = std::type_index(typeid(void));
34 };
35 
36 } // namespace util
37 
38 #endif // BITCOIN_UTIL_REF_H
Definition: httprpc.h:8
#define CHECK_NONFATAL(condition)
Throw a NonFatalCheckError when the condition evaluates to false.
Definition: check.h:32
void Set(T &value)
Definition: ref.h:27
void * m_value
Definition: ref.h:32
bool Has() const
Definition: ref.h:28
std::type_index m_type
Definition: ref.h:33
Ref(T &value)
Definition: ref.h:25
T & Get() const
Definition: ref.h:26
Type-safe dynamic reference.
Definition: ref.h:21
Ref()=default
void Clear()
Definition: ref.h:29