6 #ifndef TURI_GL_VECTOR_H_ 7 #define TURI_GL_VECTOR_H_ 9 #include <core/generics/vector_internals.hpp> 10 #include <core/generics/vector_serialization.hpp> 11 #include <core/generics/is_memmovable.hpp> 16 template <
typename _T>
18 static_assert(is_memmovable<_T>::value,
"gl_vector requires T to be memmovable");
20 typedef _T value_type;
22 typedef value_type& reference;
23 typedef const value_type& const_reference;
25 typedef value_type* pointer;
26 typedef const value_type* const_pointer;
28 typedef value_type* iterator;
29 typedef const value_type* const_iterator;
31 typedef std::reverse_iterator<value_type*> reverse_iterator;
32 typedef std::reverse_iterator<const value_type*> const_reverse_iterator;
34 typedef ptrdiff_t difference_type;
35 typedef size_t size_type;
43 gl_vector_internal::_vstruct<value_type> *info;
46 template <
class InputIterator>
47 gl_vector (InputIterator first, InputIterator last, _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type))
48 : info(gl_vector_internal::construct<value_type, InputIterator>(first, last) )
55 explicit gl_vector (size_type n)
56 : info(gl_vector_internal::construct<value_type>(n))
59 gl_vector (size_type n,
const value_type& val)
60 : info(gl_vector_internal::construct<value_type>(n, val))
63 gl_vector (gl_vector&& x) {
70 gl_vector (
const gl_vector& v)
71 : info(gl_vector_internal::construct<value_type>(v.begin(), v.end()))
75 explicit gl_vector (
const std::vector<value_type>& v)
76 : info(gl_vector_internal::construct<value_type>(v.begin(), v.end()))
79 gl_vector (std::initializer_list<value_type> il)
80 : info(gl_vector_internal::construct<value_type>(il.begin(), il.end()) )
83 template <
typename T1>
84 gl_vector (std::initializer_list<T1> il, _VEC_ENABLE_IF_CONVERTABLE(T1, value_type))
85 : info(gl_vector_internal::construct<value_type>(il.begin(), il.end()) )
90 gl_vector_internal::destroy(info);
95 const gl_vector& operator=(
const gl_vector& v) {
100 const gl_vector& operator=(gl_vector&& v) {
101 assign(std::move(v));
105 const gl_vector& operator=(std::initializer_list<value_type> il) {
111 template <typename T, typename = typename std::enable_if<std::is_same<T, value_type>::value>::type>
112 const gl_vector& operator=(
const std::vector<T>& v) {
113 gl_vector_internal::assign(info, v.begin(), v.end());
117 operator std::vector<value_type>()
const {
118 return std::vector<value_type>(cbegin(), cend());
121 const_iterator begin() const noexcept {
return gl_vector_internal::cbegin(info); }
122 iterator begin() noexcept {
return gl_vector_internal::begin(info); }
124 const_reverse_iterator rbegin() const noexcept {
125 return std::reverse_iterator<const_iterator>(end());
128 reverse_iterator rbegin() noexcept {
129 return std::reverse_iterator<iterator>(end());
132 const_iterator end() const noexcept {
return gl_vector_internal::cend(info); }
133 iterator end() noexcept {
return gl_vector_internal::end(info); }
135 reverse_iterator rend() noexcept {
return std::reverse_iterator<iterator>(begin()); }
136 const_reverse_iterator rend() const noexcept {
return std::reverse_iterator<const_iterator>(begin()); }
138 const_iterator cbegin() const noexcept {
return begin(); }
140 const_reverse_iterator crbegin() const noexcept {
return rbegin(); }
142 const_iterator cend() const noexcept {
return end(); }
144 const_reverse_iterator crend() const noexcept {
return rend(); }
146 size_type size() const noexcept {
return gl_vector_internal::size(info); }
148 size_type max_size() const noexcept {
return std::numeric_limits<size_t>::max() /
sizeof(value_type); }
150 inline void resize (size_type n) {
151 if(gl_vector_internal::size(info) != n)
152 gl_vector_internal::resize(info, n);
153 DASSERT_EQ(gl_vector_internal::size(info), n);
156 void resize (size_type n,
const value_type& val) {
157 gl_vector_internal::resize(info, n, val);
160 size_type capacity() const noexcept {
return gl_vector_internal::capacity(info); }
162 bool empty() const noexcept {
166 void reserve (size_type n) {
167 gl_vector_internal::reserve(info, n);
170 void shrink_to_fit() {
171 if(gl_vector_internal::has_excess_storage(info)) {
172 this->swap(gl_vector(this->begin(), this->end()));
176 reference operator[] (size_type idx) _VEC_NDEBUG_NOEXCEPT {
177 return gl_vector_internal::get_element(info, idx);
180 const_reference operator[] (size_type idx)
const _VEC_NDEBUG_NOEXCEPT {
181 return gl_vector_internal::get_element(info, idx);
184 reference at (size_type idx) _VEC_NDEBUG_NOEXCEPT {
185 return gl_vector_internal::get_element(info, idx);
188 const_reference at (size_type idx)
const _VEC_NDEBUG_NOEXCEPT {
189 return gl_vector_internal::get_element(info, idx);
192 reference front() _VEC_NDEBUG_NOEXCEPT {
193 DASSERT_NE(gl_vector_internal::size(info), 0);
194 return gl_vector_internal::get_element(info, 0);
197 const_reference front() const _VEC_NDEBUG_NOEXCEPT {
198 DASSERT_NE(gl_vector_internal::size(info), 0);
199 return gl_vector_internal::get_element(info, 0);
202 reference back() _VEC_NDEBUG_NOEXCEPT {
203 DASSERT_NE(gl_vector_internal::size(info), 0);
204 return gl_vector_internal::get_element(info, info->size - 1);
207 const_reference back() const _VEC_NDEBUG_NOEXCEPT {
208 DASSERT_NE(gl_vector_internal::size(info), 0);
209 return gl_vector_internal::get_element(info, info->size - 1);
212 value_type* data() noexcept {
return info ==
nullptr ? nullptr : info->data; }
214 const value_type* data() const noexcept {
return info ==
nullptr ? nullptr : info->data; }
216 template <
class InputIterator>
217 void assign (
const InputIterator& first,
const InputIterator& last,
218 _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type)) {
219 gl_vector_internal::assign(info, first, last);
222 void assign(size_type n,
const value_type& val) {
223 gl_vector_internal::assign(info, n, val);
226 void assign(std::initializer_list<value_type> il) {
227 gl_vector_internal::assign(info, il);
230 void assign(
const gl_vector& v) {
232 gl_vector_internal::assign(info, v.begin(), v.end());
235 void assign(gl_vector&& v) {
236 gl_vector_internal::assign_move(info, v.info);
239 void push_back (
const value_type& val) {
240 gl_vector_internal::push_back(info, val);
243 void push_back (value_type&& val) {
244 gl_vector_internal::push_back(info, std::forward<value_type>(val));
247 template <
class... Args>
248 iterator emplace (const_iterator position, Args&&... args) {
249 return gl_vector_internal::emplace(info, position, args...);
252 template <
class... Args>
253 void emplace_back (Args&&... args) {
254 gl_vector_internal::emplace_back(info, args...);
258 gl_vector_internal::pop_back(info);
261 iterator insert (const_iterator position, size_type n,
const value_type& val) {
262 return gl_vector_internal::insert(info, position, n, val);
265 template <
typename U>
266 iterator insert (const_iterator position, U&& val) {
267 return gl_vector_internal::insert(info, position, std::forward<U>(val));
270 template <
class InputIterator>
271 iterator insert (const_iterator position, InputIterator first, InputIterator last,
272 _VEC_ENABLE_IF_ITERATOR(InputIterator, value_type) ) {
273 DASSERT_GE(std::distance(first, last), 0);
274 return gl_vector_internal::insert(info, position, first, last);
277 iterator insert (const_iterator position, std::initializer_list<value_type> il) {
278 return gl_vector_internal::insert(info, position, il.begin(), il.end());
281 iterator erase (const_iterator position) {
282 return gl_vector_internal::erase(info, position);
285 iterator erase (const_iterator first, const_iterator last) {
286 return gl_vector_internal::erase(info, first, last);
289 void swap (gl_vector& x) noexcept {
290 std::swap(info, x.info);
293 void swap (gl_vector&& x) noexcept {
294 std::swap(info, x.info);
297 void clear() noexcept {
298 gl_vector_internal::clear(info);
307 bool operator== (
const gl_vector<T>& lhs,
const gl_vector<T>& rhs) {
308 return (lhs.size() == rhs.size()
309 && std::equal(lhs.begin(), lhs.end(), rhs.begin()));
313 bool operator!= (
const gl_vector<T>& lhs,
const gl_vector<T>& rhs) {
314 return !(lhs == rhs);
318 template <
typename T>
319 struct is_memmovable<gl_vector<T>> {
320 static constexpr
bool value = is_memmovable<T>::value;
328 inline void swap (turi::gl_vector<T>& a, turi::gl_vector<T>& b) noexcept {