10 #ifdef __INTEL_COMPILER
11 #pragma warning(disable:597) //will not be called for implicit or explicit conversions
26 using mutable_value_type =
typename std::conditional<std::is_const<_T>::value,
typename std::remove_const<_T>::type, _T>::type;
28 static_assert(std::is_pod<value_type>::value,
"vector_ref can only be used with PODs due to its low-level treatment of data.");
32 vector_ref(_T* _data,
size_t _count): m_data(_data), m_count(_count) {}
34 vector_ref(
typename std::conditional<std::is_const<_T>::value, std::string
const*, std::string*>::type _data): m_data(reinterpret_cast<_T*>(_data->
data())), m_count(_data->
size() / sizeof(_T)) {}
36 vector_ref(
typename std::conditional<std::is_const<_T>::value, std::vector<
typename std::remove_const<_T>::type>
const*, std::vector<_T>*>::type _data): m_data(_data->
data()), m_count(_data->
size()) {}
38 vector_ref(
typename std::conditional<std::is_const<_T>::value, std::string
const&, std::string&>::type _data): m_data(reinterpret_cast<_T*>(_data.
data())), m_count(_data.
size() / sizeof(_T)) {}
39 explicit operator bool()
const {
return m_data && m_count; }
41 bool contentsEqual(std::vector<mutable_value_type>
const& _c)
const {
if (!m_data || m_count == 0)
return _c.empty();
else return _c.size() == m_count && !memcmp(_c.data(), m_data, m_count *
sizeof(_T)); }
42 std::vector<mutable_value_type>
toVector()
const {
return std::vector<mutable_value_type>(m_data, m_data + m_count); }
43 std::vector<unsigned char>
toBytes()
const {
return std::vector<unsigned char>(
reinterpret_cast<unsigned char const*
>(m_data),
reinterpret_cast<unsigned char const*
>(m_data) + m_count *
sizeof(_T)); }
44 std::string
toString()
const {
return std::string((
char const*)m_data, ((
char const*)m_data) + m_count *
sizeof(_T)); }
46 template <
class _T2>
explicit operator vector_ref<_T2>()
const { assert(m_count *
sizeof(_T) /
sizeof(_T2) *
sizeof(_T2) /
sizeof(_T) == m_count);
return vector_ref<_T2>(
reinterpret_cast<_T2*
>(m_data), m_count *
sizeof(_T) /
sizeof(_T2)); }
49 _T*
data()
const {
return m_data; }
51 size_t count()
const {
return m_count; }
53 size_t size()
const {
return m_count; }
54 bool empty()
const {
return !m_count; }
60 vector_ref<_T> cropped(
size_t _begin,
size_t _count)
const {
if (m_data && _begin <= m_count && _count <= m_count && _begin + _count <= m_count)
return vector_ref<_T>(m_data + _begin, _count == ~
size_t(0) ? m_count - _begin : _count);
else return vector_ref<_T>(); }
63 void retarget(_T* _d,
size_t _s) { m_data = _d; m_count = _s; }
64 void retarget(std::vector<_T>
const& _t) { m_data = _t.data(); m_count = _t.size(); }
67 void copyTo(
vector_ref<
typename std::remove_const<_T>::type> _t)
const {
if (
overlapsWith(_t)) memmove(_t.data(), m_data, std::min(_t.size(), m_count) *
sizeof(_T));
else memcpy(_t.data(), m_data, std::min(_t.size(), m_count) *
sizeof(_T)); }
69 void populate(
vector_ref<
typename std::remove_const<_T>::type> _t)
const {
copyTo(_t); memset(_t.data() + m_count, 0, std::max(_t.size(), m_count) - m_count); }
74 static std::atomic<unsigned char> s_cleanseCounter{0u};
75 uint8_t* p = (uint8_t*)
begin();
76 size_t const len = (uint8_t*)
end() - p;
78 size_t count = s_cleanseCounter;
81 *(p++) = (uint8_t)
count;
82 count += (17 + ((size_t)p & 0xf));
84 p = (uint8_t*)memchr((uint8_t*)
begin(), (uint8_t)
count, len);
86 count += (63 + (size_t)p);
87 s_cleanseCounter = (uint8_t)
count;
88 memset((uint8_t*)
begin(), 0, len);
92 _T*
end() {
return m_data + m_count; }
93 _T
const*
begin()
const {
return m_data; }
94 _T
const*
end()
const {
return m_data + m_count; }
96 _T&
operator[](
size_t _i) { assert(m_data); assert(_i < m_count);
return m_data[_i]; }
97 _T
const&
operator[](
size_t _i)
const { assert(m_data); assert(_i < m_count);
return m_data[_i]; }
102 void reset() { m_data =
nullptr; m_count = 0; }