24 #include "meta_utils.hpp" 38 class mutable_array_ref
41 typedef size_t size_type;
43 mutable_array_ref() :_data(nullptr), _size(0) {}
44 mutable_array_ref(T& val) :_data(&val), _size(1) {}
45 mutable_array_ref(T* data,
size_t size) :_data(data), _size(size) {}
48 mutable_array_ref(T(&arr)[N]) : _data(arr), _size(N) {}
50 mutable_array_ref(
const mutable_array_ref& other) : _data(other._data), _size(other._size) {}
52 mutable_array_ref& operator=(
const mutable_array_ref& other)
61 T* data()
const {
return _data; }
62 size_t size()
const {
return _size; }
63 bool empty()
const {
return _size == 0; }
65 #if defined(_SECURE_SCL) && (_SECURE_SCL > 0) 66 typedef stdext::checked_array_iterator<T*> iterator;
67 typedef stdext::checked_array_iterator<const T*> const_iterator;
68 iterator begin()
const {
return stdext::make_checked_array_iterator(_data, _size); }
69 iterator end()
const {
return stdext::make_checked_array_iterator(_data, _size, _size); }
70 const_iterator cbegin()
const {
return stdext::make_checked_array_iterator(_data, _size); }
71 const_iterator cend()
const {
return stdext::make_checked_array_iterator(_data, _size, _size); }
74 typedef T* const_iterator;
75 iterator begin()
const {
return _data; }
76 iterator end()
const {
return _data + _size; }
77 const_iterator cbegin()
const {
return _data; }
78 const_iterator cend()
const {
return _data + _size; }
82 T& operator[](
size_t idx)
const 88 T& at(
size_t idx)
const 90 if (idx >= _size)
throw std::out_of_range(
"idx");
94 std::vector<T> vector()
const {
return std::vector<T>(_data, _data + _size); }
104 typedef size_t size_type;
106 array_ref() :_data(nullptr), _size(0) {}
107 array_ref(
const T& val) :_data(&val), _size(1) {}
108 array_ref(
const T* data,
size_t size) :_data(data), _size(size) {}
111 array_ref(
const std::vector<T, A>& vec) : _data(vec.data()), _size(vec.size()) {}
114 array_ref(
const T(&arr)[N]) : _data(arr), _size(N) {}
116 array_ref(
const mutable_array_ref<T>& other) : _data(other.data()), _size(other.size()){}
118 array_ref(
const array_ref& other) : _data(other._data), _size(other._size) {}
120 array_ref& operator=(
const array_ref& other)
129 const T* data()
const {
return _data; }
130 size_t size()
const {
return _size; }
131 bool empty()
const {
return _size == 0; }
133 #if defined(_SECURE_SCL) && (_SECURE_SCL > 0) 134 typedef stdext::checked_array_iterator<const T*> iterator;
135 typedef stdext::checked_array_iterator<const T*> const_iterator;
136 iterator begin()
const {
return stdext::make_checked_array_iterator(_data, _size); }
137 iterator end()
const {
return stdext::make_checked_array_iterator(_data, _size, _size); }
138 const_iterator cbegin()
const {
return stdext::make_checked_array_iterator(_data, _size); }
139 const_iterator cend()
const {
return stdext::make_checked_array_iterator(_data, _size, _size); }
141 typedef const T* iterator;
142 typedef const T* const_iterator;
143 iterator begin()
const {
return _data; }
144 iterator end()
const {
return _data + _size; }
145 const_iterator cbegin()
const {
return _data; }
146 const_iterator cend()
const {
return _data + _size; }
149 const T& operator[](
size_t idx)
const 155 const T& at(
size_t idx)
const 157 if (idx >= _size)
throw std::out_of_range(
"idx");
161 std::vector<T> vector()
const {
return std::vector<T>(_data, _data + _size); }
170 template<
typename Char>
size_t basic_strlen(
const Char*)
172 static_assert(meta::always_false<Char>::value,
"basic_strlen<Char> for selected Char type is deleted.");
177 inline size_t basic_strlen(
const char* str) {
return std::strlen(str); }
180 inline size_t basic_strlen(
const wchar_t* str) {
return std::wcslen(str); }
182 template<
typename Char>
183 class basic_string_ref
186 typedef const Char* iterator;
187 typedef const Char* const_iterator;
188 typedef size_t size_type;
194 basic_string_ref() :_data(nullptr), _size(0) {}
195 basic_string_ref(
const Char* str) : _data(str), _size(basic_strlen(str)) {}
197 template<
typename T,
typename A>
198 basic_string_ref(
const std::basic_string<Char, T, A>& str) : _data(str.c_str()), _size(str.size()) {}
200 basic_string_ref(
const basic_string_ref& other) : _data(other._data), _size(other._size) {}
202 basic_string_ref& operator=(
const basic_string_ref& other)
211 const Char* data()
const {
return _data; }
212 const Char* c_str()
const {
return _data; }
213 size_t size()
const {
return _size; }
214 size_t length()
const {
return _size; }
215 bool empty()
const {
return _size == 0; }
217 iterator begin()
const {
return _data; }
218 iterator end()
const {
return _data + _size; }
219 const_iterator cbegin()
const {
return begin(); }
220 const_iterator cend()
const {
return end(); }
222 const Char& operator[](
size_t idx)
228 std::basic_string<Char> str()
const {
return std::basic_string<Char>(_data, _size); }
229 operator std::basic_string<Char>()
const {
return str(); }
232 typedef basic_string_ref<char> string_ref;
233 typedef basic_string_ref<wchar_t> wstring_ref;