xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
include
xrpl
basics
LocalValue.h
1
#pragma once
2
3
#include <boost/thread/tss.hpp>
4
5
#include <
memory
>
6
#include <
unordered_map
>
7
#include <
utility
>
8
9
namespace
xrpl
{
10
11
namespace
detail
{
12
13
struct
LocalValues
14
{
15
explicit
LocalValues
() =
default
;
16
17
bool
onCoro
=
true
;
18
19
struct
BasicValue
20
{
21
virtual
~BasicValue
() =
default
;
22
virtual
void
*
23
get
() = 0;
24
};
25
26
template
<
class
T>
27
struct
Value
:
BasicValue
28
{
29
T
t
;
30
31
Value
() =
default
;
32
explicit
Value
(T
t
) :
t
(
std
::move(
t
))
33
{
34
}
35
36
void
*
37
get
()
override
38
{
39
return
&
t
;
40
}
41
};
42
43
// Keys are the address of a LocalValue.
44
std::unordered_map<void const*, std::unique_ptr<BasicValue>
>
values
;
45
46
static
void
47
cleanup
(
LocalValues
* lvs)
48
{
49
if
((lvs !=
nullptr
) && !lvs->
onCoro
)
50
delete
lvs;
51
}
52
};
53
54
template
<
class
=
void
>
55
boost::thread_specific_ptr<detail::LocalValues>&
56
getLocalValues
()
57
{
58
static
boost::thread_specific_ptr<detail::LocalValues> kTsp(&
detail::LocalValues::cleanup
);
59
return
kTsp;
60
}
61
62
}
// namespace detail
63
64
template
<
class
T>
65
class
LocalValue
66
{
67
public
:
68
template
<
class
... Args>
69
LocalValue
(Args&&... args) :
t_
(
std
::forward<Args>(args)...)
70
{
71
}
72
76
T&
77
operator*
();
78
82
T*
83
operator->
()
84
{
85
return
&**
this
;
86
}
87
88
private
:
89
T
t_
;
90
};
91
92
template
<
class
T>
93
T&
94
LocalValue<T>::operator*
()
95
{
96
auto
lvs =
detail::getLocalValues
().get();
97
if
(lvs ==
nullptr
)
98
{
99
lvs =
new
detail::LocalValues
();
100
lvs->onCoro =
false
;
101
detail::getLocalValues
().reset(lvs);
102
}
103
else
104
{
105
auto
const
iter = lvs->values.find(
this
);
106
if
(iter != lvs->values.end())
107
return
*
reinterpret_cast<
T*
>
(iter->second->get());
108
}
109
110
return
*
reinterpret_cast<
T*
>
(
111
lvs->values.emplace(
this
,
std::make_unique
<
detail::LocalValues::Value<T>
>(
t_
))
112
.first->second->get());
113
}
114
}
// namespace xrpl
xrpl::LocalValue::operator*
T & operator*()
Stores instance of T specific to the calling coroutine or thread.
Definition
LocalValue.h:94
xrpl::LocalValue::operator->
T * operator->()
Stores instance of T specific to the calling coroutine or thread.
Definition
LocalValue.h:83
xrpl::LocalValue::LocalValue
LocalValue(Args &&... args)
Definition
LocalValue.h:69
xrpl::LocalValue::t_
T t_
Definition
LocalValue.h:89
std::make_unique
T make_unique(T... args)
memory
std
STL namespace.
xrpl::detail
Definition
base_uint.h:37
xrpl::detail::getLocalValues
boost::thread_specific_ptr< detail::LocalValues > & getLocalValues()
Definition
LocalValue.h:56
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::detail::LocalValues::BasicValue
Definition
LocalValue.h:20
xrpl::detail::LocalValues::BasicValue::get
virtual void * get()=0
xrpl::detail::LocalValues::BasicValue::~BasicValue
virtual ~BasicValue()=default
xrpl::detail::LocalValues::Value
Definition
LocalValue.h:28
xrpl::detail::LocalValues::Value::Value
Value()=default
xrpl::detail::LocalValues::Value::get
void * get() override
Definition
LocalValue.h:37
xrpl::detail::LocalValues::Value::Value
Value(T t)
Definition
LocalValue.h:32
xrpl::detail::LocalValues::Value::t
T t
Definition
LocalValue.h:29
xrpl::detail::LocalValues
Definition
LocalValue.h:14
xrpl::detail::LocalValues::LocalValues
LocalValues()=default
xrpl::detail::LocalValues::cleanup
static void cleanup(LocalValues *lvs)
Definition
LocalValue.h:47
xrpl::detail::LocalValues::values
std::unordered_map< void const *, std::unique_ptr< BasicValue > > values
Definition
LocalValue.h:44
xrpl::detail::LocalValues::onCoro
bool onCoro
Definition
LocalValue.h:17
unordered_map
utility
Generated by
1.17.0