diff options
Diffstat (limited to 'tests/libcxx/include/vector')
-rw-r--r-- | tests/libcxx/include/vector | 2786 |
1 files changed, 0 insertions, 2786 deletions
diff --git a/tests/libcxx/include/vector b/tests/libcxx/include/vector deleted file mode 100644 index 7c0fc705..00000000 --- a/tests/libcxx/include/vector +++ /dev/null @@ -1,2786 +0,0 @@ -// -*- C++ -*- -//===------------------------------ vector --------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP_VECTOR -#define _LIBCPP_VECTOR - -/* - vector synopsis - -namespace std -{ - -template <class T, class Allocator = allocator<T> > -class vector -{ -public: - typedef T value_type; - typedef Allocator allocator_type; - typedef typename allocator_type::reference reference; - typedef typename allocator_type::const_reference const_reference; - typedef implementation-defined iterator; - typedef implementation-defined const_iterator; - typedef typename allocator_type::size_type size_type; - typedef typename allocator_type::difference_type difference_type; - typedef typename allocator_type::pointer pointer; - typedef typename allocator_type::const_pointer const_pointer; - typedef std::reverse_iterator<iterator> reverse_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - - explicit vector(const allocator_type& = allocator_type()); - explicit vector(size_type n); - vector(size_type n, const value_type& value, const allocator_type& = allocator_type()); - template <class InputIterator> - vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); - vector(const vector& x); - vector(vector&& x); - vector(initializer_list<value_type> il); - vector(initializer_list<value_type> il, const allocator_type& a); - ~vector(); - vector& operator=(const vector& x); - vector& operator=(vector&& x); - vector& operator=(initializer_list<value_type> il); - template <class InputIterator> - void assign(InputIterator first, InputIterator last); - void assign(size_type n, const value_type& u); - void assign(initializer_list<value_type> il); - - allocator_type get_allocator() const; - - iterator begin(); - const_iterator begin() const; - iterator end(); - const_iterator end() const; - - reverse_iterator rbegin(); - const_reverse_iterator rbegin() const; - reverse_iterator rend(); - const_reverse_iterator rend() const; - - const_iterator cbegin() const; - const_iterator cend() const; - const_reverse_iterator crbegin() const; - const_reverse_iterator crend() const; - - size_type size() const; - size_type max_size() const; - size_type capacity() const; - bool empty() const; - void reserve(size_type n); - void shrink_to_fit(); - - reference operator[](size_type n); - const_reference operator[](size_type n) const; - reference at(size_type n); - const_reference at(size_type n) const; - - reference front(); - const_reference front() const; - reference back(); - const_reference back() const; - - value_type* data(); - const value_type* data() const; - - void push_back(const value_type& x); - void push_back(value_type&& x); - template <class... Args> - void emplace_back(Args&&... args); - void pop_back(); - - template <class... Args> iterator emplace(const_iterator position, Args&&... args); - iterator insert(const_iterator position, const value_type& x); - iterator insert(const_iterator position, value_type&& x); - iterator insert(const_iterator position, size_type n, const value_type& x); - template <class InputIterator> - iterator insert(const_iterator position, InputIterator first, InputIterator last); - iterator insert(const_iterator position, initializer_list<value_type> il); - - iterator erase(const_iterator position); - iterator erase(const_iterator first, const_iterator last); - - void clear(); - - void resize(size_type sz); - void resize(size_type sz, const value_type& c); - - void swap(vector&); - - bool __invariants() const; -}; - -template <class Allocator = allocator<T> > -class vector<bool, Allocator> -{ -public: - typedef bool value_type; - typedef Allocator allocator_type; - typedef implementation-defined iterator; - typedef implementation-defined const_iterator; - typedef typename allocator_type::size_type size_type; - typedef typename allocator_type::difference_type difference_type; - typedef iterator pointer; - typedef const_iterator const_pointer; - typedef std::reverse_iterator<iterator> reverse_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - - class reference - { - public: - reference(const reference&); - operator bool() const; - reference& operator=(const bool x); - reference& operator=(const reference& x); - iterator operator&() const; - void flip(); - }; - - class const_reference - { - public: - const_reference(const reference&); - operator bool() const; - const_iterator operator&() const; - }; - - explicit vector(const allocator_type& = allocator_type()); - explicit vector(size_type n, const value_type& value = value_type(), const allocator_type& = allocator_type()); - template <class InputIterator> - vector(InputIterator first, InputIterator last, const allocator_type& = allocator_type()); - vector(const vector& x); - vector(vector&& x); - vector(initializer_list<value_type> il); - vector(initializer_list<value_type> il, const allocator_type& a); - ~vector(); - vector& operator=(const vector& x); - vector& operator=(vector&& x); - vector& operator=(initializer_list<value_type> il); - template <class InputIterator> - void assign(InputIterator first, InputIterator last); - void assign(size_type n, const value_type& u); - void assign(initializer_list<value_type> il); - - allocator_type get_allocator() const; - - iterator begin(); - const_iterator begin() const; - iterator end(); - const_iterator end() const; - - reverse_iterator rbegin(); - const_reverse_iterator rbegin() const; - reverse_iterator rend(); - const_reverse_iterator rend() const; - - const_iterator cbegin() const; - const_iterator cend() const; - const_reverse_iterator crbegin() const; - const_reverse_iterator crend() const; - - size_type size() const; - size_type max_size() const; - size_type capacity() const; - bool empty() const; - void reserve(size_type n); - void shrink_to_fit(); - - reference operator[](size_type n); - const_reference operator[](size_type n) const; - reference at(size_type n); - const_reference at(size_type n) const; - - reference front(); - const_reference front() const; - reference back(); - const_reference back() const; - - void push_back(const value_type& x); - void pop_back(); - - iterator insert(const_iterator position, const value_type& x); - iterator insert(const_iterator position, size_type n, const value_type& x); - template <class InputIterator> - iterator insert(const_iterator position, InputIterator first, InputIterator last); - iterator insert(const_iterator position, initializer_list<value_type> il); - - iterator erase(const_iterator position); - iterator erase(const_iterator first, const_iterator last); - - void clear(); - - void resize(size_type sz); - void resize(size_type sz, value_type x); - - void swap(vector&); - void flip(); - - bool __invariants() const; -}; - -template <class Allocator> struct hash<std::vector<bool, Allocator>>; - -template <class T, class Allocator> bool operator==(const vector<T,Allocator>& x, const vector<T,Allocator>& y); -template <class T, class Allocator> bool operator< (const vector<T,Allocator>& x, const vector<T,Allocator>& y); -template <class T, class Allocator> bool operator!=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); -template <class T, class Allocator> bool operator> (const vector<T,Allocator>& x, const vector<T,Allocator>& y); -template <class T, class Allocator> bool operator>=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); -template <class T, class Allocator> bool operator<=(const vector<T,Allocator>& x, const vector<T,Allocator>& y); - -template <class T, class Allocator> void swap(vector<T,Allocator>& x, vector<T,Allocator>& y); - -} // std - -*/ - -#include <__config> -#include <__bit_reference> -#include <type_traits> -#include <climits> -#include <limits> -#include <initializer_list> -#include <memory> -#include <stdexcept> -#include <algorithm> -#include <cstring> -#include <__split_buffer> -#include <__functional_base> -#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_NO_EXCEPTIONS) - #include <cassert> -#endif - -#pragma GCC system_header - -_LIBCPP_BEGIN_NAMESPACE_STD - -template <bool> -class __vector_base_common -{ -protected: - _LIBCPP_ALWAYS_INLINE __vector_base_common() {} - void __throw_length_error() const; - void __throw_out_of_range() const; -}; - -template <bool __b> -void -__vector_base_common<__b>::__throw_length_error() const -{ -#ifndef _LIBCPP_NO_EXCEPTIONS - throw length_error("vector"); -#else - assert(!"vector length_error"); -#endif -} - -template <bool __b> -void -__vector_base_common<__b>::__throw_out_of_range() const -{ -#ifndef _LIBCPP_NO_EXCEPTIONS - throw out_of_range("vector"); -#else - assert(!"vector out_of_range"); -#endif -} - -extern template class __vector_base_common<true>; - -template <class _Tp, class _Allocator> -class __vector_base - : protected __vector_base_common<true> -{ -protected: - typedef _Tp value_type; - typedef _Allocator allocator_type; - typedef allocator_traits<allocator_type> __alloc_traits; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef typename __alloc_traits::size_type size_type; - typedef typename __alloc_traits::difference_type difference_type; - typedef typename __alloc_traits::pointer pointer; - typedef typename __alloc_traits::const_pointer const_pointer; - typedef pointer iterator; - typedef const_pointer const_iterator; - - pointer __begin_; - pointer __end_; - __compressed_pair<pointer, allocator_type> __end_cap_; - - _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __end_cap_.second();} - _LIBCPP_INLINE_VISIBILITY const allocator_type& __alloc() const {return __end_cap_.second();} - _LIBCPP_INLINE_VISIBILITY pointer& __end_cap() {return __end_cap_.first();} - _LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const {return __end_cap_.first();} - - _LIBCPP_INLINE_VISIBILITY __vector_base(); - _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a); - ~__vector_base(); - - _LIBCPP_INLINE_VISIBILITY void clear() {__destruct_at_end(__begin_);} - _LIBCPP_INLINE_VISIBILITY size_type capacity() const {return static_cast<size_type>(__end_cap() - __begin_);} - - _LIBCPP_INLINE_VISIBILITY void __destruct_at_end(const_pointer __new_last) - {__destruct_at_end(__new_last, is_trivially_destructible<value_type>());} - _LIBCPP_INLINE_VISIBILITY void __destruct_at_end(const_pointer __new_last, false_type); - _LIBCPP_INLINE_VISIBILITY void __destruct_at_end(const_pointer __new_last, true_type); - - _LIBCPP_INLINE_VISIBILITY - void __copy_assign_alloc(const __vector_base& __c) - {__copy_assign_alloc(__c, integral_constant<bool, - __alloc_traits::propagate_on_container_copy_assignment::value>());} - - _LIBCPP_INLINE_VISIBILITY - void __move_assign_alloc(__vector_base& __c) - {__move_assign_alloc(__c, integral_constant<bool, - __alloc_traits::propagate_on_container_move_assignment::value>());} - - _LIBCPP_INLINE_VISIBILITY - static void __swap_alloc(allocator_type& __x, allocator_type& __y) - {__swap_alloc(__x, __y, integral_constant<bool, - __alloc_traits::propagate_on_container_swap::value>());} -private: - _LIBCPP_INLINE_VISIBILITY - void __copy_assign_alloc(const __vector_base& __c, true_type) - { - if (__alloc() != __c.__alloc()) - { - clear(); - __alloc_traits::deallocate(__alloc(), __begin_, capacity()); - __begin_ = __end_ = __end_cap() = nullptr; - } - __alloc() = __c.__alloc(); - } - - _LIBCPP_INLINE_VISIBILITY - void __copy_assign_alloc(const __vector_base& __c, false_type) - {} - - _LIBCPP_INLINE_VISIBILITY - void __move_assign_alloc(const __vector_base& __c, true_type) - { - __alloc() = _STD::move(__c.__alloc()); - } - - _LIBCPP_INLINE_VISIBILITY - void __move_assign_alloc(const __vector_base& __c, false_type) - {} - - _LIBCPP_INLINE_VISIBILITY - static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) - { - using _STD::swap; - swap(__x, __y); - } - _LIBCPP_INLINE_VISIBILITY - static void __swap_alloc(allocator_type& __x, allocator_type& __y, false_type) - {} -}; - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -void -__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, false_type) -{ - while (__new_last < __end_) - __alloc_traits::destroy(__alloc(), const_cast<pointer>(--__end_)); -} - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -void -__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, true_type) -{ - __end_ = const_cast<pointer>(__new_last); -} - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -__vector_base<_Tp, _Allocator>::__vector_base() - : __begin_(0), - __end_(0), - __end_cap_(0) -{ -} - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -__vector_base<_Tp, _Allocator>::__vector_base(const allocator_type& __a) - : __begin_(0), - __end_(0), - __end_cap_(0, __a) -{ -} - -template <class _Tp, class _Allocator> -__vector_base<_Tp, _Allocator>::~__vector_base() -{ - if (__begin_ != 0) - { - clear(); - __alloc_traits::deallocate(__alloc(), __begin_, capacity()); - } -} - -template <class _Tp, class _Allocator = allocator<_Tp> > -class _LIBCPP_VISIBLE vector - : private __vector_base<_Tp, _Allocator> -{ -private: - typedef __vector_base<_Tp, _Allocator> __base; -public: - typedef vector __self; - typedef _Tp value_type; - typedef _Allocator allocator_type; - typedef typename __base::__alloc_traits __alloc_traits; - typedef typename __base::reference reference; - typedef typename __base::const_reference const_reference; - typedef typename __base::size_type size_type; - typedef typename __base::difference_type difference_type; - typedef typename __base::pointer pointer; - typedef typename __base::const_pointer const_pointer; -#ifdef _LIBCPP_DEBUG - typedef __debug_iter<vector, pointer> iterator; - typedef __debug_iter<vector, const_pointer> const_iterator; - - friend class __debug_iter<vector, pointer>; - friend class __debug_iter<vector, const_pointer>; - - pair<iterator*, const_iterator*> __iterator_list_; - - _LIBCPP_INLINE_VISIBILITY iterator*& __get_iterator_list(iterator*) {return __iterator_list_.first;} - _LIBCPP_INLINE_VISIBILITY const_iterator*& __get_iterator_list(const_iterator*) {return __iterator_list_.second;} -#elif defined(_LIBCPP_RAW_ITERATORS) - typedef pointer iterator; - typedef const_pointer const_iterator; -#else // defined(_LIBCPP_RAW_ITERATORS) - typedef __wrap_iter<pointer> iterator; - typedef __wrap_iter<const_pointer> const_iterator; -#endif // defined(_LIBCPP_RAW_ITERATORS) - typedef _STD::reverse_iterator<iterator> reverse_iterator; - typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator; - - _LIBCPP_INLINE_VISIBILITY vector() {} - _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a) : __base(__a) {} - explicit vector(size_type __n); - vector(size_type __n, const_reference __x); - vector(size_type __n, const_reference __x, const allocator_type& __a); - template <class _InputIterator> - vector(_InputIterator __first, _InputIterator __last, - typename enable_if<__is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value>::type* = 0); - template <class _InputIterator> - vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, - typename enable_if<__is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value>::type* = 0); - template <class _ForwardIterator> - vector(_ForwardIterator __first, _ForwardIterator __last, - typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0); - template <class _ForwardIterator> - vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, - typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type* = 0); - _LIBCPP_INLINE_VISIBILITY - vector(initializer_list<value_type> __il); - _LIBCPP_INLINE_VISIBILITY - vector(initializer_list<value_type> __il, const allocator_type& __a); -#ifdef _LIBCPP_DEBUG - _LIBCPP_INLINE_VISIBILITY - ~vector() {__invalidate_all_iterators();} -#endif - - vector(const vector& __x); - vector(const vector& __x, const allocator_type& __a); - _LIBCPP_INLINE_VISIBILITY - vector& operator=(const vector& __x); -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - _LIBCPP_INLINE_VISIBILITY - vector(vector&& __x); - _LIBCPP_INLINE_VISIBILITY - vector(vector&& __x, const allocator_type& __a); - _LIBCPP_INLINE_VISIBILITY - vector& operator=(vector&& __x); -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES - _LIBCPP_INLINE_VISIBILITY - vector& operator=(initializer_list<value_type> __il) - {assign(__il.begin(), __il.end()); return *this;} - - template <class _InputIterator> - typename enable_if - < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, - void - >::type - assign(_InputIterator __first, _InputIterator __last); - template <class _ForwardIterator> - typename enable_if - < - __is_forward_iterator<_ForwardIterator>::value, - void - >::type - assign(_ForwardIterator __first, _ForwardIterator __last); - - void assign(size_type __n, const_reference __u); - _LIBCPP_INLINE_VISIBILITY - void assign(initializer_list<value_type> __il) - {assign(__il.begin(), __il.end());} - - _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const {return this->__alloc();} - - _LIBCPP_INLINE_VISIBILITY iterator begin(); - _LIBCPP_INLINE_VISIBILITY const_iterator begin() const; - _LIBCPP_INLINE_VISIBILITY iterator end(); - _LIBCPP_INLINE_VISIBILITY const_iterator end() const; - - _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() {return reverse_iterator(end());} - _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} - _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() {return reverse_iterator(begin());} - _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const {return const_reverse_iterator(begin());} - - _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const {return begin();} - _LIBCPP_INLINE_VISIBILITY const_iterator cend() const {return end();} - _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const {return rbegin();} - _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const {return rend();} - - _LIBCPP_INLINE_VISIBILITY size_type size() const {return static_cast<size_type>(this->__end_ - this->__begin_);} - _LIBCPP_INLINE_VISIBILITY size_type capacity() const {return __base::capacity();} - _LIBCPP_INLINE_VISIBILITY bool empty() const {return this->__begin_ == this->__end_;} - size_type max_size() const; - void reserve(size_type __n); - void shrink_to_fit(); - - _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n); - _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const; - reference at(size_type __n); - const_reference at(size_type __n) const; - - _LIBCPP_INLINE_VISIBILITY reference front() {return *this->__begin_;} - _LIBCPP_INLINE_VISIBILITY const_reference front() const {return *this->__begin_;} - _LIBCPP_INLINE_VISIBILITY reference back() {return *(this->__end_ - 1);} - _LIBCPP_INLINE_VISIBILITY const_reference back() const {return *(this->__end_ - 1);} - - _LIBCPP_INLINE_VISIBILITY value_type* data() - {return _STD::__to_raw_pointer(this->__begin_);} - _LIBCPP_INLINE_VISIBILITY const value_type* data() const - {return _STD::__to_raw_pointer(this->__begin_);} - - _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x); -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - void push_back(value_type&& __x); -#ifndef _LIBCPP_HAS_NO_VARIADICS - template <class... _Args> - void emplace_back(_Args&&... __args); -#endif // _LIBCPP_HAS_NO_VARIADICS -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES - void pop_back(); - - iterator insert(const_iterator __position, const_reference __x); -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - iterator insert(const_iterator __position, value_type&& __x); -#ifndef _LIBCPP_HAS_NO_VARIADICS - template <class... _Args> - iterator emplace(const_iterator __position, _Args&&... __args); -#endif // _LIBCPP_HAS_NO_VARIADICS -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES - iterator insert(const_iterator __position, size_type __n, const_reference __x); - template <class _InputIterator> - typename enable_if - < - __is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value, - iterator - >::type - insert(const_iterator __position, _InputIterator __first, _InputIterator __last); - template <class _ForwardIterator> - typename enable_if - < - __is_forward_iterator<_ForwardIterator>::value, - iterator - >::type - insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); - _LIBCPP_INLINE_VISIBILITY - iterator insert(const_iterator __position, initializer_list<value_type> __il) - {return insert(__position, __il.begin(), __il.end());} - - _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); - iterator erase(const_iterator __first, const_iterator __last); - - _LIBCPP_INLINE_VISIBILITY void clear() {__base::clear();} - - void resize(size_type __sz); - void resize(size_type __sz, const_reference __x); - - void swap(vector&); - - bool __invariants() const; - -private: - _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); - void allocate(size_type __n); - void deallocate(); - _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const; - void __construct_at_end(size_type __n); - void __construct_at_end(size_type __n, const_reference __x); - template <class _ForwardIterator> - typename enable_if - < - __is_forward_iterator<_ForwardIterator>::value, - void - >::type - __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); - void __move_construct_at_end(pointer __first, pointer __last); - void __append(size_type __n); - void __append(size_type __n, const_reference __x); - _LIBCPP_INLINE_VISIBILITY - iterator __make_iter(pointer __p); - _LIBCPP_INLINE_VISIBILITY - const_iterator __make_iter(const_pointer __p) const; - void __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v); - pointer __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p); - void __move_range(pointer __from_s, pointer __from_e, pointer __to); - void __move_assign(vector& __c, true_type); - void __move_assign(vector& __c, false_type); -}; - -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) -{ - for (pointer __p = this->__end_; this->__begin_ < __p;) - __v.push_front(_STD::move(*--__p)); - _STD::swap(this->__begin_, __v.__begin_); - _STD::swap(this->__end_, __v.__end_); - _STD::swap(this->__end_cap(), __v.__end_cap()); - __v.__first_ = __v.__begin_; - __invalidate_all_iterators(); -} - -template <class _Tp, class _Allocator> -typename vector<_Tp, _Allocator>::pointer -vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p) -{ - pointer __r = __v.__begin_; - for (pointer __i = __p; this->__begin_ < __i;) - __v.push_front(_STD::move(*--__i)); - for (pointer __i = __p; __i < this->__end_; ++__i) - __v.push_back(_STD::move(*__i)); - _STD::swap(this->__begin_, __v.__begin_); - _STD::swap(this->__end_, __v.__end_); - _STD::swap(this->__end_cap(), __v.__end_cap()); - __v.__first_ = __v.__begin_; - __invalidate_all_iterators(); - return __r; -} - -// Allocate space for __n objects -// throws length_error if __n > max_size() -// throws (probably bad_alloc) if memory run out -// Precondition: __begin_ == __end_ == __end_cap() == 0 -// Precondition: __n > 0 -// Postcondition: capacity() == __n -// Postcondition: size() == 0 -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::allocate(size_type __n) -{ - if (__n > max_size()) - this->__throw_length_error(); - this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n); - this->__end_cap() = this->__begin_ + __n; -} - -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::deallocate() -{ - if (this->__begin_ != 0) - { - clear(); - __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity()); - __invalidate_all_iterators(); - this->__begin_ = this->__end_ = this->__end_cap() = 0; - } -} - -template <class _Tp, class _Allocator> -typename vector<_Tp, _Allocator>::size_type -vector<_Tp, _Allocator>::max_size() const -{ - return _STD::min(__alloc_traits::max_size(this->__alloc()), numeric_limits<size_type>::max() / 2); // end() >= begin(), always -} - -// Precondition: __new_size > capacity() -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -typename vector<_Tp, _Allocator>::size_type -vector<_Tp, _Allocator>::__recommend(size_type __new_size) const -{ - const size_type __ms = max_size(); - if (__new_size > __ms) - this->__throw_length_error(); - const size_type __cap = capacity(); - if (__cap >= __ms / 2) - return __ms; - return _STD::max(2*__cap, __new_size); -} - -// Default constructs __n objects starting at __end_ -// throws if construction throws -// Precondition: __n > 0 -// Precondition: size() + __n <= capacity() -// Postcondition: size() == size() + __n -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::__construct_at_end(size_type __n) -{ - allocator_type& __a = this->__alloc(); - do - { - __alloc_traits::construct(__a, _STD::__to_raw_pointer(this->__end_)); - ++this->__end_; - --__n; - } while (__n > 0); -} - -// Copy constructs __n objects starting at __end_ from __x -// throws if construction throws -// Precondition: __n > 0 -// Precondition: size() + __n <= capacity() -// Postcondition: size() == old size() + __n -// Postcondition: [i] == __x for all i in [size() - __n, __n) -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -void -vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) -{ - allocator_type& __a = this->__alloc(); - do - { - __alloc_traits::construct(__a, _STD::__to_raw_pointer(this->__end_), __x); - ++this->__end_; - --__n; - } while (__n > 0); -} - -template <class _Tp, class _Allocator> -template <class _ForwardIterator> -typename enable_if -< - __is_forward_iterator<_ForwardIterator>::value, - void ->::type -vector<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) -{ - allocator_type& __a = this->__alloc(); - for (; __first != __last; ++__first) - { - __alloc_traits::construct(__a, _STD::__to_raw_pointer(this->__end_), *__first); - ++this->__end_; - } -} - -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::__move_construct_at_end(pointer __first, pointer __last) -{ - allocator_type& __a = this->__alloc(); - for (; __first != __last; ++__first) - { - __alloc_traits::construct(__a, _STD::__to_raw_pointer(this->__end_), - _STD::move(*__first)); - ++this->__end_; - } -} - -// Default constructs __n objects starting at __end_ -// throws if construction throws -// Postcondition: size() == size() + __n -// Exception safety: strong but assumes move ctor doesn't throw (copy ctor can) -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::__append(size_type __n) -{ - if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) - this->__construct_at_end(__n); - else - { - allocator_type& __a = this->__alloc(); - __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); - __v.__construct_at_end(__n); - __swap_out_circular_buffer(__v); - } -} - -// Default constructs __n objects starting at __end_ -// throws if construction throws -// Postcondition: size() == size() + __n -// Exception safety: strong but assumes move ctor doesn't throw (copy ctor can) -template <class _Tp, class _Allocator> -void -vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x) -{ - if (static_cast<size_type>(this->__end_cap() - this->__end_) >= __n) - this->__construct_at_end(__n, __x); - else - { - allocator_type& __a = this->__alloc(); - __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), __a); - __v.__construct_at_end(__n, __x); - __swap_out_circular_buffer(__v); - } -} - -template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(size_type __n) -{ - if (__n > 0) - { - allocate(__n); - __construct_at_end(__n); - } -} - -template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x) -{ - if (__n > 0) - { - allocate(__n); - __construct_at_end(__n, __x); - } -} - -template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(size_type __n, const_reference __x, const allocator_type& __a) - : __base(__a) -{ - if (__n > 0) - { - allocate(__n); - __construct_at_end(__n, __x); - } -} - -template <class _Tp, class _Allocator> -template <class _InputIterator> -vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, - typename enable_if<__is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value>::type*) -{ - for (; __first != __last; ++__first) - push_back(*__first); -} - -template <class _Tp, class _Allocator> -template <class _InputIterator> -vector<_Tp, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, - typename enable_if<__is_input_iterator <_InputIterator>::value && - !__is_forward_iterator<_InputIterator>::value>::type*) - : __base(__a) -{ - for (; __first != __last; ++__first) - push_back(*__first); -} - -template <class _Tp, class _Allocator> -template <class _ForwardIterator> -vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, - typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) -{ - size_type __n = static_cast<size_type>(_STD::distance(__first, __last)); - if (__n > 0) - { - allocate(__n); - __construct_at_end(__first, __last); - } -} - -template <class _Tp, class _Allocator> -template <class _ForwardIterator> -vector<_Tp, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, - typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) - : __base(__a) -{ - size_type __n = static_cast<size_type>(_STD::distance(__first, __last)); - if (__n > 0) - { - allocate(__n); - __construct_at_end(__first, __last); - } -} - -template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(const vector& __x) - : __base(__alloc_traits::select_on_container_copy_construction(__x.__alloc())) -{ - size_type __n = __x.size(); - if (__n > 0) - { - allocate(__n); - __construct_at_end(__x.__begin_, __x.__end_); - } -} - -template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(const vector& __x, const allocator_type& __a) - : __base(__a) -{ - size_type __n = __x.size(); - if (__n > 0) - { - allocate(__n); - __construct_at_end(__x.__begin_, __x.__end_); - } -} - -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -vector<_Tp, _Allocator>::vector(vector&& __x) - : __base(_STD::move(__x.__alloc())) -{ - this->__begin_ = __x.__begin_; - this->__end_ = __x.__end_; - this->__end_cap() = __x.__end_cap(); - __x.__begin_ = __x.__end_ = __x.__end_cap() = 0; - __x.__invalidate_all_iterators(); -} - -template <class _Tp, class _Allocator> -_LIBCPP_INLINE_VISIBILITY inline -vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a) - : __base(__a) -{ - if (__a == __x.__alloc()) - { - this->__begin_ = __x.__begin_; - this->__end_ = __x.__end_; |