xrpld
Loading...
Searching...
No Matches
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 <type_traits>
11
12namespace xrpl {
13
25template <class Int, class Tag>
26class TaggedInteger : boost::totally_ordered<
27 TaggedInteger<Int, Tag>,
28 boost::integer_arithmetic<
29 TaggedInteger<Int, Tag>,
30 boost::bitwise<
31 TaggedInteger<Int, Tag>,
32 boost::unit_steppable<
33 TaggedInteger<Int, Tag>,
34 boost::shiftable<TaggedInteger<Int, Tag>>>>>>
35{
36private:
37 Int value_;
38
39public:
40 using value_type = Int;
41 using tag_type = Tag;
42
43 TaggedInteger() = default;
44
45 template <
46 class OtherInt,
47 class = std::enable_if_t<std::is_integral_v<OtherInt> && sizeof(OtherInt) <= sizeof(Int)>>
48 explicit constexpr TaggedInteger(OtherInt value) noexcept : value_(value)
49 {
50 static_assert(sizeof(TaggedInteger) == sizeof(Int), "tagged_integer is adding padding");
51 }
52
53 bool
54 operator<(TaggedInteger const& rhs) const noexcept
55 {
56 return value_ < rhs.value_;
57 }
58
59 bool
60 operator==(TaggedInteger const& rhs) const noexcept
61 {
62 return value_ == rhs.value_;
63 }
64
66 operator+=(TaggedInteger const& rhs) noexcept
67 {
68 value_ += rhs.value_;
69 return *this;
70 }
71
73 operator-=(TaggedInteger const& rhs) noexcept
74 {
75 value_ -= rhs.value_;
76 return *this;
77 }
78
80 operator*=(TaggedInteger const& rhs) noexcept
81 {
82 value_ *= rhs.value_;
83 return *this;
84 }
85
87 operator/=(TaggedInteger const& rhs) noexcept
88 {
89 value_ /= rhs.value_;
90 return *this;
91 }
92
94 operator%=(TaggedInteger const& rhs) noexcept
95 {
96 value_ %= rhs.value_;
97 return *this;
98 }
99
101 operator|=(TaggedInteger const& rhs) noexcept
102 {
103 value_ |= rhs.value_;
104 return *this;
105 }
106
108 operator&=(TaggedInteger const& rhs) noexcept
109 {
110 value_ &= rhs.value_;
111 return *this;
112 }
113
115 operator^=(TaggedInteger const& rhs) noexcept
116 {
117 value_ ^= rhs.value_;
118 return *this;
119 }
120
122 operator<<=(TaggedInteger const& rhs) noexcept
123 {
124 value_ <<= rhs.value_;
125 return *this;
126 }
127
129 operator>>=(TaggedInteger const& rhs) noexcept
130 {
131 value_ >>= rhs.value_;
132 return *this;
133 }
134
136 operator~() const noexcept
137 {
138 return TaggedInteger{~value_};
139 }
140
142 operator+() const noexcept
143 {
144 return *this;
145 }
146
148 operator-() const noexcept
149 {
150 return TaggedInteger{-value_};
151 }
152
154 operator++() noexcept
155 {
156 ++value_;
157 return *this;
158 }
159
161 operator--() noexcept
162 {
163 --value_;
164 return *this;
165 }
166
167 explicit
168 operator Int() const noexcept
169 {
170 return value_;
171 }
172
175 {
176 s << t.value_;
177 return s;
178 }
179
180 friend std::istream&
182 {
183 s >> t.value_;
184 return s;
185 }
186
187 friend std::string
189 {
190 return std::to_string(t.value_);
191 }
192};
193
194} // namespace xrpl
195
196namespace beast {
197template <class Int, class Tag, class HashAlgorithm>
198struct IsContiguouslyHashable<xrpl::TaggedInteger<Int, Tag>, HashAlgorithm>
199 : public IsContiguouslyHashable<Int, HashAlgorithm>
200{
201 explicit IsContiguouslyHashable() = default;
202};
203
204} // namespace beast
A type-safe wrap around standard integral types.
TaggedInteger & operator+=(TaggedInteger const &rhs) noexcept
TaggedInteger & operator^=(TaggedInteger const &rhs) noexcept
constexpr TaggedInteger(OtherInt value) noexcept
TaggedInteger & operator<<=(TaggedInteger const &rhs) noexcept
TaggedInteger & operator--() noexcept
TaggedInteger & operator|=(TaggedInteger const &rhs) noexcept
bool operator<(TaggedInteger const &rhs) const noexcept
TaggedInteger & operator*=(TaggedInteger const &rhs) noexcept
TaggedInteger & operator&=(TaggedInteger const &rhs) noexcept
TaggedInteger()=default
TaggedInteger & operator/=(TaggedInteger const &rhs) noexcept
TaggedInteger & operator-=(TaggedInteger const &rhs) noexcept
TaggedInteger operator-() const noexcept
TaggedInteger & operator++() noexcept
TaggedInteger & operator>>=(TaggedInteger const &rhs) noexcept
friend std::istream & operator>>(std::istream &s, TaggedInteger &t)
friend std::string to_string(TaggedInteger const &t)
TaggedInteger & operator%=(TaggedInteger const &rhs) noexcept
TaggedInteger operator+() const noexcept
TaggedInteger operator~() const noexcept
friend std::ostream & operator<<(std::ostream &s, TaggedInteger const &t)
bool operator==(TaggedInteger const &rhs) const noexcept
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
T to_string(T... args)