TARAXA
Loading...
Searching...
No Matches
Common.h
Go to the documentation of this file.
1// Aleth: Ethereum C++ client, tools and libraries.
2// Copyright 2013-2019 Aleth Authors.
3// Licensed under the GNU General Public License, Version 3.
4
7#pragma once
8
9#include <chrono>
10#include <functional>
11#include <map>
12#include <set>
13#include <string>
14#include <unordered_map>
15#include <vector>
16#pragma warning(push)
17#pragma GCC diagnostic push
18#pragma GCC diagnostic ignored "-Wunused-parameter"
19#include <boost/multiprecision/cpp_int.hpp>
20#pragma warning(pop)
21#pragma GCC diagnostic pop
22#include "vector_ref.h"
23
24// CryptoPP defines byte in the global namespace, so must we.
25using byte = uint8_t;
26
27#define DEV_IGNORE_EXCEPTIONS(X) \
28 try { \
29 X; \
30 } catch (...) { \
31 }
32
33#define DEV_IF_THROWS(X) \
34 try { \
35 X; \
36 } catch (...)
37
38namespace dev {
39using namespace boost::multiprecision::literals;
40
41extern char const* Version;
42
43extern std::string const EmptyString;
44
45// Binary data types.
46using bytes = std::vector<::byte>;
49
50template <class T>
52 public:
54 secure_vector(secure_vector<T> const& /*_c*/) = default; // See https://github.com/ethereum/libweb3core/pull/44
55 explicit secure_vector(size_t _size) : m_data(_size) {}
56 explicit secure_vector(size_t _size, T _item) : m_data(_size, _item) {}
57 explicit secure_vector(std::vector<T> const& _c) : m_data(_c) {}
58 explicit secure_vector(vector_ref<T> _c) : m_data(_c.data(), _c.data() + _c.size()) {}
59 explicit secure_vector(vector_ref<const T> _c) : m_data(_c.data(), _c.data() + _c.size()) {}
60 ~secure_vector() { ref().cleanse(); }
61
63 if (&_c == this) return *this;
64
65 ref().cleanse();
66 m_data = _c.m_data;
67 return *this;
68 }
69 std::vector<T>& writable() {
70 clear();
71 return m_data;
72 }
73 std::vector<T> const& makeInsecure() const { return m_data; }
74
75 void clear() { ref().cleanse(); }
76
79
80 size_t size() const { return m_data.size(); }
81 bool empty() const { return m_data.empty(); }
82
83 void swap(secure_vector<T>& io_other) { m_data.swap(io_other.m_data); }
84
85 private:
86 std::vector<T> m_data;
87};
88
90
91// Numeric types.
92using bigint = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<>>;
93using u64 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
94 64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
95using u128 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
96 128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
97using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
98 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
99using s256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
100 256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
101using u160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
102 160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
103using s160 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
104 160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
105using u512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
106 512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
107using s512 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
108 512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void>>;
109using u256s = std::vector<u256>;
110using u160s = std::vector<u160>;
111using u256Set = std::set<u256>;
112using u160Set = std::set<u160>;
113
114// Map types.
115using StringMap = std::map<std::string, std::string>;
116using BytesMap = std::map<bytes, bytes>;
117using u256Map = std::map<u256, u256>;
118using HexMap = std::map<bytes, bytes>;
119
120// Hash types.
121using StringHashMap = std::unordered_map<std::string, std::string>;
122using u256HashMap = std::unordered_map<u256, u256>;
123
124// String types.
125using strings = std::vector<std::string>;
126
127// Null/Invalid values for convenience.
128extern bytes const NullBytes;
129
130template <size_t n>
131inline u256 exp10() {
132 return exp10<n - 1>() * u256(10);
133}
134
135template <>
136inline u256 exp10<0>() {
137 return u256(1);
138}
139
142 public:
143 ScopeGuard(std::function<void(void)> _f) : m_f(_f) {}
145
146 private:
147 std::function<void(void)> m_f;
148};
149
152 public:
155 ~TimerHelper();
156
157 private:
158 std::chrono::high_resolution_clock::time_point m_t;
159 std::string m_id;
160 unsigned m_ms;
161};
162
163class Timer {
164 public:
165 Timer() { restart(); }
166
167 std::chrono::high_resolution_clock::duration duration() const {
168 return std::chrono::high_resolution_clock::now() - m_t;
169 }
170 double elapsed() const {
171 return std::chrono::duration_cast<std::chrono::microseconds>(duration()).count() / 1000000.0;
172 }
173 void restart() { m_t = std::chrono::high_resolution_clock::now(); }
174
175 private:
176 std::chrono::high_resolution_clock::time_point m_t;
177};
178
179#define DEV_TIMED(S) \
180 for (::std::pair<::dev::TimerHelper, bool> __eth_t(S, true); __eth_t.second; __eth_t.second = false)
181#define DEV_TIMED_SCOPE(S) ::dev::TimerHelper __eth_t(S)
182#if defined(_WIN32)
183#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__FUNCSIG__)
184#else
185#define DEV_TIMED_FUNCTION DEV_TIMED_SCOPE(__PRETTY_FUNCTION__)
186#endif
187
188#define DEV_TIMED_ABOVE(S, MS) \
189 for (::std::pair<::dev::TimerHelper, bool> __eth_t(::dev::TimerHelper(S, MS), true); __eth_t.second; \
190 __eth_t.second = false)
191#define DEV_TIMED_SCOPE_ABOVE(S, MS) ::dev::TimerHelper __eth_t(S, MS)
192#if defined(_WIN32)
193#define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__FUNCSIG__, MS)
194#else
195#define DEV_TIMED_FUNCTION_ABOVE(MS) DEV_TIMED_SCOPE_ABOVE(__PRETTY_FUNCTION__, MS)
196#endif
197
198#define DEV_UNUSED __attribute__((unused))
199
202
203static const auto c_steadyClockMin = std::chrono::steady_clock::time_point::min();
204
205} // namespace dev
RAII utility class whose destructor calls a given function.
Definition Common.h:141
ScopeGuard(std::function< void(void)> _f)
Definition Common.h:143
std::function< void(void)> m_f
Definition Common.h:147
~ScopeGuard()
Definition Common.h:144
Simple scope-based timer helper.
Definition Common.h:151
std::chrono::high_resolution_clock::time_point m_t
Definition Common.h:158
TimerHelper(std::string const &_id, unsigned _msReportWhenGreater=0)
Definition Common.h:153
std::string m_id
Definition Common.h:159
~TimerHelper()
Definition Common.cpp:20
unsigned m_ms
Definition Common.h:160
Definition Common.h:163
Timer()
Definition Common.h:165
double elapsed() const
Definition Common.h:170
std::chrono::high_resolution_clock::duration duration() const
Definition Common.h:167
std::chrono::high_resolution_clock::time_point m_t
Definition Common.h:176
void restart()
Definition Common.h:173
Definition Common.h:51
secure_vector(size_t _size)
Definition Common.h:55
std::vector< T > const & makeInsecure() const
Definition Common.h:73
bool empty() const
Definition Common.h:81
vector_ref< T > ref()
Definition Common.h:77
secure_vector(size_t _size, T _item)
Definition Common.h:56
void swap(secure_vector< T > &io_other)
Definition Common.h:83
void clear()
Definition Common.h:75
std::vector< T > m_data
Definition Common.h:86
std::vector< T > & writable()
Definition Common.h:69
secure_vector(secure_vector< T > const &)=default
secure_vector(std::vector< T > const &_c)
Definition Common.h:57
secure_vector(vector_ref< T > _c)
Definition Common.h:58
secure_vector()
Definition Common.h:53
size_t size() const
Definition Common.h:80
vector_ref< T const > ref() const
Definition Common.h:78
secure_vector(vector_ref< const T > _c)
Definition Common.h:59
~secure_vector()
Definition Common.h:60
secure_vector< T > & operator=(secure_vector< T > const &_c)
Definition Common.h:62
Definition vector_ref.h:23
uint8_t byte
Definition Common.h:25
Definition Address.h:13
char const * Version
u256 exp10< 0 >()
Definition Common.h:136
std::vector< std::string > strings
Definition Common.h:125
void assertThrowAux(bool _condition, ::std::string const &_errorDescription, unsigned _line, char const *_file, char const *_function)
Definition Assertions.h:53
std::map< bytes, bytes > BytesMap
Definition Common.h:116
std::map< u256, u256 > u256Map
Definition Common.h:117
std::set< u256 > u256Set
Definition Common.h:111
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 128, 128, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u128
Definition Common.h:96
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s512
Definition Common.h:108
std::map< std::string, std::string > StringMap
Definition Common.h:115
std::string const EmptyString
Definition Common.cpp:18
std::vector<::byte > bytes
Definition Common.h:46
std::unordered_map< u256, u256 > u256HashMap
Definition Common.h:122
std::set< u160 > u160Set
Definition Common.h:112
std::vector< u256 > u256s
Definition Common.h:109
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s256
Definition Common.h:100
std::map< bytes, bytes > HexMap
Definition Common.h:118
boost::multiprecision::number< boost::multiprecision::cpp_int_backend<> > bigint
Definition Common.h:92
int64_t utcTime()
Get the current time in seconds since the epoch in UTC.
Definition Common.cpp:27
std::vector< u160 > u160s
Definition Common.h:110
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 64, 64, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u64
Definition Common.h:94
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u256
Definition Common.h:98
u256 exp10()
Definition Common.h:131
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u160
Definition Common.h:102
std::unordered_map< std::string, std::string > StringHashMap
Definition Common.h:121
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 512, 512, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void > > u512
Definition Common.h:106
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 160, 160, boost::multiprecision::signed_magnitude, boost::multiprecision::unchecked, void > > s160
Definition Common.h:104
static const auto c_steadyClockMin
Definition Common.h:203
bytes const NullBytes
Definition Common.cpp:17
std::hash for asio::adress
Definition FixedHash.h:483