TARAXA
Loading...
Searching...
No Matches
vector_ref.h
Go to the documentation of this file.
1// Aleth: Ethereum C++ client, tools and libraries.
2// Copyright 2014-2019 Aleth Authors.
3// Licensed under the GNU General Public License, Version 3.
4#pragma once
5
6#include <atomic>
7#include <cassert>
8#include <cstring>
9#include <string>
10#include <type_traits>
11#include <vector>
12
13#ifdef __INTEL_COMPILER
14#pragma warning(disable : 597) // will not be called for implicit or explicit conversions
15#endif
16
17namespace dev {
18
22template <class _T>
24 public:
25 using value_type = _T;
28 typename std::conditional<std::is_const<_T>::value, typename std::remove_const<_T>::type, _T>::type;
29
30 static_assert(std::is_standard_layout<value_type>::value,
31 "vector_ref can only be used with PODs due to its low-level "
32 "treatment of data.");
33
40 vector_ref(typename std::conditional<std::is_const<_T>::value, std::string const*, std::string*>::type _data)
45 typename std::conditional<std::is_const<_T>::value, std::vector<typename std::remove_const<_T>::type> const*,
46 std::vector<_T>*>::type _data)
47 : m_data(_data->data()), m_count(_data->size()) {}
50 vector_ref(typename std::conditional<std::is_const<_T>::value, std::string const&, std::string&>::type _data)
52 explicit operator bool() const { return m_data && m_count; }
53
54 bool contentsEqual(std::vector<mutable_value_type> const& _c) const {
55 if (!m_data || m_count == 0)
56 return _c.empty();
57 else
58 return _c.size() == m_count && !memcmp(_c.data(), m_data, m_count * sizeof(_T));
59 }
60 std::vector<mutable_value_type> toVector() const { return std::vector<mutable_value_type>(m_data, m_data + m_count); }
61 std::vector<unsigned char> toBytes() const {
62 return std::vector<unsigned char>(reinterpret_cast<unsigned char const*>(m_data),
63 reinterpret_cast<unsigned char const*>(m_data) + m_count * sizeof(_T));
64 }
65 std::string toString() const {
66 return std::string((char const*)m_data, ((char const*)m_data) + m_count * sizeof(_T));
67 }
68
69 template <class _T2>
70 explicit operator vector_ref<_T2>() const {
71 assert(m_count * sizeof(_T) / sizeof(_T2) * sizeof(_T2) / sizeof(_T) == m_count);
72 return vector_ref<_T2>(reinterpret_cast<_T2*>(m_data), m_count * sizeof(_T) / sizeof(_T2));
73 }
75
76 _T* data() const { return m_data; }
79 size_t count() const { return m_count; }
82 size_t size() const { return m_count; }
83 bool empty() const { return !m_count; }
87 if (!m_data)
88 return *this;
89 else
91 }
96 vector_ref<_T> cropped(size_t _begin, size_t _count) const {
97 if (m_data && _begin <= m_count && _count <= m_count && _begin + _count <= m_count)
98 return vector_ref<_T>(m_data + _begin, _count == ~size_t(0) ? m_count - _begin : _count);
99 else
100 return vector_ref<_T>();
101 }
105 if (m_data && _begin <= m_count)
107 else
108 return vector_ref<_T>();
109 }
110 void retarget(_T* _d, size_t _s) {
111 m_data = _d;
112 m_count = _s;
113 }
114 void retarget(std::vector<_T> const& _t) {
115 m_data = _t.data();
116 m_count = _t.size();
117 }
118 template <class T>
120 void const* f1 = data();
121 void const* t1 = data() + size();
122 void const* f2 = _t.data();
123 void const* t2 = _t.data() + _t.size();
124 return f1 < t2 && t1 > f2;
125 }
128 void copyTo(vector_ref<typename std::remove_const<_T>::type> _t) const {
129 if (overlapsWith(_t))
130 memmove(_t.data(), m_data, std::min(_t.size(), m_count) * sizeof(_T));
131 else
132 memcpy(_t.data(), m_data, std::min(_t.size(), m_count) * sizeof(_T));
133 }
136 void populate(vector_ref<typename std::remove_const<_T>::type> _t) const {
137 copyTo(_t);
138 memset(_t.data() + m_count, 0, std::max(_t.size(), m_count) - m_count);
139 }
142 void cleanse() {
143 static std::atomic<unsigned char> s_cleanseCounter{0u};
144 uint8_t* p = (uint8_t*)begin();
145 size_t const len = (uint8_t*)end() - p;
146 size_t loop = len;
147 size_t counter = s_cleanseCounter;
148 while (loop--) {
149 *(p++) = (uint8_t)counter;
150 counter += (17 + ((size_t)p & 0xf));
151 }
153 if (p) counter += (63 + (size_t)p);
155 memset((uint8_t*)begin(), 0, len);
156 }
157
158 _T* begin() { return m_data; }
159 _T* end() { return m_data + m_count; }
160 _T const* begin() const { return m_data; }
161 _T const* end() const { return m_data + m_count; }
162
163 _T& operator[](size_t _i) {
164 assert(m_data);
165 assert(_i < m_count);
166 return m_data[_i];
167 }
168 _T const& operator[](size_t _i) const {
169 assert(m_data);
170 assert(_i < m_count);
171 return m_data[_i];
172 }
173
174 bool operator==(vector_ref<_T> const& _cmp) const { return m_data == _cmp.m_data && m_count == _cmp.m_count; }
175 bool operator!=(vector_ref<_T> const& _cmp) const { return !operator==(_cmp); }
176
177 void reset() {
178 m_data = nullptr;
179 m_count = 0;
180 }
181
182 private:
184 size_t m_count;
185};
186
187template <class _T>
189 return vector_ref<_T const>(&_t, 1);
190}
191template <class _T>
193 return vector_ref<_T>(&_t, 1);
194}
195template <class _T>
196vector_ref<_T const> ref(std::vector<_T> const& _t) {
197 return vector_ref<_T const>(&_t);
198}
199template <class _T>
200vector_ref<_T> ref(std::vector<_T>& _t) {
201 return vector_ref<_T>(&_t);
202}
203
204} // namespace dev
Definition vector_ref.h:23
size_t count() const
Definition vector_ref.h:79
void retarget(_T *_d, size_t _s)
Definition vector_ref.h:110
std::vector< mutable_value_type > toVector() const
Definition vector_ref.h:60
vector_ref< _T > next() const
Definition vector_ref.h:86
void populate(vector_ref< typename std::remove_const< _T >::type > _t) const
Definition vector_ref.h:136
_T * end()
Definition vector_ref.h:159
_T * data() const
Definition vector_ref.h:76
bool overlapsWith(vector_ref< T > _t) const
Definition vector_ref.h:119
vector_ref(_T *_data, size_t _count)
Definition vector_ref.h:37
_T const * end() const
Definition vector_ref.h:161
size_t m_count
Definition vector_ref.h:184
void reset()
Definition vector_ref.h:177
_T * m_data
Definition vector_ref.h:183
_T const * begin() const
Definition vector_ref.h:160
std::vector< unsigned char > toBytes() const
Definition vector_ref.h:61
void cleanse()
Definition vector_ref.h:142
typename std::conditional< std::is_const< _T >::value, typename std::remove_const< _T >::type, _T >::type mutable_value_type
Definition vector_ref.h:28
_T const & operator[](size_t _i) const
Definition vector_ref.h:168
bool operator!=(vector_ref< _T > const &_cmp) const
Definition vector_ref.h:175
bool operator==(vector_ref< _T > const &_cmp) const
Definition vector_ref.h:174
void copyTo(vector_ref< typename std::remove_const< _T >::type > _t) const
Definition vector_ref.h:128
vector_ref(typename std::conditional< std::is_const< _T >::value, std::string const *, std::string * >::type _data)
Definition vector_ref.h:40
bool contentsEqual(std::vector< mutable_value_type > const &_c) const
Definition vector_ref.h:54
size_t size() const
Definition vector_ref.h:82
_T & operator[](size_t _i)
Definition vector_ref.h:163
vector_ref< _T > cropped(size_t _begin) const
Definition vector_ref.h:104
_T value_type
Definition vector_ref.h:25
vector_ref(typename std::conditional< std::is_const< _T >::value, std::string const &, std::string & >::type _data)
Definition vector_ref.h:50
vector_ref(typename std::conditional< std::is_const< _T >::value, std::vector< typename std::remove_const< _T >::type > const *, std::vector< _T > * >::type _data)
Definition vector_ref.h:44
std::string toString() const
Definition vector_ref.h:65
bool empty() const
Definition vector_ref.h:83
_T element_type
Definition vector_ref.h:26
vector_ref< _T > cropped(size_t _begin, size_t _count) const
Definition vector_ref.h:96
_T * begin()
Definition vector_ref.h:158
vector_ref()
Definition vector_ref.h:34
void retarget(std::vector< _T > const &_t)
Definition vector_ref.h:114
Definition Address.h:13
void assertThrowAux(bool _condition, ::std::string const &_errorDescription, unsigned _line, char const *_file, char const *_function)
Definition Assertions.h:53
vector_ref< _T const > ref(_T const &_t)
Definition vector_ref.h:188