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 <string>
11#include <type_traits>
12
13namespace xrpl {
14
27template <class Int, class Tag>
28class 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{
38private:
39 Int value_;
40
41public:
42 using value_type = Int;
43 using tag_type = 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
68 operator+=(TaggedInteger const& rhs) noexcept
69 {
70 value_ += rhs.value_;
71 return *this;
72 }
73
75 operator-=(TaggedInteger const& rhs) noexcept
76 {
77 value_ -= rhs.value_;
78 return *this;
79 }
80
82 operator*=(TaggedInteger const& rhs) noexcept
83 {
84 value_ *= rhs.value_;
85 return *this;
86 }
87
89 operator/=(TaggedInteger const& rhs) noexcept
90 {
91 value_ /= rhs.value_;
92 return *this;
93 }
94
96 operator%=(TaggedInteger const& rhs) noexcept
97 {
98 value_ %= rhs.value_;
99 return *this;
100 }
101
103 operator|=(TaggedInteger const& rhs) noexcept
104 {
105 value_ |= rhs.value_;
106 return *this;
107 }
108
110 operator&=(TaggedInteger const& rhs) noexcept
111 {
112 value_ &= rhs.value_;
113 return *this;
114 }
115
117 operator^=(TaggedInteger const& rhs) noexcept
118 {
119 value_ ^= rhs.value_;
120 return *this;
121 }
122
124 operator<<=(TaggedInteger const& rhs) noexcept
125 {
126 value_ <<= rhs.value_;
127 return *this;
128 }
129
131 operator>>=(TaggedInteger const& rhs) noexcept
132 {
133 value_ >>= rhs.value_;
134 return *this;
135 }
136
138 operator~() const noexcept
139 {
140 return TaggedInteger{~value_};
141 }
142
144 operator+() const noexcept
145 {
146 return *this;
147 }
148
150 operator-() const noexcept
151 {
152 return TaggedInteger{-value_};
153 }
154
156 operator++() noexcept
157 {
158 ++value_;
159 return *this;
160 }
161
163 operator--() noexcept
164 {
165 --value_;
166 return *this;
167 }
168
169 explicit
170 operator Int() const noexcept
171 {
172 return value_;
173 }
174
177 {
178 s << t.value_;
179 return s;
180 }
181
182 friend std::istream&
184 {
185 s >> t.value_;
186 return s;
187 }
188
189 friend std::string
191 {
192 return std::to_string(t.value_);
193 }
194};
195
196} // namespace xrpl
197
198namespace beast {
199template <class Int, class Tag, class HashAlgorithm>
200struct IsContiguouslyHashable<xrpl::TaggedInteger<Int, Tag>, HashAlgorithm>
201 : public IsContiguouslyHashable<Int, HashAlgorithm>
202{
203 explicit IsContiguouslyHashable() = default;
204};
205
206} // namespace beast
A type-safe wrap around standard integral types.
TaggedInteger & operator+=(TaggedInteger const &rhs) noexcept
TaggedInteger & operator^=(TaggedInteger const &rhs) 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
constexpr TaggedInteger(OtherInt value) noexcept
TaggedInteger operator~() const noexcept
friend std::ostream & operator<<(std::ostream &s, TaggedInteger const &t)
bool operator==(TaggedInteger const &rhs) const noexcept
T is_integral_v
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
T to_string(T... args)