10#ifdef __INTEL_COMPILER
11#pragma warning(disable : 597)
26 conditional<std::is_const<_T>::value,
typename std::remove_const<_T>::type, _T>::type;
28 static_assert(std::is_pod<value_type>::value,
29 "vector_ref can only be used with PODs due to its low-level treatment of data.");
42 typename std::conditional<std::is_const<_T>::value, std::string
const*, std::string*>::type
44 : m_data(reinterpret_cast<_T*>(_data->
data()))
45 , m_count(_data->
size() / sizeof(_T))
48 vector_ref(
typename std::conditional<std::is_const<_T>::value,
49 std::vector<
typename std::remove_const<_T>::type>
const*,
50 std::vector<_T>*>::type _data)
51 : m_data(_data->
data())
52 , m_count(_data->
size())
56 typename std::conditional<std::is_const<_T>::value, std::string
const&, std::string&>::type
58 : m_data(reinterpret_cast<_T*>(_data.
data()))
59 , m_count(_data.
size() / sizeof(_T))
61 explicit operator bool()
const {
return m_data && m_count; }
65 if (!m_data || m_count == 0)
68 return _c.size() == m_count && !memcmp(_c.data(), m_data, m_count *
sizeof(_T));
70 std::vector<mutable_value_type>
toVector()
const
72 return std::vector<mutable_value_type>(m_data, m_data + m_count);
74 std::vector<unsigned char>
toBytes()
const
76 return std::vector<unsigned char>(
reinterpret_cast<unsigned char const*
>(m_data),
77 reinterpret_cast<unsigned char const*
>(m_data)
78 + m_count *
sizeof(_T));
82 return std::string((
char const*) m_data, ((
char const*) m_data) + m_count *
sizeof(_T));
88 assert(m_count *
sizeof(_T) /
sizeof(_T2) *
sizeof(_T2) /
sizeof(_T) == m_count);
89 return vector_ref<_T2>(
reinterpret_cast<_T2*
>(m_data), m_count *
sizeof(_T) /
sizeof(_T2));
93 _T*
data()
const {
return m_data; }
95 size_t count()
const {
return m_count; }
97 size_t size()
const {
return m_count; }
98 bool empty()
const {
return !m_count; }
112 if (m_data && _begin <= m_count && _count <= m_count && _begin + _count <= m_count)
113 return vector_ref<_T>(m_data + _begin, _count == ~
size_t(0) ? m_count - _begin : _count);
120 if (m_data && _begin <= m_count)
139 static std::atomic<unsigned char> s_cleanseCounter {0u};
140 uint8_t* p = (uint8_t*)
begin();
141 size_t const len = (uint8_t*)
end() - p;
143 size_t count = s_cleanseCounter;
145 *(p++) = (uint8_t)
count;
146 count += (17 + ((size_t) p & 0xf));
148 p = (uint8_t*) memchr((uint8_t*)
begin(), (uint8_t)
count, len);
150 count += (63 + (size_t) p);
151 s_cleanseCounter = (uint8_t)
count;
152 memset((uint8_t*)
begin(), 0, len);
156 _T*
end() {
return m_data + m_count; }
157 _T
const*
begin()
const {
return m_data; }
158 _T
const*
end()
const {
return m_data + m_count; }
163 assert(_i < m_count);
169 assert(_i < m_count);
175 return m_data == _cmp.m_data && m_count == _cmp.m_count;
204ref(std::vector<_T>
const& _t)
A modifiable reference to an existing object or vector in memory.
void retarget(_T *_d, size_t _s)
std::vector< mutable_value_type > toVector() const
vector_ref< _T > next() const
vector_ref(_T *_data, size_t _count)
Creates a new vector_ref to point to _count elements starting at _data.
std::vector< unsigned char > toBytes() const
void cleanse()
Securely overwrite the memory.
_T const & operator[](size_t _i) const
typename std::conditional< std::is_const< _T >::value, typename std::remove_const< _T >::type, _T >::type mutable_value_type
bool operator!=(vector_ref< _T > const &_cmp) const
bool operator==(vector_ref< _T > const &_cmp) const
vector_ref(typename std::conditional< std::is_const< _T >::value, std::string const *, std::string * >::type _data)
Creates a new vector_ref pointing to the data part of a string (given as pointer).
bool contentsEqual(std::vector< mutable_value_type > const &_c) const
_T & operator[](size_t _i)
vector_ref< _T > cropped(size_t _begin) const
vector_ref(typename std::conditional< std::is_const< _T >::value, std::string const &, std::string & >::type _data)
Creates a new vector_ref pointing to the data part of a string (given as reference).
vector_ref(typename std::conditional< std::is_const< _T >::value, std::vector< typename std::remove_const< _T >::type > const *, std::vector< _T > * >::type _data)
Creates a new vector_ref pointing to the data part of a vector (given as pointer).
std::string toString() const
vector_ref< _T > cropped(size_t _begin, size_t _count) const
void retarget(std::vector< _T > const &_t)
vector_ref< _T const > ref(_T const &_t)