xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
include
xrpl
basics
tagged_integer.h
1
// Copyright (c) 2014, Nikolaos D. Bougalis <nikb@bougalis.net>
2
3
#pragma once
4
5
#include <xrpl/beast/hash/hash_append.h>
6
7
#include <boost/operators.hpp>
8
9
#include <
iostream
>
10
#include <
string
>
11
#include <
type_traits
>
12
13
namespace
xrpl
{
14
27
template
<
class
Int,
class
Tag>
28
class
TaggedInteger
: boost::totally_ordered<
29
TaggedInteger<Int, Tag>,
30
boost::integer_arithmetic<
31
TaggedInteger<Int, Tag>,
32
boost::bitwise<
33
TaggedInteger<Int, Tag>,
34
boost::unit_steppable<
35
TaggedInteger<Int, Tag>,
36
boost::shiftable<TaggedInteger<Int, Tag>>>>>>
37
{
38
private
:
39
Int
value_
;
40
41
public
:
42
using
value_type
= Int;
43
using
TagType
= Tag;
44
45
TaggedInteger
() =
default
;
46
47
template
<
class
OtherInt>
48
explicit
constexpr
TaggedInteger
(OtherInt value)
noexcept
49
requires
(
std::is_integral_v<OtherInt>
&&
sizeof
(OtherInt) <=
sizeof
(Int))
50
:
value_
(value)
51
{
52
static_assert
(
sizeof
(
TaggedInteger
) ==
sizeof
(Int),
"tagged_integer is adding padding"
);
53
}
54
55
bool
56
operator<
(
TaggedInteger
const
& rhs)
const
noexcept
57
{
58
return
value_
< rhs.value_;
59
}
60
61
bool
62
operator==
(
TaggedInteger
const
& rhs)
const
noexcept
63
{
64
return
value_
== rhs.value_;
65
}
66
67
TaggedInteger
&
68
operator+=
(
TaggedInteger
const
& rhs)
noexcept
69
{
70
value_
+= rhs.value_;
71
return
*
this
;
72
}
73
74
TaggedInteger
&
75
operator-=
(
TaggedInteger
const
& rhs)
noexcept
76
{
77
value_
-= rhs.value_;
78
return
*
this
;
79
}
80
81
TaggedInteger
&
82
operator*=
(
TaggedInteger
const
& rhs)
noexcept
83
{
84
value_
*= rhs.value_;
85
return
*
this
;
86
}
87
88
TaggedInteger
&
89
operator/=
(
TaggedInteger
const
& rhs)
noexcept
90
{
91
value_
/= rhs.value_;
92
return
*
this
;
93
}
94
95
TaggedInteger
&
96
operator%=
(
TaggedInteger
const
& rhs)
noexcept
97
{
98
value_
%= rhs.value_;
99
return
*
this
;
100
}
101
102
TaggedInteger
&
103
operator|=
(
TaggedInteger
const
& rhs)
noexcept
104
{
105
value_
|= rhs.value_;
106
return
*
this
;
107
}
108
109
TaggedInteger
&
110
operator&=
(
TaggedInteger
const
& rhs)
noexcept
111
{
112
value_
&= rhs.value_;
113
return
*
this
;
114
}
115
116
TaggedInteger
&
117
operator^=
(
TaggedInteger
const
& rhs)
noexcept
118
{
119
value_
^= rhs.value_;
120
return
*
this
;
121
}
122
123
TaggedInteger
&
124
operator<<=
(
TaggedInteger
const
& rhs)
noexcept
125
{
126
value_
<<= rhs.value_;
127
return
*
this
;
128
}
129
130
TaggedInteger
&
131
operator>>=
(
TaggedInteger
const
& rhs)
noexcept
132
{
133
value_
>>= rhs.value_;
134
return
*
this
;
135
}
136
137
TaggedInteger
138
operator~
() const noexcept
139
{
140
return
TaggedInteger
{
~value_
};
141
}
142
143
TaggedInteger
144
operator+
() const noexcept
145
{
146
return
*
this
;
147
}
148
149
TaggedInteger
150
operator-
() const noexcept
151
{
152
return
TaggedInteger
{-
value_
};
153
}
154
155
TaggedInteger
&
156
operator++
() noexcept
157
{
158
++
value_
;
159
return
*
this
;
160
}
161
162
TaggedInteger
&
163
operator--
() noexcept
164
{
165
--
value_
;
166
return
*
this
;
167
}
168
169
explicit
170
operator
Int() const noexcept
171
{
172
return
value_
;
173
}
174
175
friend
std::ostream
&
176
operator<<
(
std::ostream
& s,
TaggedInteger
const
& t)
177
{
178
s << t.
value_
;
179
return
s;
180
}
181
182
friend
std::istream
&
183
operator>>
(
std::istream
& s,
TaggedInteger
& t)
184
{
185
s >> t.
value_
;
186
return
s;
187
}
188
189
friend
std::string
190
to_string
(
TaggedInteger
const
& t)
191
{
192
return
std::to_string
(t.
value_
);
193
}
194
};
195
196
}
// namespace xrpl
197
198
namespace
beast
{
199
template
<
class
Int,
class
Tag,
class
HashAlgorithm>
200
struct
IsContiguouslyHashable
<
xrpl
::TaggedInteger<Int, Tag>, HashAlgorithm>
201
:
public
IsContiguouslyHashable
<Int, HashAlgorithm>
202
{
203
explicit
IsContiguouslyHashable
() =
default
;
204
};
205
206
}
// namespace beast
std::istream
std::ostream
std::string
xrpl::TaggedInteger
A type-safe wrap around standard integral types.
Definition
tagged_integer.h:37
xrpl::TaggedInteger::operator+=
TaggedInteger & operator+=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:68
xrpl::TaggedInteger::operator^=
TaggedInteger & operator^=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:117
xrpl::TaggedInteger::operator<<=
TaggedInteger & operator<<=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:124
xrpl::TaggedInteger::operator--
TaggedInteger & operator--() noexcept
Definition
tagged_integer.h:163
xrpl::TaggedInteger::operator|=
TaggedInteger & operator|=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:103
xrpl::TaggedInteger::operator<
bool operator<(TaggedInteger const &rhs) const noexcept
Definition
tagged_integer.h:56
xrpl::TaggedInteger::operator*=
TaggedInteger & operator*=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:82
xrpl::TaggedInteger::operator&=
TaggedInteger & operator&=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:110
xrpl::TaggedInteger::TaggedInteger
TaggedInteger()=default
xrpl::TaggedInteger::operator/=
TaggedInteger & operator/=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:89
xrpl::TaggedInteger< std::uint32_t, TaxonTag >::value_
std::uint32_t value_
Definition
tagged_integer.h:39
xrpl::TaggedInteger::operator-=
TaggedInteger & operator-=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:75
xrpl::TaggedInteger::operator-
TaggedInteger operator-() const noexcept
Definition
tagged_integer.h:150
xrpl::TaggedInteger::operator++
TaggedInteger & operator++() noexcept
Definition
tagged_integer.h:156
xrpl::TaggedInteger::operator>>=
TaggedInteger & operator>>=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:131
xrpl::TaggedInteger::operator>>
friend std::istream & operator>>(std::istream &s, TaggedInteger &t)
Definition
tagged_integer.h:183
xrpl::TaggedInteger::to_string
friend std::string to_string(TaggedInteger const &t)
Definition
tagged_integer.h:190
xrpl::TaggedInteger::operator%=
TaggedInteger & operator%=(TaggedInteger const &rhs) noexcept
Definition
tagged_integer.h:96
xrpl::TaggedInteger::operator+
TaggedInteger operator+() const noexcept
Definition
tagged_integer.h:144
xrpl::TaggedInteger::TagType
Tag TagType
Definition
tagged_integer.h:43
xrpl::TaggedInteger::TaggedInteger
constexpr TaggedInteger(OtherInt value) noexcept
Definition
tagged_integer.h:48
xrpl::TaggedInteger::value_type
Int value_type
Definition
tagged_integer.h:42
xrpl::TaggedInteger::operator~
TaggedInteger operator~() const noexcept
Definition
tagged_integer.h:138
xrpl::TaggedInteger::operator<<
friend std::ostream & operator<<(std::ostream &s, TaggedInteger const &t)
Definition
tagged_integer.h:176
xrpl::TaggedInteger::operator==
bool operator==(TaggedInteger const &rhs) const noexcept
Definition
tagged_integer.h:62
iostream
std::is_integral_v
T is_integral_v
beast
Definition
base_uint.h:697
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
string
beast::IsContiguouslyHashable< xrpl::TaggedInteger< Int, Tag >, HashAlgorithm >::IsContiguouslyHashable
IsContiguouslyHashable()=default
std::to_string
T to_string(T... args)
type_traits
Generated by
1.17.0