diff options
Diffstat (limited to 'libstdc++/stl/stl_uninitialized.h')
-rw-r--r-- | libstdc++/stl/stl_uninitialized.h | 295 |
1 files changed, 166 insertions, 129 deletions
diff --git a/libstdc++/stl/stl_uninitialized.h b/libstdc++/stl/stl_uninitialized.h index 661bbe9..3146c82 100644 --- a/libstdc++/stl/stl_uninitialized.h +++ b/libstdc++/stl/stl_uninitialized.h @@ -33,204 +33,241 @@ __STL_BEGIN_NAMESPACE +// uninitialized_copy + // Valid if copy construction is equivalent to assignment, and if the // destructor is trivial. -template <class InputIterator, class ForwardIterator> -inline ForwardIterator -__uninitialized_copy_aux(InputIterator first, InputIterator last, - ForwardIterator result, - __true_type) { - return copy(first, last, result); -} - -template <class InputIterator, class ForwardIterator> -ForwardIterator -__uninitialized_copy_aux(InputIterator first, InputIterator last, - ForwardIterator result, - __false_type) { - ForwardIterator cur = result; +template <class _InputIter, class _ForwardIter> +inline _ForwardIter +__uninitialized_copy_aux(_InputIter __first, _InputIter __last, + _ForwardIter __result, + __true_type) +{ + return copy(__first, __last, __result); +} + +template <class _InputIter, class _ForwardIter> +_ForwardIter +__uninitialized_copy_aux(_InputIter __first, _InputIter __last, + _ForwardIter __result, + __false_type) +{ + _ForwardIter __cur = __result; __STL_TRY { - for ( ; first != last; ++first, ++cur) - construct(&*cur, *first); - return cur; + for ( ; __first != __last; ++__first, ++__cur) + construct(&*__cur, *__first); + return __cur; } - __STL_UNWIND(destroy(result, cur)); + __STL_UNWIND(destroy(__result, __cur)); } -template <class InputIterator, class ForwardIterator, class T> -inline ForwardIterator -__uninitialized_copy(InputIterator first, InputIterator last, - ForwardIterator result, T*) { - typedef typename __type_traits<T>::is_POD_type is_POD; - return __uninitialized_copy_aux(first, last, result, is_POD()); +template <class _InputIter, class _ForwardIter, class _Tp> +inline _ForwardIter +__uninitialized_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result, _Tp*) +{ + typedef typename __type_traits<_Tp>::is_POD_type _Is_POD; + return __uninitialized_copy_aux(__first, __last, __result, _Is_POD()); } -template <class InputIterator, class ForwardIterator> -inline ForwardIterator - uninitialized_copy(InputIterator first, InputIterator last, - ForwardIterator result) { - return __uninitialized_copy(first, last, result, value_type(result)); +template <class _InputIter, class _ForwardIter> +inline _ForwardIter + uninitialized_copy(_InputIter __first, _InputIter __last, + _ForwardIter __result) +{ + return __uninitialized_copy(__first, __last, __result, + __VALUE_TYPE(__result)); } -inline char* uninitialized_copy(const char* first, const char* last, - char* result) { - memmove(result, first, last - first); - return result + (last - first); +inline char* uninitialized_copy(const char* __first, const char* __last, + char* __result) { + memmove(__result, __first, __last - __first); + return __result + (__last - __first); } -inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last, - wchar_t* result) { - memmove(result, first, sizeof(wchar_t) * (last - first)); - return result + (last - first); +inline wchar_t* +uninitialized_copy(const wchar_t* __first, const wchar_t* __last, + wchar_t* __result) +{ + memmove(__result, __first, sizeof(wchar_t) * (__last - __first)); + return __result + (__last - __first); } -template <class InputIterator, class Size, class ForwardIterator> -pair<InputIterator, ForwardIterator> -__uninitialized_copy_n(InputIterator first, Size count, - ForwardIterator result, - input_iterator_tag) { - ForwardIterator cur = result; +// uninitialized_copy_n (not part of the C++ standard) + +template <class _InputIter, class _Size, class _ForwardIter> +pair<_InputIter, _ForwardIter> +__uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result, + input_iterator_tag) +{ + _ForwardIter __cur = __result; __STL_TRY { - for ( ; count > 0 ; --count, ++first, ++cur) - construct(&*cur, *first); - return pair<InputIterator, ForwardIterator>(first, cur); + for ( ; __count > 0 ; --__count, ++__first, ++__cur) + construct(&*__cur, *__first); + return pair<_InputIter, _ForwardIter>(__first, __cur); } - __STL_UNWIND(destroy(result, cur)); + __STL_UNWIND(destroy(__result, __cur)); } -template <class RandomAccessIterator, class Size, class ForwardIterator> -inline pair<RandomAccessIterator, ForwardIterator> -__uninitialized_copy_n(RandomAccessIterator first, Size count, - ForwardIterator result, +template <class _RandomAccessIter, class _Size, class _ForwardIter> +inline pair<_RandomAccessIter, _ForwardIter> +__uninitialized_copy_n(_RandomAccessIter __first, _Size __count, + _ForwardIter __result, random_access_iterator_tag) { - RandomAccessIterator last = first + count; - return make_pair(last, uninitialized_copy(first, last, result)); + _RandomAccessIter __last = __first + __count; + return pair<_RandomAccessIter, _ForwardIter>( + __last, + uninitialized_copy(__first, __last, __result)); } -template <class InputIterator, class Size, class ForwardIterator> -inline pair<InputIterator, ForwardIterator> -uninitialized_copy_n(InputIterator first, Size count, - ForwardIterator result) { - return __uninitialized_copy_n(first, count, result, - iterator_category(first)); +template <class _InputIter, class _Size, class _ForwardIter> +inline pair<_InputIter, _ForwardIter> +__uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result) { + return __uninitialized_copy_n(__first, __count, __result, + __ITERATOR_CATEGORY(__first)); +} + +template <class _InputIter, class _Size, class _ForwardIter> +inline pair<_InputIter, _ForwardIter> +uninitialized_copy_n(_InputIter __first, _Size __count, + _ForwardIter __result) { + return __uninitialized_copy_n(__first, __count, __result, + __ITERATOR_CATEGORY(__first)); } // Valid if copy construction is equivalent to assignment, and if the -// destructor is trivial. -template <class ForwardIterator, class T> +// destructor is trivial. +template <class _ForwardIter, class _Tp> inline void -__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, - const T& x, __true_type) +__uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, + const _Tp& __x, __true_type) { - fill(first, last, x); + fill(__first, __last, __x); } -template <class ForwardIterator, class T> +template <class _ForwardIter, class _Tp> void -__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, - const T& x, __false_type) +__uninitialized_fill_aux(_ForwardIter __first, _ForwardIter __last, + const _Tp& __x, __false_type) { - ForwardIterator cur = first; + _ForwardIter __cur = __first; __STL_TRY { - for ( ; cur != last; ++cur) - construct(&*cur, x); + for ( ; __cur != __last; ++__cur) + construct(&*__cur, __x); } - __STL_UNWIND(destroy(first, cur)); + __STL_UNWIND(destroy(__first, __cur)); } -template <class ForwardIterator, class T, class T1> -inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, - const T& x, T1*) { - typedef typename __type_traits<T1>::is_POD_type is_POD; - __uninitialized_fill_aux(first, last, x, is_POD()); +template <class _ForwardIter, class _Tp, class _Tp1> +inline void __uninitialized_fill(_ForwardIter __first, + _ForwardIter __last, const _Tp& __x, _Tp1*) +{ + typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD; + __uninitialized_fill_aux(__first, __last, __x, _Is_POD()); } -template <class ForwardIterator, class T> -inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, - const T& x) { - __uninitialized_fill(first, last, x, value_type(first)); +template <class _ForwardIter, class _Tp> +inline void uninitialized_fill(_ForwardIter __first, + _ForwardIter __last, + const _Tp& __x) +{ + __uninitialized_fill(__first, __last, __x, __VALUE_TYPE(__first)); } // Valid if copy construction is equivalent to assignment, and if the // destructor is trivial. -template <class ForwardIterator, class Size, class T> -inline ForwardIterator -__uninitialized_fill_n_aux(ForwardIterator first, Size n, - const T& x, __true_type) { - return fill_n(first, n, x); -} - -template <class ForwardIterator, class Size, class T> -ForwardIterator -__uninitialized_fill_n_aux(ForwardIterator first, Size n, - const T& x, __false_type) { - ForwardIterator cur = first; +template <class _ForwardIter, class _Size, class _Tp> +inline _ForwardIter +__uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, + const _Tp& __x, __true_type) +{ + return fill_n(__first, __n, __x); +} + +template <class _ForwardIter, class _Size, class _Tp> +_ForwardIter +__uninitialized_fill_n_aux(_ForwardIter __first, _Size __n, + const _Tp& __x, __false_type) +{ + _ForwardIter __cur = __first; __STL_TRY { - for ( ; n > 0; --n, ++cur) - construct(&*cur, x); - return cur; + for ( ; __n > 0; --__n, ++__cur) + construct(&*__cur, __x); + return __cur; } - __STL_UNWIND(destroy(first, cur)); + __STL_UNWIND(destroy(__first, __cur)); } -template <class ForwardIterator, class Size, class T, class T1> -inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n, - const T& x, T1*) { - typedef typename __type_traits<T1>::is_POD_type is_POD; - return __uninitialized_fill_n_aux(first, n, x, is_POD()); - +template <class _ForwardIter, class _Size, class _Tp, class _Tp1> +inline _ForwardIter +__uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x, _Tp1*) +{ + typedef typename __type_traits<_Tp1>::is_POD_type _Is_POD; + return __uninitialized_fill_n_aux(__first, __n, __x, _Is_POD()); } -template <class ForwardIterator, class Size, class T> -inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, - const T& x) { - return __uninitialized_fill_n(first, n, x, value_type(first)); +template <class _ForwardIter, class _Size, class _Tp> +inline _ForwardIter +uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) +{ + return __uninitialized_fill_n(__first, __n, __x, __VALUE_TYPE(__first)); } +// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill, +// __uninitialized_fill_copy. + +// __uninitialized_copy_copy // Copies [first1, last1) into [result, result + (last1 - first1)), and // copies [first2, last2) into // [result, result + (last1 - first1) + (last2 - first2)). -template <class InputIterator1, class InputIterator2, class ForwardIterator> -inline ForwardIterator -__uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - ForwardIterator result) { - ForwardIterator mid = uninitialized_copy(first1, last1, result); +template <class _InputIter1, class _InputIter2, class _ForwardIter> +inline _ForwardIter +__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1, + _InputIter2 __first2, _InputIter2 __last2, + _ForwardIter __result) +{ + _ForwardIter __mid = uninitialized_copy(__first1, __last1, __result); __STL_TRY { - return uninitialized_copy(first2, last2, mid); + return uninitialized_copy(__first2, __last2, __mid); } - __STL_UNWIND(destroy(result, mid)); + __STL_UNWIND(destroy(__result, __mid)); } +// __uninitialized_fill_copy // Fills [result, mid) with x, and copies [first, last) into // [mid, mid + (last - first)). -template <class ForwardIterator, class T, class InputIterator> -inline ForwardIterator -__uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid, - const T& x, - InputIterator first, InputIterator last) { - uninitialized_fill(result, mid, x); +template <class _ForwardIter, class _Tp, class _InputIter> +inline _ForwardIter +__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, + const _Tp& __x, + _InputIter __first, _InputIter __last) +{ + uninitialized_fill(__result, __mid, __x); __STL_TRY { - return uninitialized_copy(first, last, mid); + return uninitialized_copy(__first, __last, __mid); } - __STL_UNWIND(destroy(result, mid)); + __STL_UNWIND(destroy(__result, __mid)); } +// __uninitialized_copy_fill // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and // fills [first2 + (last1 - first1), last2) with x. -template <class InputIterator, class ForwardIterator, class T> +template <class _InputIter, class _ForwardIter, class _Tp> inline void -__uninitialized_copy_fill(InputIterator first1, InputIterator last1, - ForwardIterator first2, ForwardIterator last2, - const T& x) { - ForwardIterator mid2 = uninitialized_copy(first1, last1, first2); +__uninitialized_copy_fill(_InputIter __first1, _InputIter __last1, + _ForwardIter __first2, _ForwardIter __last2, + const _Tp& __x) +{ + _ForwardIter __mid2 = uninitialized_copy(__first1, __last1, __first2); __STL_TRY { - uninitialized_fill(mid2, last2, x); + uninitialized_fill(__mid2, __last2, __x); } - __STL_UNWIND(destroy(first2, mid2)); + __STL_UNWIND(destroy(__first2, __mid2)); } __STL_END_NAMESPACE |