diff options
Diffstat (limited to 'contrib/libc++')
125 files changed, 113645 insertions, 0 deletions
diff --git a/contrib/libc++/FREEBSD-upgrade b/contrib/libc++/FREEBSD-upgrade new file mode 100644 index 0000000..5e9f60a --- /dev/null +++ b/contrib/libc++/FREEBSD-upgrade @@ -0,0 +1,8 @@ +$FreeBSD$ + +The FreeBSD copy of libc++. This contains everything from the include and +source directories upstream, with the exception of the support/win32 directory, +which is only required for building on Windows (FreeBSD is not Windows). + +To update, bring in anything new in source or include that is not +platform-dependent (unless the platform in question is FreeBSD, obviously). diff --git a/contrib/libc++/include/__bit_reference b/contrib/libc++/include/__bit_reference new file mode 100644 index 0000000..906b9da --- /dev/null +++ b/contrib/libc++/include/__bit_reference @@ -0,0 +1,1248 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___BIT_REFERENCE +#define _LIBCPP___BIT_REFERENCE + +#include <__config> +#include <algorithm> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Cp, bool _IsConst> class __bit_iterator; +template <class _Cp> class __bit_const_reference; + +template <class _Tp> +struct __has_storage_type +{ + static const bool value = false; +}; + +template <class _Cp, bool = __has_storage_type<_Cp>::value> +class __bit_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + +#if defined(__clang__) + friend typename _Cp::__self; +#else + friend class _Cp::__self; +#endif + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, false>; +public: + _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT + {return static_cast<bool>(*__seg_ & __mask_);} + _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT + {return !static_cast<bool>(*this);} + + _LIBCPP_INLINE_VISIBILITY + __bit_reference& operator=(bool __x) _NOEXCEPT + { + if (__x) + *__seg_ |= __mask_; + else + *__seg_ &= ~__mask_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT + {return operator=(static_cast<bool>(__x));} + + _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;} + _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY + __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} +}; + +template <class _Cp> +class __bit_reference<_Cp, false> +{ +}; + +template <class _Cp, class _Dp> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template <class _Cp> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template <class _Cp> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template <class _Cp> +class __bit_const_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__const_storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + +#if defined(__clang__) + friend typename _Cp::__self; +#else + friend class _Cp::__self; +#endif + friend class __bit_iterator<_Cp, true>; +public: + _LIBCPP_INLINE_VISIBILITY + __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT + : __seg_(__x.__seg_), __mask_(__x.__mask_) {} + + _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT + {return static_cast<bool>(*__seg_ & __mask_);} + + _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY + __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} + + __bit_const_reference& operator=(const __bit_const_reference& __x); +}; + +// find + +template <class _Cp> +__bit_iterator<_Cp, false> +__find_bool_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b))); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + if (*__first.__seg_) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(*__first.__seg_))); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b))); + } + return _It(__first.__seg_, static_cast<unsigned>(__n)); +} + +template <class _Cp> +__bit_iterator<_Cp, false> +__find_bool_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = ~(*__first.__seg_ & __m); + if (__b) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b))); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + { + __storage_type __b = ~*__first.__seg_; + if (__b) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b))); + } + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = ~(*__first.__seg_ & __m); + if (__b) + return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__ctz(__b))); + } + return _It(__first.__seg_, static_cast<unsigned>(__n)); +} + +template <class _Cp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +find(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, const _Tp& __value_) +{ + if (static_cast<bool>(__value_)) + return __find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first)); + return __find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first)); +} + +// count + +template <class _Cp> +typename __bit_iterator<_Cp, false>::difference_type +__count_bool_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__pop_count(*__first.__seg_ & __m); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__pop_count(*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__pop_count(*__first.__seg_ & __m); + } + return __r; +} + +template <class _Cp> +typename __bit_iterator<_Cp, false>::difference_type +__count_bool_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__pop_count(~(*__first.__seg_ & __m)); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__pop_count(~*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__pop_count(~(*__first.__seg_ & __m)); + } + return __r; +} + +template <class _Cp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename __bit_iterator<_Cp, false>::difference_type +count(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, const _Tp& __value_) +{ + if (static_cast<bool>(__value_)) + return __count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first)); + return __count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first)); +} + +// fill_n + +template <class _Cp> +void +__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ &= ~__m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memset(__first.__seg_, 0, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ &= ~__m; + } +} + +template <class _Cp> +void +__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ |= __m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memset(__first.__seg_, -1, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ |= __m; + } +} + +template <class _Cp> +_LIBCPP_INLINE_VISIBILITY inline +void +fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_) +{ + if (__n > 0) + { + if (__value_) + __fill_n_true(__first, __n); + else + __fill_n_false(__first, __n); + } +} + +// fill + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +void +fill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_) +{ + _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_); +} + +// copy + +template <class _Cp, bool _IsConst> +__bit_iterator<_Cp, false> +__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + static const unsigned __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __nw = __n / __bits_per_word; + _VSTD::memmove(__result.__seg_, __first.__seg_, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + __result.__seg_ += __nw; + // do last word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast<unsigned>(__n); + } + } + return __result; +} + +template <class _Cp, bool _IsConst> +__bit_iterator<_Cp, false> +__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + static const unsigned __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_); + else + *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_); + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn); + __result.__ctz_ = static_cast<unsigned>(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b = *__first.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + ++__result.__seg_; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b >> __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r)); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __dn; + __result.__ctz_ = static_cast<unsigned>(__n); + } + } + } + return __result; +} + +template <class _Cp, bool _IsConst> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__first.__ctz_ == __result.__ctz_) + return __copy_aligned(__first, __last, __result); + return __copy_unaligned(__first, __last, __result); +} + +// copy_backward + +template <class _Cp, bool _IsConst> +__bit_iterator<_Cp, false> +__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + static const unsigned __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz); + __storage_type __b = *__last.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ == 0 || __n == 0 + // do middle words + __storage_type __nw = __n / __bits_per_word; + __result.__seg_ -= __nw; + __last.__seg_ -= __nw; + _VSTD::memmove(__result.__seg_, __last.__seg_, __nw * sizeof(__storage_type)); + __n -= __nw * __bits_per_word; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + *--__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1)); + } + } + return __result; +} + +template <class _Cp, bool _IsConst> +__bit_iterator<_Cp, false> +__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + static const unsigned __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz_l = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l); + __storage_type __b = *__last.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_)); + if (__ddn > 0) + { + __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __last.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + else + *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_); + __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + } + if (__dn > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + __last.__ctz_ -= __dn + __ddn; + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + } + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ != 0 || __n == 0 + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) >> __clz_r; + for (; __n >= __bits_per_word; __n -= __bits_per_word) + { + __storage_type __b = *--__last.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __clz_r; + *--__result.__seg_ &= __m; + *__result.__seg_ |= __b << __result.__ctz_; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_)); + __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_); + __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn)); + } + } + } + return __result; +} + +template <class _Cp, bool _IsConst> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +copy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__last.__ctz_ == __result.__ctz_) + return __copy_backward_aligned(__first, __last, __result); + return __copy_backward_unaligned(__first, __last, __result); +} + +// move + +template <class _Cp, bool _IsConst> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy(__first, __last, __result); +} + +// move_backward + +template <class _Cp, bool _IsConst> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy(__first, __last, __result); +} + +// swap_ranges + +template <class __C1, class __C2> +__bit_iterator<__C2, false> +__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + static const unsigned __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_) + swap(*__first.__seg_, *__result.__seg_); + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__ctz_ = static_cast<unsigned>(__n); + } + } + return __result; +} + +template <class __C1, class __C2> +__bit_iterator<__C2, false> +__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + static const unsigned __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + { + unsigned __s = __result.__ctz_ - __first.__ctz_; + *__result.__seg_ |= __b1 << __s; + *__first.__seg_ |= __b2 >> __s; + } + else + { + unsigned __s = __first.__ctz_ - __result.__ctz_; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + } + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + unsigned __s = __first.__ctz_ + __ddn; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + __result.__ctz_ = static_cast<unsigned>(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b1 = *__first.__seg_; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ = __b2 >> __result.__ctz_; + ++__result.__seg_; + __b2 = *__result.__seg_ & ~__m; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b1 >> __clz_r; + *__first.__seg_ |= __b2 << __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ |= __b2 >> __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 >> __dn; + *__first.__seg_ |= __b2 << __dn; + __result.__ctz_ = static_cast<unsigned>(__n); + } + } + } + return __result; +} + +template <class __C1, class __C2> +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<__C2, false> +swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1, + __bit_iterator<__C2, false> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return __swap_ranges_aligned(__first1, __last1, __first2); + return __swap_ranges_unaligned(__first1, __last1, __first2); +} + +// rotate + +template <class _Cp> +struct __bit_array +{ + typedef typename _Cp::difference_type difference_type; + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::iterator iterator; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + static const unsigned _Np = 4; + + difference_type __size_; + __storage_type __word_[_Np]; + + _LIBCPP_INLINE_VISIBILITY static difference_type capacity() + {return static_cast<difference_type>(_Np * __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {} + _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(__word_, 0);} + _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(__word_ + __size_ / __bits_per_word, + static_cast<unsigned>(__size_ % __bits_per_word));} +}; + +template <class _Cp> +__bit_iterator<_Cp, false> +rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last) +{ + typedef __bit_iterator<_Cp, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + difference_type __d1 = __middle - __first; + difference_type __d2 = __last - __middle; + _I1 __r = __first + __d2; + while (__d1 != 0 && __d2 != 0) + { + if (__d1 <= __d2) + { + if (__d1 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d1); + _VSTD::copy(__first, __middle, __b.begin()); + _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle); + __first = __middle; + __middle = __mp; + __d2 -= __d1; + } + } + else + { + if (__d2 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d2); + _VSTD::copy(__middle, __last, __b.begin()); + _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = __first + __d2; + _VSTD::swap_ranges(__first, __mp, __middle); + __first = __mp; + __d1 -= __d2; + } + } + } + return __r; +} + +// equal + +template <class _Cp> +bool +__equal_unaligned(__bit_iterator<_Cp, true> __first1, __bit_iterator<_Cp, true> __last1, + __bit_iterator<_Cp, true> __first2) +{ + typedef __bit_iterator<_Cp, true> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first1.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + if (__first2.__ctz_ > __first1.__ctz_) + if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_))) + return false; + else + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_))) + return false; + __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn))) + return false; + __first2.__ctz_ = static_cast<unsigned>(__dn); + } + ++__first1.__seg_; + // __first1.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __m = ~__storage_type(0) << __first2.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_) + { + __storage_type __b = *__first1.__seg_; + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + ++__first2.__seg_; + if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r)) + return false; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first1.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r)); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (__b >> __dn)) + return false; + } + } + } + return true; +} + +template <class _Cp> +bool +__equal_aligned(__bit_iterator<_Cp, true> __first1, __bit_iterator<_Cp, true> __last1, + __bit_iterator<_Cp, true> __first2) +{ + typedef __bit_iterator<_Cp, true> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + static const unsigned __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + ++__first2.__seg_; + ++__first1.__seg_; + // __first1.__ctz_ = 0; + // __first2.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // __first2.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_) + if (*__first2.__seg_ != *__first1.__seg_) + return false; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + } + } + return true; +} + +template <class _Cp, bool _IC1, bool _IC2> +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return __equal_aligned(__first1, __last1, __first2); + return __equal_unaligned(__first1, __last1, __first2); +} + +template <class _Cp, bool _IsConst> +class __bit_iterator +{ +public: + typedef typename _Cp::difference_type difference_type; + typedef bool value_type; + typedef __bit_iterator pointer; + typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference; + typedef random_access_iterator_tag iterator_category; + +private: + typedef typename _Cp::__storage_type __storage_type; + typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer, + typename _Cp::__storage_pointer>::type __storage_pointer; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + + __storage_pointer __seg_; + unsigned __ctz_; + +public: + _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT + : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT + {return reference(__seg_, __storage_type(1) << __ctz_);} + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++() + { + if (__ctz_ != __bits_per_word-1) + ++__ctz_; + else + { + __ctz_ = 0; + ++__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int) + { + __bit_iterator __tmp = *this; + ++(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--() + { + if (__ctz_ != 0) + --__ctz_; + else + { + __ctz_ = __bits_per_word - 1; + --__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int) + { + __bit_iterator __tmp = *this; + --(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n) + { + if (__n >= 0) + __seg_ += (__n + __ctz_) / __bits_per_word; + else + __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1) + / static_cast<difference_type>(__bits_per_word); + __n &= (__bits_per_word - 1); + __ctz_ = static_cast<unsigned>((__n + __ctz_) % __bits_per_word); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n) + { + return *this += -__n; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const + { + __bit_iterator __t(*this); + __t += __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const + { + __bit_iterator __t(*this); + __t -= __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;} + + _LIBCPP_INLINE_VISIBILITY + friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y) + {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x == __y);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y) + {return __y < __x;} + + _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__y < __x);} + + _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x < __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT + : __seg_(__s), __ctz_(__ctz) {} + +#if defined(__clang__) + friend typename _Cp::__self; +#else + friend class _Cp::__self; +#endif + friend class __bit_reference<_Cp>; + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, true>; + template <class _Dp> friend struct __bit_array; + template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>); + template <class _Dp> friend bool __equal_aligned(__bit_iterator<_Dp, true>, + __bit_iterator<_Dp, true>, + __bit_iterator<_Dp, true>); + template <class _Dp> friend bool __equal_unaligned(__bit_iterator<_Dp, true>, + __bit_iterator<_Dp, true>, + __bit_iterator<_Dp, true>); + template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template <class _Dp> friend __bit_iterator<_Dp, false> __find_bool_true(__bit_iterator<_Dp, false>, + typename _Dp::size_type); + template <class _Dp> friend __bit_iterator<_Dp, false> __find_bool_false(__bit_iterator<_Dp, false>, + typename _Dp::size_type); +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_REFERENCE diff --git a/contrib/libc++/include/__config b/contrib/libc++/include/__config new file mode 100644 index 0000000..e0b9582 --- /dev/null +++ b/contrib/libc++/include/__config @@ -0,0 +1,439 @@ +// -*- C++ -*- +//===--------------------------- __config ---------------------------------===// +// +// 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_CONFIG +#define _LIBCPP_CONFIG + +#if !_MSC_VER // explicit macro necessary because it is only defined below in this file +#pragma GCC system_header +#endif + +#define _LIBCPP_VERSION 1001 + +#define _LIBCPP_ABI_VERSION 1 + +#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y +#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) + +#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION) + +#ifdef __LITTLE_ENDIAN__ +#if __LITTLE_ENDIAN__ +#define _LIBCPP_LITTLE_ENDIAN 1 +#define _LIBCPP_BIG_ENDIAN 0 +#endif // __LITTLE_ENDIAN__ +#endif // __LITTLE_ENDIAN__ + +#ifdef __BIG_ENDIAN__ +#if __BIG_ENDIAN__ +#define _LIBCPP_LITTLE_ENDIAN 0 +#define _LIBCPP_BIG_ENDIAN 1 +#endif // __BIG_ENDIAN__ +#endif // __BIG_ENDIAN__ + +#ifdef __FreeBSD__ +# include <sys/endian.h> +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 1 +# define _LIBCPP_BIG_ENDIAN 0 +# else // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 0 +# define _LIBCPP_BIG_ENDIAN 1 +# endif // _BYTE_ORDER == _LITTLE_ENDIAN +#endif // __FreeBSD__ + +#ifdef _WIN32 +# define _LIBCPP_LITTLE_ENDIAN 1 +# define _LIBCPP_BIG_ENDIAN 0 +// Compiler intrinsics (GCC or MSVC) +# if (defined(_MSC_VER) && _MSC_VER >= 1400) || (__GNUC__ >= 4 && __GNUC_MINOR__ > 3) +# define _LIBCP_HAS_IS_BASE_OF +# endif +#endif // _WIN32 + +#ifdef __sun__ +# include <sys/isa_defs.h> +# ifdef _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 1 +# define _LIBCPP_BIG_ENDIAN 0 +# else +# define _LIBCPP_LITTLE_ENDIAN 0 +# define _LIBCPP_BIG_ENDIAN 1 +# endif +#endif // __sun__ + +#if !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN) +# include <endian.h> +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 1 +# define _LIBCPP_BIG_ENDIAN 0 +# elif __BYTE_ORDER == __BIG_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN 0 +# define _LIBCPP_BIG_ENDIAN 1 +# else // __BYTE_ORDER == __BIG_ENDIAN +# error unable to determine endian +# endif +#endif // !defined(_LIBCPP_LITTLE_ENDIAN) || !defined(_LIBCPP_BIG_ENDIAN) + +#if _WIN32 + +// only really useful for a DLL +#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally... +# ifdef cxx_EXPORTS +# define _LIBCPP_HIDDEN +# define _LIBCPP_VISIBLE __declspec(dllexport) +# else +# define _LIBCPP_HIDDEN +# define _LIBCPP_VISIBLE __declspec(dllimport) +# endif +#else +# define _LIBCPP_HIDDEN +# define _LIBCPP_VISIBLE +#endif + +#ifndef _LIBCPP_INLINE_VISIBILITY +# if _MSC_VER +# define _LIBCPP_INLINE_VISIBILITY __forceinline +# else // MinGW GCC and Clang +# define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__)) +# endif +#endif + +#ifndef _LIBCPP_EXCEPTION_ABI +#define _LIBCPP_EXCEPTION_ABI _LIBCPP_VISIBLE +#endif + +#ifndef _LIBCPP_ALWAYS_INLINE +# if _MSC_VER +# define _LIBCPP_ALWAYS_INLINE __forceinline +# endif +#endif + +#endif // _WIN32 + +#ifndef _LIBCPP_HIDDEN +#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden"))) +#endif + +#ifndef _LIBCPP_VISIBLE +#define _LIBCPP_VISIBLE __attribute__ ((__visibility__("default"))) +#endif + +#ifndef _LIBCPP_INLINE_VISIBILITY +#define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__visibility__("hidden"), __always_inline__)) +#endif + +#ifndef _LIBCPP_EXCEPTION_ABI +#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default"))) +#endif + +#ifndef _LIBCPP_CANTTHROW +#define _LIBCPP_CANTTHROW __attribute__ ((__nothrow__)) +#endif + +#ifndef _LIBCPP_ALWAYS_INLINE +#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__visibility__("hidden"), __always_inline__)) +#endif + +#if defined(__clang__) + +#if __has_feature(cxx_alignas) +# define _ALIGNAS(x) alignas(x) +#else +# define _ALIGNAS(x) __attribute__((__aligned__(x))) +#endif + +#if !__has_feature(cxx_alias_templates) +#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES +#endif + +#ifndef __GXX_EXPERIMENTAL_CXX0X__ +#ifdef __linux__ +#define _LIBCPP_HAS_NO_UNICODE_CHARS +#else +typedef __char16_t char16_t; +typedef __char32_t char32_t; +#endif +#endif + +#if !(__has_feature(cxx_exceptions)) +#define _LIBCPP_NO_EXCEPTIONS +#endif + +#if !(__has_feature(cxx_rtti)) +#define _LIBCPP_NO_RTTI +#endif + +#if !(__has_feature(cxx_strong_enums)) +#define _LIBCPP_HAS_NO_STRONG_ENUMS +#endif + +#if !(__has_feature(cxx_decltype)) +#define _LIBCPP_HAS_NO_DECLTYPE +#endif + +#if __has_feature(cxx_attributes) +# define _ATTRIBUTE(x) [[x]] +#else +# define _ATTRIBUTE(x) __attribute__ ((x)) +#endif + +#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + +#if !(__has_feature(cxx_deleted_functions)) +#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS +#endif // !(__has_feature(cxx_deleted_functions)) + +#if !(__has_feature(cxx_lambdas)) +#define _LIBCPP_HAS_NO_LAMBDAS +#endif + +#if !(__has_feature(cxx_nullptr)) +#define _LIBCPP_HAS_NO_NULLPTR +#endif + +#if !(__has_feature(cxx_rvalue_references)) +#define _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif + +#if !(__has_feature(cxx_static_assert)) +#define _LIBCPP_HAS_NO_STATIC_ASSERT +#endif + +#if !(__has_feature(cxx_auto_type)) +#define _LIBCPP_HAS_NO_AUTO_TYPE +#endif + +#if !(__has_feature(cxx_access_control_sfinae)) || !__has_feature(cxx_trailing_return) +#define _LIBCPP_HAS_NO_ADVANCED_SFINAE +#endif + +#if !(__has_feature(cxx_variadic_templates)) +#define _LIBCPP_HAS_NO_VARIADICS +#endif + +#if !(__has_feature(cxx_trailing_return)) +#define _LIBCPP_HAS_NO_TRAILING_RETURN +#endif + +#if !(__has_feature(cxx_generalized_initializers)) +#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +#endif + +#if __has_feature(is_base_of) +# define _LIBCP_HAS_IS_BASE_OF +#endif + +// Objective-C++ features (opt-in) +#if __has_feature(objc_arc) +#define _LIBCPP_HAS_OBJC_ARC +#endif + +#if __has_feature(objc_arc_weak) +#define _LIBCPP_HAS_OBJC_ARC_WEAK +#define _LIBCPP_HAS_NO_STRONG_ENUMS +#endif + +#if !(__has_feature(cxx_constexpr)) +#define _LIBCPP_HAS_NO_CONSTEXPR +#endif + +#if (__has_feature(cxx_noexcept)) +# define _NOEXCEPT noexcept +# define _NOEXCEPT_(x) noexcept(x) +#else +# define _NOEXCEPT throw() +# define _NOEXCEPT_(x) +#endif + +#if __has_feature(underlying_type) +# define _LIBCXX_UNDERLYING_TYPE(T) __underlying_type(T) +#endif + +// Inline namespaces are available in Clang regardless of C++ dialect. +#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE { +#define _LIBCPP_END_NAMESPACE_STD } } +#define _VSTD std::_LIBCPP_NAMESPACE + +namespace std { + inline namespace _LIBCPP_NAMESPACE { + } +} + +#elif defined(__GNUC__) + +#define _ALIGNAS(x) __attribute__((__aligned__(x))) + +#define _ATTRIBUTE(x) __attribute__((x)) + +#if !__EXCEPTIONS +#define _LIBCPP_NO_EXCEPTIONS +#endif + +#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES +#define _LIBCPP_HAS_NO_CONSTEXPR + +#define _NOEXCEPT throw() +#define _NOEXCEPT_(x) + +#ifndef __GXX_EXPERIMENTAL_CXX0X__ + +#define _LIBCPP_HAS_NO_ADVANCED_SFINAE +#define _LIBCPP_HAS_NO_DECLTYPE +#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS +#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS +#define _LIBCPP_HAS_NO_NULLPTR +#define _LIBCPP_HAS_NO_STATIC_ASSERT +#define _LIBCPP_HAS_NO_UNICODE_CHARS +#define _LIBCPP_HAS_NO_VARIADICS +#define _LIBCPP_HAS_NO_RVALUE_REFERENCES +#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS + +#else // __GXX_EXPERIMENTAL_CXX0X__ + +#define _LIBCPP_HAS_NO_TRAILING_RETURN +#define _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS + +#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 3) +#define _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif + +#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 3) +#define _LIBCPP_HAS_NO_STATIC_ASSERT +#endif + +#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) +#define _LIBCPP_HAS_NO_ADVANCED_SFINAE +#define _LIBCPP_HAS_NO_DECLTYPE +#define _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS +#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS +#define _LIBCPP_HAS_NO_UNICODE_CHARS +#define _LIBCPP_HAS_NO_VARIADICS +#define _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +#endif // !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 4) + +#if !(__GNUC__ >= 4 && __GNUC_MINOR__ >= 6) +#define _LIBCPP_HAS_NO_NULLPTR +#endif + +#endif // __GXX_EXPERIMENTAL_CXX0X__ + +#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE { +#define _LIBCPP_END_NAMESPACE_STD } } +#define _VSTD std::_LIBCPP_NAMESPACE + +namespace std { +namespace _LIBCPP_NAMESPACE { +} +using namespace _LIBCPP_NAMESPACE __attribute__((__strong__)); +} + +#elif defined(_MSC_VER) + +#define _LIBCPP_HAS_NO_TEMPLATE_ALIASES +#define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +#define _LIBCPP_HAS_NO_CONSTEXPR +#define _LIBCPP_HAS_NO_UNICODE_CHARS +#define _LIBCPP_HAS_NO_DELETED_FUNCTIONS +#define __alignof__ __alignof +#define _ATTRIBUTE __declspec +#define _ALIGNAS(x) __declspec(align(x)) +#define _LIBCPP_HAS_NO_VARIADICS + +#define _NOEXCEPT throw() +#define _NOEXCEPT_(x) + +#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { +#define _LIBCPP_END_NAMESPACE_STD } +#define _VSTD std + +namespace std { +} + +#endif // __clang__ || __GNUC___ || _MSC_VER + +#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS +typedef unsigned short char16_t; +typedef unsigned int char32_t; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT + +template <bool> struct __static_assert_test; +template <> struct __static_assert_test<true> {}; +template <unsigned> struct __static_assert_check {}; +#define static_assert(__b, __m) \ + typedef __static_assert_check<sizeof(__static_assert_test<(__b)>)> \ + _LIBCPP_CONCAT(__t, __LINE__) + +#endif // _LIBCPP_HAS_NO_STATIC_ASSERT + +#ifdef _LIBCPP_HAS_NO_DECLTYPE +#define decltype(x) __typeof__(x) +#endif + +#ifdef _LIBCPP_HAS_NO_CONSTEXPR +#define constexpr const +#endif + +#ifndef __has_feature +#define __has_feature(__x) 0 +#endif + +#if __has_feature(cxx_explicit_conversions) +# define _LIBCPP_EXPLICIT explicit +#else +# define _LIBCPP_EXPLICIT +#endif + +#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS +#define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_VISIBLE x { enum _ +#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \ + _ __v_; \ + _LIBCPP_ALWAYS_INLINE x(_ __v) : __v_(__v) {} \ + _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \ + }; +#else // _LIBCPP_HAS_NO_STRONG_ENUMS +#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_VISIBLE x +#define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) +#endif // _LIBCPP_HAS_NO_STRONG_ENUMS + +#if __APPLE__ || __FreeBSD__ || _WIN32 || __sun__ +#define _LIBCPP_LOCALE__L_EXTENSIONS 1 +#endif +#if __FreeBSD__ +#define _DECLARE_C99_LDBL_MATH 1 +#endif + +#if __APPLE__ || __FreeBSD__ +#define _LIBCPP_HAS_DEFAULTRUNELOCALE +#endif + +#if __APPLE__ || __FreeBSD__ || __sun__ +#define _LIBCPP_WCTYPE_IS_MASK +#endif + +#ifdef _LIBCPP_DEBUG2 +# if _LIBCPP_DEBUG2 == 0 +# define _LIBCPP_DEBUG_LEVEL 1 +# elif _LIBCPP_DEBUG2 == 1 +# define _LIBCPP_DEBUG_LEVEL 2 +# else +# error Supported values for _LIBCPP_DEBUG2 are 0 and 1 +# endif +#endif + +#ifdef _LIBCPP_DEBUG2 +# include <__debug> +#else +# define _LIBCPP_ASSERT(x, m) ((void)0) +#endif + +#endif // _LIBCPP_CONFIG diff --git a/contrib/libc++/include/__debug b/contrib/libc++/include/__debug new file mode 100644 index 0000000..4a0e3ce --- /dev/null +++ b/contrib/libc++/include/__debug @@ -0,0 +1,191 @@ +// -*- C++ -*- +//===--------------------------- __debug ----------------------------------===// +// +// 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_DEBUG_H +#define _LIBCPP_DEBUG_H + +#if _LIBCPP_DEBUG_LEVEL >= 1 + +# include <cstdlib> +# include <cstdio> +# include <cstddef> +# define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : (_VSTD::printf("%s\n", m), _VSTD::abort())) + +#endif + +#if _LIBCPP_DEBUG_LEVEL >= 2 + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct _LIBCPP_VISIBLE __c_node; + +struct _LIBCPP_VISIBLE __i_node +{ + void* __i_; + __i_node* __next_; + __c_node* __c_; + + __i_node(const __i_node&) = delete; + __i_node& operator=(const __i_node&) = delete; + _LIBCPP_INLINE_VISIBILITY + __i_node(void* __i, __i_node* __next, __c_node* __c) + : __i_(__i), __next_(__next), __c_(__c) {} + ~__i_node(); +}; + +struct _LIBCPP_VISIBLE __c_node +{ + void* __c_; + __c_node* __next_; + __i_node** beg_; + __i_node** end_; + __i_node** cap_; + + __c_node(const __c_node&) = delete; + __c_node& operator=(const __c_node&) = delete; + _LIBCPP_INLINE_VISIBILITY + __c_node(void* __c, __c_node* __next) + : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {} + virtual ~__c_node(); + + virtual bool __dereferenceable(const void*) const = 0; + virtual bool __decrementable(const void*) const = 0; + virtual bool __addable(const void*, ptrdiff_t) const = 0; + virtual bool __subscriptable(const void*, ptrdiff_t) const = 0; + + void __add(__i_node* __i); + _LIBCPP_HIDDEN void __remove(__i_node* __i); +}; + +template <class _Cont> +struct _C_node + : public __c_node +{ + _C_node(void* __c, __c_node* __n) + : __c_node(__c, __n) {} + + virtual bool __dereferenceable(const void*) const; + virtual bool __decrementable(const void*) const; + virtual bool __addable(const void*, ptrdiff_t) const; + virtual bool __subscriptable(const void*, ptrdiff_t) const; +}; + +template <class _Cont> +bool +_C_node<_Cont>::__dereferenceable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast<const iterator*>(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__dereferenceable(__j); +} + +template <class _Cont> +bool +_C_node<_Cont>::__decrementable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast<const iterator*>(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__decrementable(__j); +} + +template <class _Cont> +bool +_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast<const iterator*>(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__addable(__j, __n); +} + +template <class _Cont> +bool +_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast<const iterator*>(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__subscriptable(__j, __n); +} + +class _LIBCPP_VISIBLE __libcpp_db +{ + __c_node** __cbeg_; + __c_node** __cend_; + size_t __csz_; + __i_node** __ibeg_; + __i_node** __iend_; + size_t __isz_; + + __libcpp_db(); +public: + __libcpp_db(const __libcpp_db&) = delete; + __libcpp_db& operator=(const __libcpp_db&) = delete; + ~__libcpp_db(); + + class __db_c_iterator; + class __db_c_const_iterator; + class __db_i_iterator; + class __db_i_const_iterator; + + __db_c_const_iterator __c_end() const; + __db_i_const_iterator __i_end() const; + + template <class _Cont> + _LIBCPP_INLINE_VISIBILITY + void __insert_c(_Cont* __c) + { + __c_node* __n = __insert_c(static_cast<void*>(__c)); + ::new(__n) _C_node<_Cont>(__n->__c_, __n->__next_); + } + + void __insert_i(void* __i); + __c_node* __insert_c(void* __c); + void __erase_c(void* __c); + + void __insert_ic(void* __i, const void* __c); + void __iterator_copy(void* __i, const void* __i0); + void __erase_i(void* __i); + + void* __find_c_from_i(void* __i) const; + void __invalidate_all(void* __c); + __c_node* __find_c_and_lock(void* __c) const; + __c_node* __find_c(void* __c) const; + void unlock() const; + + void swap(void* __c1, void* __c2); + + + bool __dereferenceable(const void* __i) const; + bool __decrementable(const void* __i) const; + bool __addable(const void* __i, ptrdiff_t __n) const; + bool __subscriptable(const void* __i, ptrdiff_t __n) const; + bool __comparable(const void* __i, const void* __j) const; +private: + _LIBCPP_HIDDEN + __i_node* __insert_iterator(void* __i); + _LIBCPP_HIDDEN + __i_node* __find_iterator(const void* __i) const; + + friend _LIBCPP_VISIBLE __libcpp_db* __get_db(); +}; + +_LIBCPP_VISIBLE __libcpp_db* __get_db(); +_LIBCPP_VISIBLE const __libcpp_db* __get_const_db(); + + +_LIBCPP_END_NAMESPACE_STD + +#endif + +#endif // _LIBCPP_DEBUG_H + diff --git a/contrib/libc++/include/__functional_03 b/contrib/libc++/include/__functional_03 new file mode 100644 index 0000000..3a5397d --- /dev/null +++ b/contrib/libc++/include/__functional_03 @@ -0,0 +1,2130 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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_FUNCTIONAL_03 +#define _LIBCPP_FUNCTIONAL_03 + +// manual variadic expansion for <functional> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +template <class _Tp> +class __mem_fn + : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type __f_; + +public: + _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) : __f_(__f) {} + + // invoke + + typename __invoke_return<type>::type + operator() () + { + return __invoke(__f_); + } + + template <class _A0> + typename __invoke_return0<type, _A0>::type + operator() (_A0& __a0) + { + return __invoke(__f_, __a0); + } + + template <class _A0, class _A1> + typename __invoke_return1<type, _A0, _A1>::type + operator() (_A0& __a0, _A1& __a1) + { + return __invoke(__f_, __a0, __a1); + } + + template <class _A0, class _A1, class _A2> + typename __invoke_return2<type, _A0, _A1, _A2>::type + operator() (_A0& __a0, _A1& __a1, _A2& __a2) + { + return __invoke(__f_, __a0, __a1, __a2); + } +}; + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp _Tp::*> +mem_fn(_Rp _Tp::* __pm) +{ + return __mem_fn<_Rp _Tp::*>(__pm); +} + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)()> +mem_fn(_Rp (_Tp::* __pm)()) +{ + return __mem_fn<_Rp (_Tp::*)()>(__pm); +} + +template<class _Rp, class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0)> +mem_fn(_Rp (_Tp::* __pm)(_A0)) +{ + return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1)) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2)) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm); +} + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)()> +mem_fn(_Rp (_Tp::* __pm)() const) +{ + return __mem_fn<_Rp (_Tp::*)()>(__pm); +} + +template<class _Rp, class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0)> +mem_fn(_Rp (_Tp::* __pm)(_A0) const) +{ + return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) const) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) const) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm); +} + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)()> +mem_fn(_Rp (_Tp::* __pm)() volatile) +{ + return __mem_fn<_Rp (_Tp::*)()>(__pm); +} + +template<class _Rp, class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0)> +mem_fn(_Rp (_Tp::* __pm)(_A0) volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm); +} + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)()> +mem_fn(_Rp (_Tp::* __pm)() const volatile) +{ + return __mem_fn<_Rp (_Tp::*)()>(__pm); +} + +template<class _Rp, class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0)> +mem_fn(_Rp (_Tp::* __pm)(_A0) const volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1) const volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1)>(__pm); +} + +template<class _Rp, class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)> +mem_fn(_Rp (_Tp::* __pm)(_A0, _A1, _A2) const volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_A0, _A1, _A2)>(__pm); +} + +// bad_function_call + +class _LIBCPP_EXCEPTION_ABI bad_function_call + : public exception +{ +}; + +template<class _Fp> class _LIBCPP_VISIBLE function; // undefined + +namespace __function +{ + +template<class _Fp> +struct __maybe_derive_from_unary_function +{ +}; + +template<class _Rp, class _A1> +struct __maybe_derive_from_unary_function<_Rp(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template<class _Fp> +struct __maybe_derive_from_binary_function +{ +}; + +template<class _Rp, class _A1, class _A2> +struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template<class _Fp> class __base; + +template<class _Rp> +class __base<_Rp()> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + __base() {} + virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() = 0; + virtual void destroy_deallocate() = 0; + virtual _Rp operator()() = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const = 0; + virtual const std::type_info& target_type() const = 0; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0> +class __base<_Rp(_A0)> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + __base() {} + virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() = 0; + virtual void destroy_deallocate() = 0; + virtual _Rp operator()(_A0) = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const = 0; + virtual const std::type_info& target_type() const = 0; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0, class _A1> +class __base<_Rp(_A0, _A1)> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + __base() {} + virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() = 0; + virtual void destroy_deallocate() = 0; + virtual _Rp operator()(_A0, _A1) = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const = 0; + virtual const std::type_info& target_type() const = 0; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0, class _A1, class _A2> +class __base<_Rp(_A0, _A1, _A2)> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + __base() {} + virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() = 0; + virtual void destroy_deallocate() = 0; + virtual _Rp operator()(_A0, _A1, _A2) = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const = 0; + virtual const std::type_info& target_type() const = 0; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _FD, class _Alloc, class _FB> class __func; + +template<class _Fp, class _Alloc, class _Rp> +class __func<_Fp, _Alloc, _Rp()> + : public __base<_Rp()> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {} + explicit __func(_Fp __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} + virtual __base<_Rp()>* __clone() const; + virtual void __clone(__base<_Rp()>*) const; + virtual void destroy(); + virtual void destroy_deallocate(); + virtual _Rp operator()(); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const; + virtual const std::type_info& target_type() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Fp, class _Alloc, class _Rp> +__base<_Rp()>* +__func<_Fp, _Alloc, _Rp()>::__clone() const +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) __func(__f_.first(), _Alloc(__a)); + return __hold.release(); +} + +template<class _Fp, class _Alloc, class _Rp> +void +__func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const +{ + ::new (__p) __func(__f_.first(), __f_.second()); +} + +template<class _Fp, class _Alloc, class _Rp> +void +__func<_Fp, _Alloc, _Rp()>::destroy() +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp> +void +__func<_Fp, _Alloc, _Rp()>::destroy_deallocate() +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp> +_Rp +__func<_Fp, _Alloc, _Rp()>::operator()() +{ + return __invoke(__f_.first()); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp> +const void* +__func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const +{ + if (__ti == typeid(_Fp)) + return &__f_.first(); + return (const void*)0; +} + +template<class _Fp, class _Alloc, class _Rp> +const std::type_info& +__func<_Fp, _Alloc, _Rp()>::target_type() const +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0> +class __func<_Fp, _Alloc, _Rp(_A0)> + : public __base<_Rp(_A0)> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {} + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) + : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} + virtual __base<_Rp(_A0)>* __clone() const; + virtual void __clone(__base<_Rp(_A0)>*) const; + virtual void destroy(); + virtual void destroy_deallocate(); + virtual _Rp operator()(_A0); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const; + virtual const std::type_info& target_type() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Fp, class _Alloc, class _Rp, class _A0> +__base<_Rp(_A0)>* +__func<_Fp, _Alloc, _Rp(_A0)>::__clone() const +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) __func(__f_.first(), _Alloc(__a)); + return __hold.release(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0> +void +__func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const +{ + ::new (__p) __func(__f_.first(), __f_.second()); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0> +void +__func<_Fp, _Alloc, _Rp(_A0)>::destroy() +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0> +void +__func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate() +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0> +_Rp +__func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0) +{ + return __invoke(__f_.first(), __a0); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0> +const void* +__func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const +{ + if (__ti == typeid(_Fp)) + return &__f_.first(); + return (const void*)0; +} + +template<class _Fp, class _Alloc, class _Rp, class _A0> +const std::type_info& +__func<_Fp, _Alloc, _Rp(_A0)>::target_type() const +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +class __func<_Fp, _Alloc, _Rp(_A0, _A1)> + : public __base<_Rp(_A0, _A1)> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {} + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) + : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} + virtual __base<_Rp(_A0, _A1)>* __clone() const; + virtual void __clone(__base<_Rp(_A0, _A1)>*) const; + virtual void destroy(); + virtual void destroy_deallocate(); + virtual _Rp operator()(_A0, _A1); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const; + virtual const std::type_info& target_type() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +__base<_Rp(_A0, _A1)>* +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) __func(__f_.first(), _Alloc(__a)); + return __hold.release(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const +{ + ::new (__p) __func(__f_.first(), __f_.second()); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy() +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate() +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +_Rp +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) +{ + return __invoke(__f_.first(), __a0, __a1); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +const void* +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const +{ + if (__ti == typeid(_Fp)) + return &__f_.first(); + return (const void*)0; +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1> +const std::type_info& +__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> + : public __base<_Rp(_A0, _A1, _A2)> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f)) {} + _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a) + : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} + virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const; + virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const; + virtual void destroy(); + virtual void destroy_deallocate(); + virtual _Rp operator()(_A0, _A1, _A2); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const; + virtual const std::type_info& target_type() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +__base<_Rp(_A0, _A1, _A2)>* +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone() const +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) __func(__f_.first(), _Alloc(__a)); + return __hold.release(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const +{ + ::new (__p) __func(__f_.first(), __f_.second()); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy() +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +void +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate() +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +_Rp +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) +{ + return __invoke(__f_.first(), __a0, __a1, __a2); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +const void* +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const +{ + if (__ti == typeid(_Fp)) + return &__f_.first(); + return (const void*)0; +} + +template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2> +const std::type_info& +__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +} // __function + +template<class _Rp> +class _LIBCPP_VISIBLE function<_Rp()> +{ + typedef __function::__base<_Rp()> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + + template <class _Fp> + static bool __not_null(const _Fp&) {return true;} + template <class _R2> + static bool __not_null(const function<_Rp()>& __p) {return __p;} +public: + typedef _Rp result_type; + + // 20.7.16.2.1, construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} + _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} + function(const function&); + template<class _Fp> + function(_Fp, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) : __f_(0) {} + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, const function&); + template<class _Fp, class _Alloc> + function(allocator_arg_t, const _Alloc& __a, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + function& operator=(const function&); + function& operator=(nullptr_t); + template<class _Fp> + typename enable_if + < + !is_integral<_Fp>::value, + function& + >::type + operator=(_Fp); + + ~function(); + + // 20.7.16.2.2, function modifiers: + void swap(function&); + template<class _Fp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp __f, const _Alloc& __a) + {function(allocator_arg, __a, __f).swap(*this);} + + // 20.7.16.2.3, function capacity: + _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;} + +private: + // deleted overloads close possible hole in the type system + template<class _R2> + bool operator==(const function<_R2()>&) const;// = delete; + template<class _R2> + bool operator!=(const function<_R2()>&) const;// = delete; +public: + // 20.7.16.2.4, function invocation: + _Rp operator()() const; + +#ifndef _LIBCPP_NO_RTTI + // 20.7.16.2.5, function target access: + const std::type_info& target_type() const; + template <typename _Tp> _Tp* target(); + template <typename _Tp> const _Tp* target() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp> +function<_Rp()>::function(const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp> +template<class _Alloc> +function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp> +template <class _Fp> +function<_Rp()>::function(_Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + if (__not_null(__f)) + { + typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp> +template <class _Fp, class _Alloc> +function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + if (__not_null(__f)) + { + typedef __function::__func<_Fp, _Alloc, _Rp()> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, _Alloc(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp> +function<_Rp()>& +function<_Rp()>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template<class _Rp> +function<_Rp()>& +function<_Rp()>::operator=(nullptr_t) +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; +} + +template<class _Rp> +template <class _Fp> +typename enable_if +< + !is_integral<_Fp>::value, + function<_Rp()>& +>::type +function<_Rp()>::operator=(_Fp __f) +{ + function(_VSTD::move(__f)).swap(*this); + return *this; +} + +template<class _Rp> +function<_Rp()>::~function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp> +void +function<_Rp()>::swap(function& __f) +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__clone(__t); + __f_->destroy(); + __f_ = 0; + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = 0; + __f_ = (__base*)&__buf_; + __t->__clone((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__clone((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp> +_Rp +function<_Rp()>::operator()() const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__f_ == 0) + throw bad_function_call(); +#endif // _LIBCPP_NO_EXCEPTIONS + return (*__f_)(); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Rp> +const std::type_info& +function<_Rp()>::target_type() const +{ + if (__f_ == 0) + return typeid(void); + return __f_->target_type(); +} + +template<class _Rp> +template <typename _Tp> +_Tp* +function<_Rp()>::target() +{ + if (__f_ == 0) + return (_Tp*)0; + return (_Tp*)__f_->target(typeid(_Tp)); +} + +template<class _Rp> +template <typename _Tp> +const _Tp* +function<_Rp()>::target() const +{ + if (__f_ == 0) + return (const _Tp*)0; + return (const _Tp*)__f_->target(typeid(_Tp)); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Rp, class _A0> +class _LIBCPP_VISIBLE function<_Rp(_A0)> + : public unary_function<_A0, _Rp> +{ + typedef __function::__base<_Rp(_A0)> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const _Fp&) {return true;} + template <class _R2, class _B0> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (*__p)(_B0)) {return __p;} + template <class _R2, class _Cp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)()) {return __p;} + template <class _R2, class _Cp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)() const) {return __p;} + template <class _R2, class _Cp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)() volatile) {return __p;} + template <class _R2, class _Cp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)() const volatile) {return __p;} + template <class _R2, class _B0> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const function<_Rp(_B0)>& __p) {return __p;} +public: + typedef _Rp result_type; + + // 20.7.16.2.1, construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} + _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} + function(const function&); + template<class _Fp> + function(_Fp, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) : __f_(0) {} + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, const function&); + template<class _Fp, class _Alloc> + function(allocator_arg_t, const _Alloc& __a, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + function& operator=(const function&); + function& operator=(nullptr_t); + template<class _Fp> + typename enable_if + < + !is_integral<_Fp>::value, + function& + >::type + operator=(_Fp); + + ~function(); + + // 20.7.16.2.2, function modifiers: + void swap(function&); + template<class _Fp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp __f, const _Alloc& __a) + {function(allocator_arg, __a, __f).swap(*this);} + + // 20.7.16.2.3, function capacity: + _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;} + +private: + // deleted overloads close possible hole in the type system + template<class _R2, class _B0> + bool operator==(const function<_R2(_B0)>&) const;// = delete; + template<class _R2, class _B0> + bool operator!=(const function<_R2(_B0)>&) const;// = delete; +public: + // 20.7.16.2.4, function invocation: + _Rp operator()(_A0) const; + +#ifndef _LIBCPP_NO_RTTI + // 20.7.16.2.5, function target access: + const std::type_info& target_type() const; + template <typename _Tp> _Tp* target(); + template <typename _Tp> const _Tp* target() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0> +function<_Rp(_A0)>::function(const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0> +template<class _Alloc> +function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0> +template <class _Fp> +function<_Rp(_A0)>::function(_Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + if (__not_null(__f)) + { + typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0> +template <class _Fp, class _Alloc> +function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + if (__not_null(__f)) + { + typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, _Alloc(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0> +function<_Rp(_A0)>& +function<_Rp(_A0)>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template<class _Rp, class _A0> +function<_Rp(_A0)>& +function<_Rp(_A0)>::operator=(nullptr_t) +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; +} + +template<class _Rp, class _A0> +template <class _Fp> +typename enable_if +< + !is_integral<_Fp>::value, + function<_Rp(_A0)>& +>::type +function<_Rp(_A0)>::operator=(_Fp __f) +{ + function(_VSTD::move(__f)).swap(*this); + return *this; +} + +template<class _Rp, class _A0> +function<_Rp(_A0)>::~function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp, class _A0> +void +function<_Rp(_A0)>::swap(function& __f) +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__clone(__t); + __f_->destroy(); + __f_ = 0; + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = 0; + __f_ = (__base*)&__buf_; + __t->__clone((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__clone((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp, class _A0> +_Rp +function<_Rp(_A0)>::operator()(_A0 __a0) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__f_ == 0) + throw bad_function_call(); +#endif // _LIBCPP_NO_EXCEPTIONS + return (*__f_)(__a0); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Rp, class _A0> +const std::type_info& +function<_Rp(_A0)>::target_type() const +{ + if (__f_ == 0) + return typeid(void); + return __f_->target_type(); +} + +template<class _Rp, class _A0> +template <typename _Tp> +_Tp* +function<_Rp(_A0)>::target() +{ + if (__f_ == 0) + return (_Tp*)0; + return (_Tp*)__f_->target(typeid(_Tp)); +} + +template<class _Rp, class _A0> +template <typename _Tp> +const _Tp* +function<_Rp(_A0)>::target() const +{ + if (__f_ == 0) + return (const _Tp*)0; + return (const _Tp*)__f_->target(typeid(_Tp)); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Rp, class _A0, class _A1> +class _LIBCPP_VISIBLE function<_Rp(_A0, _A1)> + : public binary_function<_A0, _A1, _Rp> +{ + typedef __function::__base<_Rp(_A0, _A1)> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const _Fp&) {return true;} + template <class _R2, class _B0, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (*__p)(_B0, _B1)) {return __p;} + template <class _R2, class _Cp, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1)) {return __p;} + template <class _R2, class _Cp, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1) const) {return __p;} + template <class _R2, class _Cp, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1) volatile) {return __p;} + template <class _R2, class _Cp, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1) const volatile) {return __p;} + template <class _R2, class _B0, class _B1> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const function<_Rp(_B0, _B1)>& __p) {return __p;} +public: + typedef _Rp result_type; + + // 20.7.16.2.1, construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} + _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} + function(const function&); + template<class _Fp> + function(_Fp, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) : __f_(0) {} + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, const function&); + template<class _Fp, class _Alloc> + function(allocator_arg_t, const _Alloc& __a, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + function& operator=(const function&); + function& operator=(nullptr_t); + template<class _Fp> + typename enable_if + < + !is_integral<_Fp>::value, + function& + >::type + operator=(_Fp); + + ~function(); + + // 20.7.16.2.2, function modifiers: + void swap(function&); + template<class _Fp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp __f, const _Alloc& __a) + {function(allocator_arg, __a, __f).swap(*this);} + + // 20.7.16.2.3, function capacity: + operator bool() const {return __f_;} + +private: + // deleted overloads close possible hole in the type system + template<class _R2, class _B0, class _B1> + bool operator==(const function<_R2(_B0, _B1)>&) const;// = delete; + template<class _R2, class _B0, class _B1> + bool operator!=(const function<_R2(_B0, _B1)>&) const;// = delete; +public: + // 20.7.16.2.4, function invocation: + _Rp operator()(_A0, _A1) const; + +#ifndef _LIBCPP_NO_RTTI + // 20.7.16.2.5, function target access: + const std::type_info& target_type() const; + template <typename _Tp> _Tp* target(); + template <typename _Tp> const _Tp* target() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0, class _A1> +function<_Rp(_A0, _A1)>::function(const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0, class _A1> +template<class _Alloc> +function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0, class _A1> +template <class _Fp> +function<_Rp(_A0, _A1)>::function(_Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + if (__not_null(__f)) + { + typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0, class _A1> +template <class _Fp, class _Alloc> +function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + if (__not_null(__f)) + { + typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, _Alloc(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0, class _A1> +function<_Rp(_A0, _A1)>& +function<_Rp(_A0, _A1)>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template<class _Rp, class _A0, class _A1> +function<_Rp(_A0, _A1)>& +function<_Rp(_A0, _A1)>::operator=(nullptr_t) +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; +} + +template<class _Rp, class _A0, class _A1> +template <class _Fp> +typename enable_if +< + !is_integral<_Fp>::value, + function<_Rp(_A0, _A1)>& +>::type +function<_Rp(_A0, _A1)>::operator=(_Fp __f) +{ + function(_VSTD::move(__f)).swap(*this); + return *this; +} + +template<class _Rp, class _A0, class _A1> +function<_Rp(_A0, _A1)>::~function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp, class _A0, class _A1> +void +function<_Rp(_A0, _A1)>::swap(function& __f) +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__clone(__t); + __f_->destroy(); + __f_ = 0; + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = 0; + __f_ = (__base*)&__buf_; + __t->__clone((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__clone((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp, class _A0, class _A1> +_Rp +function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__f_ == 0) + throw bad_function_call(); +#endif // _LIBCPP_NO_EXCEPTIONS + return (*__f_)(__a0, __a1); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Rp, class _A0, class _A1> +const std::type_info& +function<_Rp(_A0, _A1)>::target_type() const +{ + if (__f_ == 0) + return typeid(void); + return __f_->target_type(); +} + +template<class _Rp, class _A0, class _A1> +template <typename _Tp> +_Tp* +function<_Rp(_A0, _A1)>::target() +{ + if (__f_ == 0) + return (_Tp*)0; + return (_Tp*)__f_->target(typeid(_Tp)); +} + +template<class _Rp, class _A0, class _A1> +template <typename _Tp> +const _Tp* +function<_Rp(_A0, _A1)>::target() const +{ + if (__f_ == 0) + return (const _Tp*)0; + return (const _Tp*)__f_->target(typeid(_Tp)); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Rp, class _A0, class _A1, class _A2> +class _LIBCPP_VISIBLE function<_Rp(_A0, _A1, _A2)> +{ + typedef __function::__base<_Rp(_A0, _A1, _A2)> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const _Fp&) {return true;} + template <class _R2, class _B0, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (*__p)(_B0, _B1, _B2)) {return __p;} + template <class _R2, class _Cp, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2)) {return __p;} + template <class _R2, class _Cp, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) const) {return __p;} + template <class _R2, class _Cp, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) volatile) {return __p;} + template <class _R2, class _Cp, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_B1, _B2) const volatile) {return __p;} + template <class _R2, class _B0, class _B1, class _B2> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const function<_Rp(_B0, _B1, _B2)>& __p) {return __p;} +public: + typedef _Rp result_type; + + // 20.7.16.2.1, construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {} + _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {} + function(const function&); + template<class _Fp> + function(_Fp, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) : __f_(0) {} + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {} + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, const function&); + template<class _Fp, class _Alloc> + function(allocator_arg_t, const _Alloc& __a, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type* = 0); + + function& operator=(const function&); + function& operator=(nullptr_t); + template<class _Fp> + typename enable_if + < + !is_integral<_Fp>::value, + function& + >::type + operator=(_Fp); + + ~function(); + + // 20.7.16.2.2, function modifiers: + void swap(function&); + template<class _Fp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp __f, const _Alloc& __a) + {function(allocator_arg, __a, __f).swap(*this);} + + // 20.7.16.2.3, function capacity: + _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;} + +private: + // deleted overloads close possible hole in the type system + template<class _R2, class _B0, class _B1, class _B2> + bool operator==(const function<_R2(_B0, _B1, _B2)>&) const;// = delete; + template<class _R2, class _B0, class _B1, class _B2> + bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const;// = delete; +public: + // 20.7.16.2.4, function invocation: + _Rp operator()(_A0, _A1, _A2) const; + +#ifndef _LIBCPP_NO_RTTI + // 20.7.16.2.5, function target access: + const std::type_info& target_type() const; + template <typename _Tp> _Tp* target(); + template <typename _Tp> const _Tp* target() const; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class _A0, class _A1, class _A2> +function<_Rp(_A0, _A1, _A2)>::function(const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0, class _A1, class _A2> +template<class _Alloc> +function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&, + const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class _A0, class _A1, class _A2> +template <class _Fp> +function<_Rp(_A0, _A1, _A2)>::function(_Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + if (__not_null(__f)) + { + typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, allocator<_Fp>(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0, class _A1, class _A2> +template <class _Fp, class _Alloc> +function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, + typename enable_if<!is_integral<_Fp>::value>::type*) + : __f_(0) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + if (__not_null(__f)) + { + typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(__f); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(__f, _Alloc(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class _A0, class _A1, class _A2> +function<_Rp(_A0, _A1, _A2)>& +function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template<class _Rp, class _A0, class _A1, class _A2> +function<_Rp(_A0, _A1, _A2)>& +function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t) +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; +} + +template<class _Rp, class _A0, class _A1, class _A2> +template <class _Fp> +typename enable_if +< + !is_integral<_Fp>::value, + function<_Rp(_A0, _A1, _A2)>& +>::type +function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f) +{ + function(_VSTD::move(__f)).swap(*this); + return *this; +} + +template<class _Rp, class _A0, class _A1, class _A2> +function<_Rp(_A0, _A1, _A2)>::~function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp, class _A0, class _A1, class _A2> +void +function<_Rp(_A0, _A1, _A2)>::swap(function& __f) +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__clone(__t); + __f_->destroy(); + __f_ = 0; + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = 0; + __f_ = (__base*)&__buf_; + __t->__clone((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__clone((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp, class _A0, class _A1, class _A2> +_Rp +function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__f_ == 0) + throw bad_function_call(); +#endif // _LIBCPP_NO_EXCEPTIONS + return (*__f_)(__a0, __a1, __a2); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Rp, class _A0, class _A1, class _A2> +const std::type_info& +function<_Rp(_A0, _A1, _A2)>::target_type() const +{ + if (__f_ == 0) + return typeid(void); + return __f_->target_type(); +} + +template<class _Rp, class _A0, class _A1, class _A2> +template <typename _Tp> +_Tp* +function<_Rp(_A0, _A1, _A2)>::target() +{ + if (__f_ == 0) + return (_Tp*)0; + return (_Tp*)__f_->target(typeid(_Tp)); +} + +template<class _Rp, class _A0, class _A1, class _A2> +template <typename _Tp> +const _Tp* +function<_Rp(_A0, _A1, _A2)>::target() const +{ + if (__f_ == 0) + return (const _Tp*)0; + return (const _Tp*)__f_->target(typeid(_Tp)); +} + +#endif // _LIBCPP_NO_RTTI + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const function<_Fp>& __f, nullptr_t) {return !__f;} + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(nullptr_t, const function<_Fp>& __f) {return !__f;} + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;} + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;} + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(function<_Fp>& __x, function<_Fp>& __y) +{return __x.swap(__y);} + +template<class _Tp> struct __is_bind_expression : public false_type {}; +template<class _Tp> struct _LIBCPP_VISIBLE is_bind_expression + : public __is_bind_expression<typename remove_cv<_Tp>::type> {}; + +template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {}; +template<class _Tp> struct _LIBCPP_VISIBLE is_placeholder + : public __is_placeholder<typename remove_cv<_Tp>::type> {}; + +namespace placeholders +{ + +template <int _Np> struct __ph {}; + +extern __ph<1> _1; +extern __ph<2> _2; +extern __ph<3> _3; +extern __ph<4> _4; +extern __ph<5> _5; +extern __ph<6> _6; +extern __ph<7> _7; +extern __ph<8> _8; +extern __ph<9> _9; +extern __ph<10> _10; + +} // placeholders + +template<int _Np> +struct __is_placeholder<placeholders::__ph<_Np> > + : public integral_constant<int, _Np> {}; + +template <class _Tp, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +_Tp& +__mu(reference_wrapper<_Tp> __t, _Uj&) +{ + return __t.get(); +} +/* +template <bool _IsBindExpr, class _Ti, class ..._Uj> +struct __mu_return1 {}; + +template <class _Ti, class ..._Uj> +struct __mu_return1<true, _Ti, _Uj...> +{ + typedef typename result_of<_Ti(_Uj...)>::type type; +}; + +template <class _Ti, class ..._Uj, size_t ..._Indx> +inline _LIBCPP_INLINE_VISIBILITY +typename __mu_return1<true, _Ti, _Uj...>::type +__mu_expand(_Ti& __ti, tuple<_Uj...>&& __uj, __tuple_indices<_Indx...>) +{ + __ti(_VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(get<_Indx>(__uj))...); +} + +template <class _Ti, class ..._Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_bind_expression<_Ti>::value, + typename __mu_return1<is_bind_expression<_Ti>::value, _Ti, _Uj...>::type +>::type +__mu(_Ti& __ti, tuple<_Uj...>& __uj) +{ + typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices; + return __mu_expand(__ti, __uj, __indices()); +} + +template <bool IsPh, class _Ti, class _Uj> +struct __mu_return2 {}; + +template <class _Ti, class _Uj> +struct __mu_return2<true, _Ti, _Uj> +{ + typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type; +}; + +template <class _Ti, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + 0 < is_placeholder<_Ti>::value, + typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type +>::type +__mu(_Ti&, _Uj& __uj) +{ + const size_t _Indx = is_placeholder<_Ti>::value - 1; + // compiler bug workaround + typename tuple_element<_Indx, _Uj>::type __t = get<_Indx>(__uj); + return __t; +// return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(get<_Indx>(__uj)); +} + +template <class _Ti, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_bind_expression<_Ti>::value && + is_placeholder<_Ti>::value == 0 && + !__is_reference_wrapper<_Ti>::value, + _Ti& +>::type +__mu(_Ti& __ti, _Uj& __uj) +{ + return __ti; +} + +template <class _Ti, bool IsBindEx, bool IsPh, class _TupleUj> +struct ____mu_return; + +template <class _Ti, class ..._Uj> +struct ____mu_return<_Ti, true, false, tuple<_Uj...> > +{ + typedef typename result_of<_Ti(_Uj...)>::type type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, false, true, _TupleUj> +{ + typedef typename tuple_element<is_placeholder<_Ti>::value - 1, + _TupleUj>::type&& type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, false, false, _TupleUj> +{ + typedef _Ti& type; +}; + +template <class _Ti, class _TupleUj> +struct __mu_return + : public ____mu_return<_Ti, + is_bind_expression<_Ti>::value, + 0 < is_placeholder<_Ti>::value, + _TupleUj> +{ +}; + +template <class _Ti, class _TupleUj> +struct __mu_return<reference_wrapper<_Ti>, _TupleUj> +{ + typedef _Ti& type; +}; + +template <class _Fp, class _BoundArgs, class _TupleUj> +struct __bind_return; + +template <class _Fp, class ..._BoundArgs, class _TupleUj> +struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj> +{ + typedef typename __ref_return + < + _Fp&, + typename __mu_return + < + _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template <class _Fp, class ..._BoundArgs, class _TupleUj> +struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj> +{ + typedef typename __ref_return + < + _Fp&, + typename __mu_return + < + const _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args> +inline _LIBCPP_INLINE_VISIBILITY +typename __bind_return<_Fp, _BoundArgs, _Args>::type +__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>, + _Args&& __args) +{ + return __invoke(__f, __mu(get<_Indx>(__bound_args), __args)...); +} + +template<class _Fp, class ..._BoundArgs> +class __bind +{ + _Fp __f_; + tuple<_BoundArgs...> __bound_args_; + + typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices; +public: + template <class _Gp, class ..._BA> + explicit __bind(_Gp&& __f, _BA&& ...__bound_args) + : __f_(_VSTD::forward<_Gp>(__f)), + __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} + + template <class ..._Args> + typename __bind_return<_Fp, tuple<_BoundArgs...>, tuple<_Args&&...> >::type + operator()(_Args&& ...__args) + { + // compiler bug workaround + return __apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(__args...)); + } + + template <class ..._Args> + typename __bind_return<_Fp, tuple<_BoundArgs...>, tuple<_Args&&...> >::type + operator()(_Args&& ...__args) const + { + return __apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(__args...)); + } +}; + +template<class _Fp, class ..._BoundArgs> +struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {}; + +template<class _Rp, class _Fp, class ..._BoundArgs> +class __bind_r + : public __bind<_Fp, _BoundArgs...> +{ + typedef __bind<_Fp, _BoundArgs...> base; +public: + typedef _Rp result_type; + + template <class _Gp, class ..._BA> + explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args) + : base(_VSTD::forward<_Gp>(__f), + _VSTD::forward<_BA>(__bound_args)...) {} + + template <class ..._Args> + result_type + operator()(_Args&& ...__args) + { + return base::operator()(_VSTD::forward<_Args>(__args)...); + } + + template <class ..._Args> + result_type + operator()(_Args&& ...__args) const + { + return base::operator()(_VSTD::forward<_Args>(__args)...); + } +}; + +template<class _Rp, class _Fp, class ..._BoundArgs> +struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {}; + +template<class _Fp, class ..._BoundArgs> +inline _LIBCPP_INLINE_VISIBILITY +__bind<typename decay<_Fp>::type, typename decay<_BoundArgs>::type...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind<typename decay<_Fp>::type, typename decay<_BoundArgs>::type...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} + +template<class _Rp, class _Fp, class ..._BoundArgs> +inline _LIBCPP_INLINE_VISIBILITY +__bind_r<_Rp, typename decay<_Fp>::type, typename decay<_BoundArgs>::type...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind_r<_Rp, typename decay<_Fp>::type, typename decay<_BoundArgs>::type...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} +*/ + +#endif // _LIBCPP_FUNCTIONAL_03 diff --git a/contrib/libc++/include/__functional_base b/contrib/libc++/include/__functional_base new file mode 100644 index 0000000..63aa41d --- /dev/null +++ b/contrib/libc++/include/__functional_base @@ -0,0 +1,437 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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_FUNCTIONAL_BASE +#define _LIBCPP_FUNCTIONAL_BASE + +#include <__config> +#include <type_traits> +#include <typeinfo> +#include <exception> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Arg, class _Result> +struct _LIBCPP_VISIBLE unary_function +{ + typedef _Arg argument_type; + typedef _Result result_type; +}; + +template <class _Arg1, class _Arg2, class _Result> +struct _LIBCPP_VISIBLE binary_function +{ + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; +}; + +template <class _Tp> struct _LIBCPP_VISIBLE hash; + +template <class _Tp> +struct __has_result_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::result_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE less : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x < __y;} +}; + +#ifdef _LIBCPP_HAS_NO_VARIADICS + +#include <__functional_base_03> + +#else // _LIBCPP_HAS_NO_VARIADICS + +// __weak_result_type + +template <class _Tp> +struct __derives_from_unary_function +{ +private: + struct __two {char _; char __;}; + static __two __test(...); + template <class _Ap, class _Rp> + static unary_function<_Ap, _Rp> + __test(const volatile unary_function<_Ap, _Rp>*); +public: + static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template <class _Tp> +struct __derives_from_binary_function +{ +private: + struct __two {char _; char __;}; + static __two __test(...); + template <class _A1, class _A2, class _Rp> + static binary_function<_A1, _A2, _Rp> + __test(const volatile binary_function<_A1, _A2, _Rp>*); +public: + static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template <class _Tp, bool = __derives_from_unary_function<_Tp>::value> +struct __maybe_derive_from_unary_function // bool is true + : public __derives_from_unary_function<_Tp>::type +{ +}; + +template <class _Tp> +struct __maybe_derive_from_unary_function<_Tp, false> +{ +}; + +template <class _Tp, bool = __derives_from_binary_function<_Tp>::value> +struct __maybe_derive_from_binary_function // bool is true + : public __derives_from_binary_function<_Tp>::type +{ +}; + +template <class _Tp> +struct __maybe_derive_from_binary_function<_Tp, false> +{ +}; + +template <class _Tp, bool = __has_result_type<_Tp>::value> +struct __weak_result_type_imp // bool is true + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ + typedef typename _Tp::result_type result_type; +}; + +template <class _Tp> +struct __weak_result_type_imp<_Tp, false> + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ +}; + +template <class _Tp> +struct __weak_result_type + : public __weak_result_type_imp<_Tp> +{ +}; + +// 0 argument case + +template <class _Rp> +struct __weak_result_type<_Rp ()> +{ + typedef _Rp result_type; +}; + +template <class _Rp> +struct __weak_result_type<_Rp (&)()> +{ + typedef _Rp result_type; +}; + +template <class _Rp> +struct __weak_result_type<_Rp (*)()> +{ + typedef _Rp result_type; +}; + +// 1 argument case + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (&)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (*)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)()> + : public unary_function<_Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() const> + : public unary_function<const _Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() volatile> + : public unary_function<volatile _Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() const volatile> + : public unary_function<const volatile _Cp*, _Rp> +{ +}; + +// 2 argument case + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (*)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (&)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1)> + : public binary_function<_Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) const> + : public binary_function<const _Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> + : public binary_function<volatile _Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> + : public binary_function<const volatile _Cp*, _A1, _Rp> +{ +}; + +// 3 or more arguments + +template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> +struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> +struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _A1, class _A2, class _A3, class ..._A4> +struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> +{ + typedef _Rp result_type; +}; + +// __invoke + +// bullets 1 and 2 + +template <class _Fp, class _A0, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)) +{ + return (_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...); +} + +template <class _Fp, class _A0, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)) +{ + return ((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...); +} + +// bullets 3 and 4 + +template <class _Fp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0) + -> decltype(_VSTD::forward<_A0>(__a0).*__f) +{ + return _VSTD::forward<_A0>(__a0).*__f; +} + +template <class _Fp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _A0&& __a0) + -> decltype((*_VSTD::forward<_A0>(__a0)).*__f) +{ + return (*_VSTD::forward<_A0>(__a0)).*__f; +} + +// bullet 5 + +template <class _Fp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +auto +__invoke(_Fp&& __f, _Args&& ...__args) + -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)) +{ + return _VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...); +} + +template <class _Tp, class ..._Args> +struct __invoke_return +{ + typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_Args>()...)) type; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE reference_wrapper + : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type* __f_; + +public: + // construct/copy/destroy + _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) _NOEXCEPT : __f_(&__f) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + private: reference_wrapper(type&&); public: // = delete; // do not bind to temps +#endif + + // access + _LIBCPP_INLINE_VISIBILITY operator type& () const _NOEXCEPT {return *__f_;} + _LIBCPP_INLINE_VISIBILITY type& get() const _NOEXCEPT {return *__f_;} + + // invoke + template <class... _ArgTypes> + _LIBCPP_INLINE_VISIBILITY + typename __invoke_of<type&, _ArgTypes...>::type + operator() (_ArgTypes&&... __args) const + { + return __invoke(get(), _VSTD::forward<_ArgTypes>(__args)...); + } +}; + +template <class _Tp> struct ____is_reference_wrapper : public false_type {}; +template <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {}; +template <class _Tp> struct __is_reference_wrapper + : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(_Tp& __t) _NOEXCEPT +{ + return reference_wrapper<_Tp>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return ref(__t.get()); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<const _Tp> +cref(const _Tp& __t) _NOEXCEPT +{ + return reference_wrapper<const _Tp>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<const _Tp> +cref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return cref(__t.get()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + +template <class _Tp> void ref(const _Tp&&) = delete; +template <class _Tp> void cref(const _Tp&&) = delete; + +#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS + +template <class _Tp> void ref(const _Tp&&);// = delete; +template <class _Tp> void cref(const _Tp&&);// = delete; + +#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_VARIADICS + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FUNCTIONAL_BASE diff --git a/contrib/libc++/include/__functional_base_03 b/contrib/libc++/include/__functional_base_03 new file mode 100644 index 0000000..6c6ce53 --- /dev/null +++ b/contrib/libc++/include/__functional_base_03 @@ -0,0 +1,1087 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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_FUNCTIONAL_BASE_03 +#define _LIBCPP_FUNCTIONAL_BASE_03 + +// manual variadic expansion for <functional> + +// __weak_result_type + +template <class _Tp> +struct __derives_from_unary_function +{ +private: + struct __two {char _; char __;}; + static __two __test(...); + template <class _Ap, class _Rp> + static unary_function<_Ap, _Rp> + __test(const volatile unary_function<_Ap, _Rp>*); +public: + static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template <class _Tp> +struct __derives_from_binary_function +{ +private: + struct __two {char _; char __;}; + static __two __test(...); + template <class _A1, class _A2, class _Rp> + static binary_function<_A1, _A2, _Rp> + __test(const volatile binary_function<_A1, _A2, _Rp>*); +public: + static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template <class _Tp, bool = __derives_from_unary_function<_Tp>::value> +struct __maybe_derive_from_unary_function // bool is true + : public __derives_from_unary_function<_Tp>::type +{ +}; + +template <class _Tp> +struct __maybe_derive_from_unary_function<_Tp, false> +{ +}; + +template <class _Tp, bool = __derives_from_binary_function<_Tp>::value> +struct __maybe_derive_from_binary_function // bool is true + : public __derives_from_binary_function<_Tp>::type +{ +}; + +template <class _Tp> +struct __maybe_derive_from_binary_function<_Tp, false> +{ +}; + +template <class _Tp, bool = __has_result_type<_Tp>::value> +struct __weak_result_type_imp // bool is true + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ + typedef typename _Tp::result_type result_type; +}; + +template <class _Tp> +struct __weak_result_type_imp<_Tp, false> + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ +}; + +template <class _Tp> +struct __weak_result_type + : public __weak_result_type_imp<typename remove_reference<_Tp>::type> +{ +}; + +// 0 argument case + +template <class _Rp> +struct __weak_result_type<_Rp ()> +{ + typedef _Rp result_type; +}; + +template <class _Rp> +struct __weak_result_type<_Rp (&)()> +{ + typedef _Rp result_type; +}; + +template <class _Rp> +struct __weak_result_type<_Rp (*)()> +{ + typedef _Rp result_type; +}; + +// 1 argument case + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (&)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _A1> +struct __weak_result_type<_Rp (*)(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)()> + : public unary_function<_Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() const> + : public unary_function<const _Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() volatile> + : public unary_function<volatile _Cp*, _Rp> +{ +}; + +template <class _Rp, class _Cp> +struct __weak_result_type<_Rp (_Cp::*)() const volatile> + : public unary_function<const volatile _Cp*, _Rp> +{ +}; + +// 2 argument case + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (*)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _A1, class _A2> +struct __weak_result_type<_Rp (&)(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1)> + : public binary_function<_Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) const> + : public binary_function<const _Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> + : public binary_function<volatile _Cp*, _A1, _Rp> +{ +}; + +template <class _Rp, class _Cp, class _A1> +struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> + : public binary_function<const volatile _Cp*, _A1, _Rp> +{ +}; + +// 3 or more arguments + +template <class _Rp, class _A1, class _A2, class _A3> +struct __weak_result_type<_Rp (_A1, _A2, _A3)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _A1, class _A2, class _A3> +struct __weak_result_type<_Rp (&)(_A1, _A2, _A3)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _A1, class _A2, class _A3> +struct __weak_result_type<_Rp (*)(_A1, _A2, _A3)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2)> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) const> +{ + typedef _Rp result_type; +}; + +template <class _Rp, class _Cp, class _A1, class _A2> +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2) volatile> +{ + typedef _Rp result_type; +}; + +// __invoke + +// __ref_return0 +// +// template <class _Tp, bool _HasResultType> +// struct ________ref_return0 // _HasResultType is true +// { +// typedef typename _Tp::result_type type; +// }; +// +// template <class _Tp> +// struct ________ref_return0<_Tp, false> +// { +// typedef void type; +// }; +// +// template <class _Tp, bool _IsClass> +// struct ____ref_return0 // _IsClass is true +// : public ________ref_return0<_Tp, __has_result_type<typename remove_cv<_Tp>::type>::value> +// { +// }; +// +// template <class _Tp, bool _HasResultType> +// struct ______ref_return0 // _HasResultType is true +// { +// typedef typename __callable_type<_Tp>::result_type type; +// }; +// +// template <class _Tp> +// struct ______ref_return0<_Tp, false> // pointer to member data +// { +// typedef void type; +// }; +// +// template <class _Tp> +// struct ____ref_return0<_Tp, false> +// : public ______ref_return0<typename remove_cv<_Tp>::type, +// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value> +// { +// }; +// +// template <class _Tp> +// struct __ref_return0 +// : public ____ref_return0<typename remove_reference<_Tp>::type, +// is_class<typename remove_reference<_Tp>::type>::value> +// { +// }; +// +// __ref_return1 +// +// template <class _Tp, bool _IsClass, class _A0> +// struct ____ref_return1 // _IsClass is true +// { +// typedef typename result_of<_Tp(_A0)>::type type; +// }; +// +// template <class _Tp, bool _HasResultType, class _A0> +// struct ______ref_return1 // _HasResultType is true +// { +// typedef typename __callable_type<_Tp>::result_type type; +// }; +// +// template <class _Tp, class _A0, bool> +// struct __ref_return1_member_data1; +// +// template <class _Rp, class _Cp, class _A0> +// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, true> +// { +// typedef typename __apply_cv<_A0, _Rp>::type& type; +// }; +// +// template <class _Rp, class _Cp, class _A0> +// struct __ref_return1_member_data1<_Rp _Cp::*, _A0, false> +// { +// static _A0 __a; +// typedef typename __apply_cv<decltype(*__a), _Rp>::type& type; +// }; +// +// template <class _Tp, class _A0> +// struct __ref_return1_member_data; +// +// template <class _Rp, class _Cp, class _A0> +// struct __ref_return1_member_data<_Rp _Cp::*, _A0> +// : public __ref_return1_member_data1<_Rp _Cp::*, _A0, +// is_same<typename remove_cv<_Cp>::type, +// typename remove_cv<typename remove_reference<_A0>::type>::type>::value> +// { +// }; +// +// template <class _Tp, class _A0> +// struct ______ref_return1<_Tp, false, _A0> // pointer to member data +// : public __ref_return1_member_data<typename remove_cv<_Tp>::type, _A0> +// { +// }; +// +// template <class _Tp, class _A0> +// struct ____ref_return1<_Tp, false, _A0> +// : public ______ref_return1<typename remove_cv<_Tp>::type, +// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0> +// { +// }; +// +// template <class _Tp, class _A0> +// struct __ref_return1 +// : public ____ref_return1<typename remove_reference<_Tp>::type, +// is_class<typename remove_reference<_Tp>::type>::value, _A0> +// { +// }; +// +// __ref_return2 +// +// template <class _Tp, bool _IsClass, class _A0, class _A1> +// struct ____ref_return2 // _IsClass is true +// { +// typedef typename result_of<_Tp(_A0, _A1)>::type type; +// }; +// +// template <class _Tp, bool _HasResultType, class _A0, class _A1> +// struct ______ref_return2 // _HasResultType is true +// { +// typedef typename __callable_type<_Tp>::result_type type; +// }; +// +// template <class _Tp> +// struct ______ref_return2<_Tp, false, class _A0, class _A1> // pointer to member data +// { +// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer" +// " to member data with too many arguments."); +// }; +// +// template <class _Tp, class _A0, class _A1> +// struct ____ref_return2<_Tp, false, _A0, _A1> +// : public ______ref_return2<typename remove_cv<_Tp>::type, +// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1> +// { +// }; +// +// template <class _Tp, class _A0, class _A1> +// struct __ref_return2 +// : public ____ref_return2<typename remove_reference<_Tp>::type, +// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1> +// { +// }; +// +// __ref_return3 +// +// template <class _Tp, bool _IsClass, class _A0, class _A1, class _A2> +// struct ____ref_return3 // _IsClass is true +// { +// typedef typename result_of<_Tp(_A0, _A1, _A2)>::type type; +// }; +// +// template <class _Tp, bool _HasResultType, class _A0, class _A1, class _A2> +// struct ______ref_return3 // _HasResultType is true +// { +// typedef typename __callable_type<_Tp>::result_type type; +// }; +// +// template <class _Tp> +// struct ______ref_return3<_Tp, false, class _A0, class _A1, class _A2> // pointer to member data +// { +// static_assert(sizeof(_Tp) == 0, "An attempt has been made to `call` a pointer" +// " to member data with too many arguments."); +// }; +// +// template <class _Tp, class _A0, class _A1, class _A2> +// struct ____ref_return3<_Tp, false, _A0, _A1, _A2> +// : public ______ref_return3<typename remove_cv<_Tp>::type, +// __has_result_type<__callable_type<typename remove_cv<_Tp>::type> >::value, _A0, _A1, _A2> +// { +// }; +// +// template <class _Tp, class _A0, class _A1, class _A2> +// struct __ref_return3 +// : public ____ref_return3<typename remove_reference<_Tp>::type, +// is_class<typename remove_reference<_Tp>::type>::value, _A0, _A1, _A2> +// { +// }; + +// first bullet + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(), _T1& __t1) +{ + return (__t1.*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0), _T1& __t1, _A0& __a0) +{ + return (__t1.*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1) +{ + return (__t1.*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return (__t1.*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() const, _T1& __t1) +{ + return (__t1.*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) const, _T1& __t1, _A0& __a0) +{ + return (__t1.*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1) +{ + return (__t1.*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return (__t1.*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() volatile, _T1& __t1) +{ + return (__t1.*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1& __t1, _A0& __a0) +{ + return (__t1.*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1) +{ + return (__t1.*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return (__t1.*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() const volatile, _T1& __t1) +{ + return (__t1.*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0) +{ + return (__t1.*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1) +{ + return (__t1.*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return (__t1.*__f)(__a0, __a1, __a2); +} + +// second bullet + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(), _T1 __t1) +{ + return ((*__t1).*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0), _T1 __t1, _A0& __a0) +{ + return ((*__t1).*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1) +{ + return ((*__t1).*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return ((*__t1).*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() const, _T1 __t1) +{ + return ((*__t1).*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) const, _T1 __t1, _A0& __a0) +{ + return ((*__t1).*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1) +{ + return ((*__t1).*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return ((*__t1).*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() volatile, _T1 __t1) +{ + return ((*__t1).*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) volatile, _T1 __t1, _A0& __a0) +{ + return ((*__t1).*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1) +{ + return ((*__t1).*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return ((*__t1).*__f)(__a0, __a1, __a2); +} + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)() const volatile, _T1 __t1) +{ + return ((*__t1).*__f)(); +} + +template <class _Rp, class _Tp, class _T1, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0) +{ + return ((*__t1).*__f)(__a0); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1) +{ + return ((*__t1).*__f)(__a0, __a1); +} + +template <class _Rp, class _Tp, class _T1, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + _Rp +>::type +__invoke(_Rp (_Tp::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return ((*__t1).*__f)(__a0, __a1, __a2); +} + +// third bullet + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_base_of<_Tp, typename remove_reference<_T1>::type>::value, + typename __apply_cv<_T1, _Rp>::type& +>::type +__invoke(_Rp _Tp::* __f, _T1& __t1) +{ + return __t1.*__f; +} + +template <class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +__invoke(_Rp _Tp::*) +{ +} + +// template <class _Dp, class _Rp, class _Tp, class _T1> +// inline _LIBCPP_INLINE_VISIBILITY +// typename enable_if +// < +// is_base_of<_Tp, typename remove_reference<_T1>::type>::value, +// typename __ref_return1<_Rp _Tp::*, _T1>::type +// >::type +// __invoke(_Rp _Tp::* __f, _T1& __t1) +// { +// return __t1.*__f; +// } + +// forth bullet + +template <class _T1, class _Rp, bool> +struct __4th_helper +{ +}; + +template <class _T1, class _Rp> +struct __4th_helper<_T1, _Rp, true> +{ + typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Rp>::type type; +}; + +template <class _Rp, class _Tp, class _T1> +inline _LIBCPP_INLINE_VISIBILITY +typename __4th_helper<_T1, _Rp, + !is_base_of<_Tp, + typename remove_reference<_T1>::type + >::value + >::type& +__invoke(_Rp _Tp::* __f, _T1& __t1) +{ + return (*__t1).*__f; +} + +// template <class _Dp, class _Rp, class _Tp, class _T1> +// inline _LIBCPP_INLINE_VISIBILITY +// typename enable_if +// < +// !is_base_of<_Tp, typename remove_reference<_T1>::type>::value, +// typename __ref_return1<_Rp _Tp::*, _T1>::type +// >::type +// __invoke(_Rp _Tp::* __f, _T1 __t1) +// { +// return (*__t1).*__f; +// } + +// fifth bullet + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +decltype(declval<_Fp>()()) +__invoke(_Fp __f) +{ + return __f(); +} + +template <class _Fp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +decltype(declval<_Fp>()(declval<_A0&>())) +__invoke(_Fp __f, _A0& __a0) +{ + return __f(__a0); +} + +template <class _Fp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>())) +__invoke(_Fp __f, _A0& __a0, _A1& __a1) +{ + return __f(__a0, __a1); +} + +template <class _Fp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +decltype(declval<_Fp>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>())) +__invoke(_Fp __f, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return __f(__a0, __a1, __a2); +} + +// template <class _Rp, class _Fp> +// inline _LIBCPP_INLINE_VISIBILITY +// _Rp +// __invoke(_Fp& __f) +// { +// return __f(); +// } +// +// template <class _Rp, class _Fp, class _A0> +// inline _LIBCPP_INLINE_VISIBILITY +// typename enable_if +// < +// !is_member_pointer<_Fp>::value, +// _Rp +// >::type +// __invoke(_Fp& __f, _A0& __a0) +// { +// return __f(__a0); +// } +// +// template <class _Rp, class _Fp, class _A0, class _A1> +// inline _LIBCPP_INLINE_VISIBILITY +// _Rp +// __invoke(_Fp& __f, _A0& __a0, _A1& __a1) +// { +// return __f(__a0, __a1); +// } +// +// template <class _Rp, class _Fp, class _A0, class _A1, class _A2> +// inline _LIBCPP_INLINE_VISIBILITY +// _Rp +// __invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2) +// { +// return __f(__a0, __a1, __a2); +// } + +template <class _Tp> +struct __has_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value> +struct __invoke_return +{ + typedef typename __weak_result_type<_Fp>::result_type type; +}; + +template <class _Fp> +struct __invoke_return<_Fp, false> +{ + typedef decltype(__invoke(_VSTD::declval<_Fp>())) type; +}; + +template <class _Tp, class _A0> +struct __invoke_return0 +{ + typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type; +}; + +template <class _Rp, class _Tp, class _A0> +struct __invoke_return0<_Rp _Tp::*, _A0> +{ + typedef typename __apply_cv<_A0, _Rp>::type& type; +}; + +template <class _Rp, class _Tp, class _A0> +struct __invoke_return0<_Rp _Tp::*, _A0*> +{ + typedef typename __apply_cv<_A0, _Rp>::type& type; +}; + +template <class _Tp, class _A0, class _A1> +struct __invoke_return1 +{ + typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(), + _VSTD::declval<_A1>())) type; +}; + +template <class _Tp, class _A0, class _A1, class _A2> +struct __invoke_return2 +{ + typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>(), + _VSTD::declval<_A1>(), + _VSTD::declval<_A2>())) type; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE reference_wrapper + : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type* __f_; + +public: + // construct/copy/destroy + _LIBCPP_INLINE_VISIBILITY reference_wrapper(type& __f) : __f_(&__f) {} + + // access + _LIBCPP_INLINE_VISIBILITY operator type& () const {return *__f_;} + _LIBCPP_INLINE_VISIBILITY type& get() const {return *__f_;} + + // invoke + + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return<type&>::type + operator() () const + { + return __invoke(get()); + } + + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return0<type&, _A0>::type + operator() (_A0& __a0) const + { + return __invoke(get(), __a0); + } + + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return1<type&, _A0, _A1>::type + operator() (_A0& __a0, _A1& __a1) const + { + return __invoke(get(), __a0, __a1); + } + + template <class _A0, class _A1, class _A2> + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return2<type&, _A0, _A1, _A2>::type + operator() (_A0& __a0, _A1& __a1, _A2& __a2) const + { + return __invoke(get(), __a0, __a1, __a2); + } +}; + +template <class _Tp> struct ____is_reference_wrapper : public false_type {}; +template <class _Tp> struct ____is_reference_wrapper<reference_wrapper<_Tp> > : public true_type {}; +template <class _Tp> struct __is_reference_wrapper + : public ____is_reference_wrapper<typename remove_cv<_Tp>::type> {}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(_Tp& __t) +{ + return reference_wrapper<_Tp>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<_Tp> +ref(reference_wrapper<_Tp> __t) +{ + return ref(__t.get()); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<const _Tp> +cref(const _Tp& __t) +{ + return reference_wrapper<const _Tp>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +reference_wrapper<const _Tp> +cref(reference_wrapper<_Tp> __t) +{ + return cref(__t.get()); +} + +#endif // _LIBCPP_FUNCTIONAL_BASE_03 diff --git a/contrib/libc++/include/__hash_table b/contrib/libc++/include/__hash_table new file mode 100644 index 0000000..fad4e0e --- /dev/null +++ b/contrib/libc++/include/__hash_table @@ -0,0 +1,1920 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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__HASH_TABLE +#define _LIBCPP__HASH_TABLE + +#include <__config> +#include <initializer_list> +#include <memory> +#include <iterator> +#include <algorithm> +#include <cmath> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_VISIBLE +size_t __next_prime(size_t __n); + +template <class _NodePtr> +struct __hash_node_base +{ + typedef __hash_node_base __first_node; + // typedef _NodePtr pointer; + + _NodePtr __next_; + + _LIBCPP_INLINE_VISIBILITY __hash_node_base() _NOEXCEPT : __next_(nullptr) {} +}; + +template <class _Tp, class _VoidPtr> +struct __hash_node + : public __hash_node_base + < + typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__hash_node<_Tp, _VoidPtr> > +#else + rebind<__hash_node<_Tp, _VoidPtr> >::other +#endif + > +{ + typedef _Tp value_type; + + size_t __hash_; + value_type __value_; +}; + +template <class _Tp, class _Hash, class _Equal, class _Alloc> class __hash_table; +template <class _ConstNodePtr> class __hash_const_iterator; +template <class _HashIterator> class __hash_map_iterator; +template <class _HashIterator> class __hash_map_const_iterator; +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> + class _LIBCPP_VISIBLE unordered_map; + +template <class _NodePtr> +class _LIBCPP_VISIBLE __hash_iterator +{ + typedef _NodePtr __node_pointer; + + __node_pointer __node_; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename pointer_traits<__node_pointer>::element_type::value_type value_type; + typedef typename pointer_traits<__node_pointer>::difference_type difference_type; + typedef value_type& reference; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __node_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return _VSTD::addressof(__node_->__value_);} + + _LIBCPP_INLINE_VISIBILITY + __hash_iterator& operator++() + { + __node_ = __node_->__next_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_iterator operator++(int) + { + __hash_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_iterator& __x, const __hash_iterator& __y) + {return __x.__node_ == __y.__node_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y) + {return __x.__node_ != __y.__node_;} + +private: + _LIBCPP_INLINE_VISIBILITY + __hash_iterator(__node_pointer __node) _NOEXCEPT + : __node_(__node) + {} + + template <class, class, class, class> friend class __hash_table; + template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_map_iterator; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap; +}; + +template <class _ConstNodePtr> +class _LIBCPP_VISIBLE __hash_const_iterator +{ + typedef _ConstNodePtr __node_pointer; + + __node_pointer __node_; + + typedef typename remove_const< + typename pointer_traits<__node_pointer>::element_type + >::type __node; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename __node::value_type value_type; + typedef typename pointer_traits<__node_pointer>::difference_type difference_type; + typedef const value_type& reference; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__node> +#else + rebind<__node>::other +#endif + __non_const_node_pointer; + typedef __hash_iterator<__non_const_node_pointer> __non_const_iterator; + + _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator(const __non_const_iterator& __x) _NOEXCEPT + : __node_(__x.__node_) + {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __node_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return _VSTD::addressof(__node_->__value_);} + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator& operator++() + { + __node_ = __node_->__next_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator operator++(int) + { + __hash_const_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y) + {return __x.__node_ == __y.__node_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y) + {return __x.__node_ != __y.__node_;} + +private: + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator(__node_pointer __node) _NOEXCEPT + : __node_(__node) + {} + + template <class, class, class, class> friend class __hash_table; + template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap; +}; + +template <class _ConstNodePtr> class _LIBCPP_VISIBLE __hash_const_local_iterator; + +template <class _NodePtr> +class _LIBCPP_VISIBLE __hash_local_iterator +{ + typedef _NodePtr __node_pointer; + + __node_pointer __node_; + size_t __bucket_; + size_t __bucket_count_; + + typedef pointer_traits<__node_pointer> __pointer_traits; +public: + typedef forward_iterator_tag iterator_category; + typedef typename __pointer_traits::element_type::value_type value_type; + typedef typename __pointer_traits::difference_type difference_type; + typedef value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __node_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &__node_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator& operator++() + { + __node_ = __node_->__next_; + if (__node_ != nullptr && __node_->__hash_ % __bucket_count_ != __bucket_) + __node_ = nullptr; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator operator++(int) + { + __hash_local_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y) + {return __x.__node_ == __y.__node_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y) + {return __x.__node_ != __y.__node_;} + +private: + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator(__node_pointer __node, size_t __bucket, + size_t __bucket_count) _NOEXCEPT + : __node_(__node), + __bucket_(__bucket), + __bucket_count_(__bucket_count) + { + if (__node_ != nullptr) + __node_ = __node_->__next_; + } + + template <class, class, class, class> friend class __hash_table; + template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_map_iterator; +}; + +template <class _ConstNodePtr> +class _LIBCPP_VISIBLE __hash_const_local_iterator +{ + typedef _ConstNodePtr __node_pointer; + + __node_pointer __node_; + size_t __bucket_; + size_t __bucket_count_; + + typedef pointer_traits<__node_pointer> __pointer_traits; + typedef typename __pointer_traits::element_type __node; + typedef typename remove_const<__node>::type __non_const_node; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__non_const_node> +#else + rebind<__non_const_node>::other +#endif + __non_const_node_pointer; + typedef __hash_local_iterator<__non_const_node_pointer> + __non_const_iterator; +public: + typedef forward_iterator_tag iterator_category; + typedef typename remove_const< + typename __pointer_traits::element_type::value_type + >::type value_type; + typedef typename __pointer_traits::difference_type difference_type; + typedef const value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator(const __non_const_iterator& __x) _NOEXCEPT + : __node_(__x.__node_), + __bucket_(__x.__bucket_), + __bucket_count_(__x.__bucket_count_) + {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __node_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &__node_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator& operator++() + { + __node_ = __node_->__next_; + if (__node_ != nullptr && __node_->__hash_ % __bucket_count_ != __bucket_) + __node_ = nullptr; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator operator++(int) + { + __hash_const_local_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y) + {return __x.__node_ == __y.__node_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y) + {return __x.__node_ != __y.__node_;} + +private: + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator(__node_pointer __node, size_t __bucket, + size_t __bucket_count) _NOEXCEPT + : __node_(__node), + __bucket_(__bucket), + __bucket_count_(__bucket_count) + { + if (__node_ != nullptr) + __node_ = __node_->__next_; + } + + template <class, class, class, class> friend class __hash_table; + template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator; +}; + +template <class _Alloc> +class __bucket_list_deallocator +{ + typedef _Alloc allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::size_type size_type; + + __compressed_pair<size_type, allocator_type> __data_; +public: + typedef typename __alloc_traits::pointer pointer; + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + : __data_(0) {} + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator(const allocator_type& __a, size_type __size) + _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) + : __data_(__size, __a) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator(__bucket_list_deallocator&& __x) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __data_(_VSTD::move(__x.__data_)) + { + __x.size() = 0; + } + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + size_type& size() _NOEXCEPT {return __data_.first();} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __data_.first();} + + _LIBCPP_INLINE_VISIBILITY + allocator_type& __alloc() _NOEXCEPT {return __data_.second();} + _LIBCPP_INLINE_VISIBILITY + const allocator_type& __alloc() const _NOEXCEPT {return __data_.second();} + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + __alloc_traits::deallocate(__alloc(), __p, size()); + } +}; + +template <class _Alloc> class __hash_map_node_destructor; + +template <class _Alloc> +class __hash_node_destructor +{ + typedef _Alloc allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::value_type::value_type value_type; +public: + typedef typename __alloc_traits::pointer pointer; +private: + + allocator_type& __na_; + + __hash_node_destructor& operator=(const __hash_node_destructor&); + +public: + bool __value_constructed; + + _LIBCPP_INLINE_VISIBILITY + explicit __hash_node_destructor(allocator_type& __na, + bool __constructed = false) _NOEXCEPT + : __na_(__na), + __value_constructed(__constructed) + {} + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + if (__value_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } + + template <class> friend class __hash_map_node_destructor; +}; + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +class __hash_table +{ +public: + typedef _Tp value_type; + typedef _Hash hasher; + typedef _Equal key_equal; + typedef _Alloc allocator_type; + +private: + typedef allocator_traits<allocator_type> __alloc_traits; +public: + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; +public: + // Create __node + typedef __hash_node<value_type, typename __alloc_traits::void_pointer> __node; + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__node> +#else + rebind_alloc<__node>::other +#endif + __node_allocator; + typedef allocator_traits<__node_allocator> __node_traits; + typedef typename __node_traits::pointer __node_pointer; + typedef typename __node_traits::const_pointer __node_const_pointer; + typedef __hash_node_base<__node_pointer> __first_node; + +private: + + typedef typename __node_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__node_pointer> +#else + rebind_alloc<__node_pointer>::other +#endif + __pointer_allocator; + typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter; + typedef unique_ptr<__node_pointer[], __bucket_list_deleter> __bucket_list; + typedef allocator_traits<__pointer_allocator> __pointer_alloc_traits; + typedef typename __bucket_list_deleter::pointer __node_pointer_pointer; + + // --- Member data begin --- + __bucket_list __bucket_list_; + __compressed_pair<__first_node, __node_allocator> __p1_; + __compressed_pair<size_type, hasher> __p2_; + __compressed_pair<float, key_equal> __p3_; + // --- Member data end --- + + _LIBCPP_INLINE_VISIBILITY + size_type& size() _NOEXCEPT {return __p2_.first();} +public: + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __p2_.first();} + + _LIBCPP_INLINE_VISIBILITY + hasher& hash_function() _NOEXCEPT {return __p2_.second();} + _LIBCPP_INLINE_VISIBILITY + const hasher& hash_function() const _NOEXCEPT {return __p2_.second();} + + _LIBCPP_INLINE_VISIBILITY + float& max_load_factor() _NOEXCEPT {return __p3_.first();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __p3_.first();} + + _LIBCPP_INLINE_VISIBILITY + key_equal& key_eq() _NOEXCEPT {return __p3_.second();} + _LIBCPP_INLINE_VISIBILITY + const key_equal& key_eq() const _NOEXCEPT {return __p3_.second();} + + _LIBCPP_INLINE_VISIBILITY + __node_allocator& __node_alloc() _NOEXCEPT {return __p1_.second();} + _LIBCPP_INLINE_VISIBILITY + const __node_allocator& __node_alloc() const _NOEXCEPT + {return __p1_.second();} + +public: + typedef __hash_iterator<__node_pointer> iterator; + typedef __hash_const_iterator<__node_const_pointer> const_iterator; + typedef __hash_local_iterator<__node_pointer> local_iterator; + typedef __hash_const_local_iterator<__node_const_pointer> const_local_iterator; + + __hash_table() + _NOEXCEPT_( + is_nothrow_default_constructible<__bucket_list>::value && + is_nothrow_default_constructible<__first_node>::value && + is_nothrow_default_constructible<__node_allocator>::value && + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value); + __hash_table(const hasher& __hf, const key_equal& __eql); + __hash_table(const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + explicit __hash_table(const allocator_type& __a); + __hash_table(const __hash_table& __u); + __hash_table(const __hash_table& __u, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __hash_table(__hash_table&& __u) + _NOEXCEPT_( + is_nothrow_move_constructible<__bucket_list>::value && + is_nothrow_move_constructible<__first_node>::value && + is_nothrow_move_constructible<__node_allocator>::value && + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value); + __hash_table(__hash_table&& __u, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~__hash_table(); + + __hash_table& operator=(const __hash_table& __u); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __hash_table& operator=(__hash_table&& __u) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); +#endif + template <class _InputIterator> + void __assign_unique(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + void __assign_multi(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + { + return allocator_traits<__pointer_allocator>::max_size( + __bucket_list_.get_deleter().__alloc()); + } + + pair<iterator, bool> __node_insert_unique(__node_pointer __nd); + iterator __node_insert_multi(__node_pointer __nd); + iterator __node_insert_multi(const_iterator __p, + __node_pointer __nd); + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + pair<iterator, bool> __emplace_unique(_Args&&... __args); + template <class... _Args> + iterator __emplace_multi(_Args&&... __args); + template <class... _Args> + iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args); +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + + pair<iterator, bool> __insert_unique(const value_type& __x); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp> + pair<iterator, bool> __insert_unique(_Pp&& __x); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp> + iterator __insert_multi(_Pp&& __x); + template <class _Pp> + iterator __insert_multi(const_iterator __p, _Pp&& __x); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + iterator __insert_multi(const value_type& __x); + iterator __insert_multi(const_iterator __p, const value_type& __x); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + void clear() _NOEXCEPT; + void rehash(size_type __n); + _LIBCPP_INLINE_VISIBILITY void reserve(size_type __n) + {rehash(static_cast<size_type>(ceil(__n / max_load_factor())));} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT + { + return __bucket_list_.get_deleter().size(); + } + + iterator begin() _NOEXCEPT; + iterator end() _NOEXCEPT; + const_iterator begin() const _NOEXCEPT; + const_iterator end() const _NOEXCEPT; + + template <class _Key> + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const _Key& __k) const + {return hash_function()(__k) % bucket_count();} + + template <class _Key> + iterator find(const _Key& __x); + template <class _Key> + const_iterator find(const _Key& __x) const; + + typedef __hash_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + + iterator erase(const_iterator __p); + iterator erase(const_iterator __first, const_iterator __last); + template <class _Key> + size_type __erase_unique(const _Key& __k); + template <class _Key> + size_type __erase_multi(const _Key& __k); + __node_holder remove(const_iterator __p) _NOEXCEPT; + + template <class _Key> + size_type __count_unique(const _Key& __k) const; + template <class _Key> + size_type __count_multi(const _Key& __k) const; + + template <class _Key> + pair<iterator, iterator> + __equal_range_unique(const _Key& __k); + template <class _Key> + pair<const_iterator, const_iterator> + __equal_range_unique(const _Key& __k) const; + + template <class _Key> + pair<iterator, iterator> + __equal_range_multi(const _Key& __k); + template <class _Key> + pair<const_iterator, const_iterator> + __equal_range_multi(const _Key& __k) const; + + void swap(__hash_table& __u) + _NOEXCEPT_( + (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value || + __is_nothrow_swappable<__pointer_allocator>::value) && + (!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value); + + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT + {return __bucket_list_.get_deleter().__alloc().max_size();} + size_type bucket_size(size_type __n) const; + _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT + { + size_type __bc = bucket_count(); + return __bc != 0 ? (float)size() / __bc : 0.f; + } + _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf) _NOEXCEPT + {max_load_factor() = _VSTD::max(__mlf, load_factor());} + + _LIBCPP_INLINE_VISIBILITY local_iterator begin(size_type __n) + {return local_iterator(__bucket_list_[__n], __n, bucket_count());} + _LIBCPP_INLINE_VISIBILITY local_iterator end(size_type __n) + {return local_iterator(nullptr, __n, bucket_count());} + _LIBCPP_INLINE_VISIBILITY const_local_iterator cbegin(size_type __n) const + {return const_local_iterator(__bucket_list_[__n], __n, bucket_count());} + _LIBCPP_INLINE_VISIBILITY const_local_iterator cend(size_type __n) const + {return const_local_iterator(nullptr, __n, bucket_count());} +private: + void __rehash(size_type __n); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class ..._Args> + __node_holder __construct_node(_Args&& ...__args); +#endif // _LIBCPP_HAS_NO_VARIADICS + __node_holder __construct_node(value_type&& __v, size_t __hash); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + __node_holder __construct_node(const value_type& __v); +#endif + __node_holder __construct_node(const value_type& __v, size_t __hash); + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __hash_table& __u) + {__copy_assign_alloc(__u, integral_constant<bool, + __node_traits::propagate_on_container_copy_assignment::value>());} + void __copy_assign_alloc(const __hash_table& __u, true_type); + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __hash_table&, false_type) {} + + void __move_assign(__hash_table& __u, false_type); + void __move_assign(__hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table& __u) + _NOEXCEPT_( + !__node_traits::propagate_on_container_move_assignment::value || + (is_nothrow_move_assignable<__pointer_allocator>::value && + is_nothrow_move_assignable<__node_allocator>::value)) + {__move_assign_alloc(__u, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>());} + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__pointer_allocator>::value && + is_nothrow_move_assignable<__node_allocator>::value) + { + __bucket_list_.get_deleter().__alloc() = + _VSTD::move(__u.__bucket_list_.get_deleter().__alloc()); + __node_alloc() = _VSTD::move(__u.__node_alloc()); + } + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {} + + template <class _Ap> + _LIBCPP_INLINE_VISIBILITY + static + void + __swap_alloc(_Ap& __x, _Ap& __y) + _NOEXCEPT_( + !allocator_traits<_Ap>::propagate_on_container_swap::value || + __is_nothrow_swappable<_Ap>::value) + { + __swap_alloc(__x, __y, + integral_constant<bool, + allocator_traits<_Ap>::propagate_on_container_swap::value + >()); + } + + template <class _Ap> + _LIBCPP_INLINE_VISIBILITY + static + void + __swap_alloc(_Ap& __x, _Ap& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<_Ap>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + + template <class _Ap> + _LIBCPP_INLINE_VISIBILITY + static + void + __swap_alloc(_Ap&, _Ap&, false_type) _NOEXCEPT {} + + void __deallocate(__node_pointer __np) _NOEXCEPT; + __node_pointer __detach() _NOEXCEPT; +}; + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table() + _NOEXCEPT_( + is_nothrow_default_constructible<__bucket_list>::value && + is_nothrow_default_constructible<__first_node>::value && + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value) + : __p2_(0), + __p3_(1.0f) +{ +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf, + const key_equal& __eql) + : __bucket_list_(nullptr, __bucket_list_deleter()), + __p1_(), + __p2_(0, __hf), + __p3_(1.0f, __eql) +{ +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__node_allocator(__a)), + __p2_(0, __hf), + __p3_(1.0f, __eql) +{ +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__node_allocator(__a)), + __p2_(0), + __p3_(1.0f) +{ +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u) + : __bucket_list_(nullptr, + __bucket_list_deleter(allocator_traits<__pointer_allocator>:: + select_on_container_copy_construction( + __u.__bucket_list_.get_deleter().__alloc()), 0)), + __p1_(allocator_traits<__node_allocator>:: + select_on_container_copy_construction(__u.__node_alloc())), + __p2_(0, __u.hash_function()), + __p3_(__u.__p3_) +{ +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__node_allocator(__a)), + __p2_(0, __u.hash_function()), + __p3_(__u.__p3_) +{ +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u) + _NOEXCEPT_( + is_nothrow_move_constructible<__bucket_list>::value && + is_nothrow_move_constructible<__first_node>::value && + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value) + : __bucket_list_(_VSTD::move(__u.__bucket_list_)), + __p1_(_VSTD::move(__u.__p1_)), + __p2_(_VSTD::move(__u.__p2_)), + __p3_(_VSTD::move(__u.__p3_)) +{ + if (size() > 0) + { + __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] = + static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __u.__p1_.first().__next_ = nullptr; + __u.size() = 0; + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__node_allocator(__a)), + __p2_(0, _VSTD::move(__u.hash_function())), + __p3_(_VSTD::move(__u.__p3_)) +{ + if (__a == allocator_type(__u.__node_alloc())) + { + __bucket_list_.reset(__u.__bucket_list_.release()); + __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size(); + __u.__bucket_list_.get_deleter().size() = 0; + if (__u.size() > 0) + { + __p1_.first().__next_ = __u.__p1_.first().__next_; + __u.__p1_.first().__next_ = nullptr; + __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] = + static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + size() = __u.size(); + __u.size() = 0; + } + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table() +{ + __deallocate(__p1_.first().__next_); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc( + const __hash_table& __u, true_type) +{ + if (__node_alloc() != __u.__node_alloc()) + { + clear(); + __bucket_list_.reset(); + __bucket_list_.get_deleter().size() = 0; + } + __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc(); + __node_alloc() = __u.__node_alloc(); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +__hash_table<_Tp, _Hash, _Equal, _Alloc>& +__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u) +{ + if (this != &__u) + { + __copy_assign_alloc(__u); + hash_function() = __u.hash_function(); + key_eq() = __u.key_eq(); + max_load_factor() = __u.max_load_factor(); + __assign_multi(__u.begin(), __u.end()); + } + return *this; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate(__node_pointer __np) + _NOEXCEPT +{ + __node_allocator& __na = __node_alloc(); + while (__np != nullptr) + { + __node_pointer __next = __np->__next_; + __node_traits::destroy(__na, _VSTD::addressof(__np->__value_)); + __node_traits::deallocate(__na, __np, 1); + __np = __next; + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_pointer +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach() _NOEXCEPT +{ + size_type __bc = bucket_count(); + for (size_type __i = 0; __i < __bc; ++__i) + __bucket_list_[__i] = nullptr; + size() = 0; + __node_pointer __cache = __p1_.first().__next_; + __p1_.first().__next_ = nullptr; + return __cache; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign( + __hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value) +{ + clear(); + __bucket_list_.reset(__u.__bucket_list_.release()); + __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size(); + __u.__bucket_list_.get_deleter().size() = 0; + __move_assign_alloc(__u); + size() = __u.size(); + hash_function() = _VSTD::move(__u.hash_function()); + max_load_factor() = __u.max_load_factor(); + key_eq() = _VSTD::move(__u.key_eq()); + __p1_.first().__next_ = __u.__p1_.first().__next_; + if (size() > 0) + { + __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] = + static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __u.__p1_.first().__next_ = nullptr; + __u.size() = 0; + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign( + __hash_table& __u, false_type) +{ + if (__node_alloc() == __u.__node_alloc()) + __move_assign(__u, true_type()); + else + { + hash_function() = _VSTD::move(__u.hash_function()); + key_eq() = _VSTD::move(__u.key_eq()); + max_load_factor() = __u.max_load_factor(); + if (bucket_count() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + const_iterator __i = __u.begin(); + while (__cache != nullptr && __u.size() != 0) + { + __cache->__value_ = _VSTD::move(__u.remove(__i++)->__value_); + __node_pointer __next = __cache->__next_; + __node_insert_multi(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate(__cache); + } + const_iterator __i = __u.begin(); + while (__u.size() != 0) + { + __node_holder __h = + __construct_node(_VSTD::move(__u.remove(__i++)->__value_)); + __node_insert_multi(__h.get()); + __h.release(); + } + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__hash_table<_Tp, _Hash, _Equal, _Alloc>& +__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value) +{ + __move_assign(__u, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _InputIterator> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first, + _InputIterator __last) +{ + if (bucket_count() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__value_ = *__first; + __node_pointer __next = __cache->__next_; + __node_insert_unique(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate(__cache); + } + for (; __first != __last; ++__first) + __insert_unique(*__first); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _InputIterator> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __first, + _InputIterator __last) +{ + if (bucket_count() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__value_ = *__first; + __node_pointer __next = __cache->__next_; + __node_insert_multi(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate(__cache); + } + for (; __first != __last; ++__first) + __insert_multi(*__first); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() _NOEXCEPT +{ + return iterator(__p1_.first().__next_); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() _NOEXCEPT +{ + return iterator(nullptr); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() const _NOEXCEPT +{ + return const_iterator(__p1_.first().__next_); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT +{ + return const_iterator(nullptr); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT +{ + if (size() > 0) + { + __deallocate(__p1_.first().__next_); + __p1_.first().__next_ = nullptr; + size_type __bc = bucket_count(); + for (size_type __i = 0; __i < __bc; ++__i) + __bucket_list_[__i] = nullptr; + size() = 0; + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __nd) +{ + __nd->__hash_ = hash_function()(__nd->__value_); + size_type __bc = bucket_count(); + bool __inserted = false; + __node_pointer __ndptr; + size_t __chash; + if (__bc != 0) + { + __chash = __nd->__hash_ % __bc; + __ndptr = __bucket_list_[__chash]; + if (__ndptr != nullptr) + { + for (__ndptr = __ndptr->__next_; __ndptr != nullptr && + __ndptr->__hash_ % __bc == __chash; + __ndptr = __ndptr->__next_) + { + if (key_eq()(__ndptr->__value_, __nd->__value_)) + goto __done; + } + } + } + { + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + rehash(_VSTD::max<size_type>(2 * __bc + 1, + size_type(ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + __chash = __nd->__hash_ % __bc; + } + // insert_after __bucket_list_[__chash], or __first_node if bucket is null + __node_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) + { + __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __nd->__next_ = __pn->__next_; + __pn->__next_ = __nd; + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__nd->__next_ != nullptr) + __bucket_list_[__nd->__next_->__hash_ % __bc] = __nd; + } + else + { + __nd->__next_ = __pn->__next_; + __pn->__next_ = __nd; + } + __ndptr = __nd; + // increment size + ++size(); + __inserted = true; + } +__done: + return pair<iterator, bool>(iterator(__ndptr), __inserted); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __cp) +{ + __cp->__hash_ = hash_function()(__cp->__value_); + size_type __bc = bucket_count(); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + rehash(_VSTD::max<size_type>(2 * __bc + 1, + size_type(ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + } + size_t __chash = __cp->__hash_ % __bc; + __node_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) + { + __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __cp->__next_ = __pn->__next_; + __pn->__next_ = __cp; + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__cp->__next_ != nullptr) + __bucket_list_[__cp->__next_->__hash_ % __bc] = __cp; + } + else + { + for (bool __found = false; __pn->__next_ != nullptr && + __pn->__next_->__hash_ % __bc == __chash; + __pn = __pn->__next_) + { + // __found key_eq() action + // false false loop + // true true loop + // false true set __found to true + // true false break + if (__found != (__pn->__next_->__hash_ == __cp->__hash_ && + key_eq()(__pn->__next_->__value_, __cp->__value_))) + { + if (!__found) + __found = true; + else + break; + } + } + __cp->__next_ = __pn->__next_; + __pn->__next_ = __cp; + if (__cp->__next_ != nullptr) + { + size_t __nhash = __cp->__next_->__hash_ % __bc; + if (__nhash != __chash) + __bucket_list_[__nhash] = __cp; + } + } + ++size(); + return iterator(__cp); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi( + const_iterator __p, __node_pointer __cp) +{ + if (__p != end() && key_eq()(*__p, __cp->__value_)) + { + __node_pointer __np = const_cast<__node_pointer>(__p.__node_); + __cp->__hash_ = __np->__hash_; + size_type __bc = bucket_count(); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + rehash(_VSTD::max<size_type>(2 * __bc + 1, + size_type(ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + } + size_t __chash = __cp->__hash_ % __bc; + __node_pointer __pp = __bucket_list_[__chash]; + while (__pp->__next_ != __np) + __pp = __pp->__next_; + __cp->__next_ = __np; + __pp->__next_ = __cp; + ++size(); + return iterator(__cp); + } + return __node_insert_multi(__cp); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_unique(const value_type& __x) +{ + size_t __hash = hash_function()(__x); + size_type __bc = bucket_count(); + bool __inserted = false; + __node_pointer __nd; + size_t __chash; + if (__bc != 0) + { + __chash = __hash % __bc; + __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + __nd->__hash_ % __bc == __chash; + __nd = __nd->__next_) + { + if (key_eq()(__nd->__value_, __x)) + goto __done; + } + } + } + { + __node_holder __h = __construct_node(__x, __hash); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + rehash(_VSTD::max<size_type>(2 * __bc + 1, + size_type(ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + __chash = __hash % __bc; + } + // insert_after __bucket_list_[__chash], or __first_node if bucket is null + __node_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) + { + __pn = static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + __h->__next_ = __pn->__next_; + __pn->__next_ = __h.get(); + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__h->__next_ != nullptr) + __bucket_list_[__h->__next_->__hash_ % __bc] = __h.get(); + } + else + { + __h->__next_ = __pn->__next_; + __pn->__next_ = __h.get(); + } + __nd = __h.release(); + // increment size + ++size(); + __inserted = true; + } +__done: + return pair<iterator, bool>(iterator(__nd), __inserted); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class... _Args> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + pair<iterator, bool> __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class... _Args> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_multi(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + iterator __r = __node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class... _Args> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_hint_multi( + const_iterator __p, _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + iterator __r = __node_insert_multi(__p, __h.get()); + __h.release(); + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Pp> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_unique(_Pp&& __x) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Pp>(__x)); + pair<iterator, bool> __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Pp> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(_Pp&& __x) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Pp>(__x)); + iterator __r = __node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Pp> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const_iterator __p, + _Pp&& __x) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Pp>(__x)); + iterator __r = __node_insert_multi(__p, __h.get()); + __h.release(); + return __r; +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const value_type& __x) +{ + __node_holder __h = __construct_node(__x); + iterator __r = __node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const_iterator __p, + const value_type& __x) +{ + __node_holder __h = __construct_node(__x); + iterator __r = __node_insert_multi(__p, __h.get()); + __h.release(); + return __r; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::rehash(size_type __n) +{ + __n = __next_prime(_VSTD::max<size_type>(__n, size() > 0)); + size_type __bc = bucket_count(); + if (__n > __bc) + __rehash(__n); + else + { + __n = _VSTD::max<size_type> + ( + __n, + __next_prime(size_t(ceil(float(size()) / max_load_factor()))) + ); + if (__n < __bc) + __rehash(__n); + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc) +{ + __pointer_allocator& __npa = __bucket_list_.get_deleter().__alloc(); + __bucket_list_.reset(__nbc > 0 ? + __pointer_alloc_traits::allocate(__npa, __nbc) : nullptr); + __bucket_list_.get_deleter().size() = __nbc; + if (__nbc > 0) + { + for (size_type __i = 0; __i < __nbc; ++__i) + __bucket_list_[__i] = nullptr; + __node_pointer __pp(static_cast<__node_pointer>(_VSTD::addressof(__p1_.first()))); + __node_pointer __cp = __pp->__next_; + if (__cp != nullptr) + { + size_type __chash = __cp->__hash_ % __nbc; + __bucket_list_[__chash] = __pp; + size_type __phash = __chash; + for (__pp = __cp, __cp = __cp->__next_; __cp != nullptr; + __cp = __pp->__next_) + { + __chash = __cp->__hash_ % __nbc; + if (__chash == __phash) + __pp = __cp; + else + { + if (__bucket_list_[__chash] == nullptr) + { + __bucket_list_[__chash] = __pp; + __pp = __cp; + __phash = __chash; + } + else + { + __node_pointer __np = __cp; + for (; __np->__next_ != nullptr && + key_eq()(__cp->__value_, __np->__next_->__value_); + __np = __np->__next_) + ; + __pp->__next_ = __np->__next_; + __np->__next_ = __bucket_list_[__chash]->__next_; + __bucket_list_[__chash]->__next_ = __cp; + + } + } + } + } + } +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) +{ + size_t __hash = hash_function()(__k); + size_type __bc = bucket_count(); + if (__bc != 0) + { + size_t __chash = __hash % __bc; + __node_pointer __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + __nd->__hash_ % __bc == __chash; + __nd = __nd->__next_) + { + if (key_eq()(__nd->__value_, __k)) + return iterator(__nd); + } + } + } + return end(); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const +{ + size_t __hash = hash_function()(__k); + size_type __bc = bucket_count(); + if (__bc != 0) + { + size_t __chash = __hash % __bc; + __node_const_pointer __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + __nd->__hash_ % __bc == __chash; + __nd = __nd->__next_) + { + if (key_eq()(__nd->__value_, __k)) + return const_iterator(__nd); + } + } + + } + return end(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class ..._Args> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&& ...__args) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = hash_function()(__h->__value_); + __h->__next_ = nullptr; + return __h; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(value_type&& __v, + size_t __hash) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = __hash; + __h->__next_ = nullptr; + return _VSTD::move(__h); +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(const value_type& __v) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), __v); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = hash_function()(__h->__value_); + __h->__next_ = nullptr; + return _VSTD::move(__h); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(const value_type& __v, + size_t __hash) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), __v); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = __hash; + __h->__next_ = nullptr; + return _VSTD::move(__h); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p) +{ + __node_pointer __np = const_cast<__node_pointer>(__p.__node_); + iterator __r(__np); + ++__r; + remove(__p); + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first, + const_iterator __last) +{ + for (const_iterator __p = __first; __first != __last; __p = __first) + { + ++__first; + erase(__p); + } + __node_pointer __np = const_cast<__node_pointer>(__last.__node_); + return iterator (__np); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_unique(const _Key& __k) +{ + iterator __i = find(__k); + if (__i == end()) + return 0; + erase(__i); + return 1; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_multi(const _Key& __k) +{ + size_type __r = 0; + iterator __i = find(__k); + if (__i != end()) + { + iterator __e = end(); + do + { + erase(__i++); + ++__r; + } while (__i != __e && key_eq()(*__i, __k)); + } + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT +{ + // current node + __node_pointer __cn = const_cast<__node_pointer>(__p.__node_); + size_type __bc = bucket_count(); + size_t __chash = __cn->__hash_ % __bc; + // find previous node + __node_pointer __pn = __bucket_list_[__chash]; + for (; __pn->__next_ != __cn; __pn = __pn->__next_) + ; + // Fix up __bucket_list_ + // if __pn is not in same bucket (before begin is not in same bucket) && + // if __cn->__next_ is not in same bucket (nullptr is not in same bucket) + if (__pn == _VSTD::addressof(__p1_.first()) || __pn->__hash_ % __bc != __chash) + { + if (__cn->__next_ == nullptr || __cn->__next_->__hash_ % __bc != __chash) + __bucket_list_[__chash] = nullptr; + } + // if __cn->__next_ is not in same bucket (nullptr is in same bucket) + if (__cn->__next_ != nullptr) + { + size_t __nhash = __cn->__next_->__hash_ % __bc; + if (__nhash != __chash) + __bucket_list_[__nhash] = __pn; + } + // remove __cn + __pn->__next_ = __cn->__next_; + __cn->__next_ = nullptr; + --size(); + return __node_holder(__cn, _Dp(__node_alloc(), true)); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +inline _LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_unique(const _Key& __k) const +{ + return static_cast<size_type>(find(__k) != end()); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_multi(const _Key& __k) const +{ + size_type __r = 0; + const_iterator __i = find(__k); + if (__i != end()) + { + const_iterator __e = end(); + do + { + ++__i; + ++__r; + } while (__i != __e && key_eq()(*__i, __k)); + } + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique( + const _Key& __k) +{ + iterator __i = find(__k); + iterator __j = __i; + if (__i != end()) + ++__j; + return pair<iterator, iterator>(__i, __j); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique( + const _Key& __k) const +{ + const_iterator __i = find(__k); + const_iterator __j = __i; + if (__i != end()) + ++__j; + return pair<const_iterator, const_iterator>(__i, __j); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi( + const _Key& __k) +{ + iterator __i = find(__k); + iterator __j = __i; + if (__i != end()) + { + iterator __e = end(); + do + { + ++__j; + } while (__j != __e && key_eq()(*__j, __k)); + } + return pair<iterator, iterator>(__i, __j); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +template <class _Key> +pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi( + const _Key& __k) const +{ + const_iterator __i = find(__k); + const_iterator __j = __i; + if (__i != end()) + { + const_iterator __e = end(); + do + { + ++__j; + } while (__j != __e && key_eq()(*__j, __k)); + } + return pair<const_iterator, const_iterator>(__i, __j); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u) + _NOEXCEPT_( + (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value || + __is_nothrow_swappable<__pointer_allocator>::value) && + (!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value) +{ + { + __node_pointer_pointer __npp = __bucket_list_.release(); + __bucket_list_.reset(__u.__bucket_list_.release()); + __u.__bucket_list_.reset(__npp); + } + _VSTD::swap(__bucket_list_.get_deleter().size(), __u.__bucket_list_.get_deleter().size()); + __swap_alloc(__bucket_list_.get_deleter().__alloc(), + __u.__bucket_list_.get_deleter().__alloc()); + __swap_alloc(__node_alloc(), __u.__node_alloc()); + _VSTD::swap(__p1_.first().__next_, __u.__p1_.first().__next_); + __p2_.swap(__u.__p2_); + __p3_.swap(__u.__p3_); + if (size() > 0) + __bucket_list_[__p1_.first().__next_->__hash_ % bucket_count()] = + static_cast<__node_pointer>(_VSTD::addressof(__p1_.first())); + if (__u.size() > 0) + __u.__bucket_list_[__u.__p1_.first().__next_->__hash_ % __u.bucket_count()] = + static_cast<__node_pointer>(_VSTD::addressof(__u.__p1_.first())); +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::bucket_size(size_type __n) const +{ + __node_const_pointer __np = __bucket_list_[__n]; + size_type __bc = bucket_count(); + size_type __r = 0; + if (__np != nullptr) + { + for (__np = __np->__next_; __np != nullptr && + __np->__hash_ % __bc == __n; + __np = __np->__next_, ++__r) + ; + } + return __r; +} + +template <class _Tp, class _Hash, class _Equal, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__hash_table<_Tp, _Hash, _Equal, _Alloc>& __x, + __hash_table<_Tp, _Hash, _Equal, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP__HASH_TABLE diff --git a/contrib/libc++/include/__locale b/contrib/libc++/include/__locale new file mode 100644 index 0000000..b1e0711 --- /dev/null +++ b/contrib/libc++/include/__locale @@ -0,0 +1,1426 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___LOCALE +#define _LIBCPP___LOCALE + +#include <__config> +#include <string> +#include <memory> +#include <utility> +#include <mutex> +#include <cstdint> +#include <cctype> +#include <locale.h> +#if _WIN32 +# include <support/win32/locale_win32.h> +#elif (__GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__) +# include <xlocale.h> +#endif // _WIN32 || __GLIBC__ || __APPLE__ || __FreeBSD_ + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class locale; + +template <class _Facet> bool has_facet(const locale&) _NOEXCEPT; +template <class _Facet> const _Facet& use_facet(const locale&); + +class _LIBCPP_VISIBLE locale +{ +public: + // types: + class facet; + class id; + + typedef int category; + static const category // values assigned here are for exposition only + none = 0, + collate = LC_COLLATE_MASK, + ctype = LC_CTYPE_MASK, + monetary = LC_MONETARY_MASK, + numeric = LC_NUMERIC_MASK, + time = LC_TIME_MASK, + messages = LC_MESSAGES_MASK, + all = collate | ctype | monetary | numeric | time | messages; + + // construct/copy/destroy: + locale() _NOEXCEPT; + locale(const locale&) _NOEXCEPT; + explicit locale(const char*); + explicit locale(const string&); + locale(const locale&, const char*, category); + locale(const locale&, const string&, category); + template <class _Facet> + _LIBCPP_INLINE_VISIBILITY locale(const locale&, _Facet*); + locale(const locale&, const locale&, category); + + ~locale(); + + const locale& operator=(const locale&) _NOEXCEPT; + + template <class _Facet> locale combine(const locale&) const; + + // locale operations: + string name() const; + bool operator==(const locale&) const; + bool operator!=(const locale& __y) const {return !(*this == __y);} + template <class _CharT, class _Traits, class _Allocator> + bool operator()(const basic_string<_CharT, _Traits, _Allocator>&, + const basic_string<_CharT, _Traits, _Allocator>&) const; + + // global locale objects: + static locale global(const locale&); + static const locale& classic(); + +private: + class __imp; + __imp* __locale_; + + void __install_ctor(const locale&, facet*, long); + static locale& __global(); + bool has_facet(id&) const; + const facet* use_facet(id&) const; + + template <class _Facet> friend bool has_facet(const locale&) _NOEXCEPT; + template <class _Facet> friend const _Facet& use_facet(const locale&); +}; + +class _LIBCPP_VISIBLE locale::facet + : public __shared_count +{ +protected: + _LIBCPP_INLINE_VISIBILITY + explicit facet(size_t __refs = 0) + : __shared_count(static_cast<long>(__refs)-1) {} + + virtual ~facet(); + +// facet(const facet&) = delete; // effectively done in __shared_count +// void operator=(const facet&) = delete; +private: + virtual void __on_zero_shared() _NOEXCEPT; +}; + +class _LIBCPP_VISIBLE locale::id +{ + once_flag __flag_; + int32_t __id_; + + static int32_t __next_id; +public: + _LIBCPP_INLINE_VISIBILITY id() {} +private: + void __init(); + void operator=(const id&); // = delete; + id(const id&); // = delete; +public: // only needed for tests + long __get(); + + friend class locale; + friend class locale::__imp; +}; + +template <class _Facet> +inline _LIBCPP_INLINE_VISIBILITY +locale::locale(const locale& __other, _Facet* __f) +{ + __install_ctor(__other, __f, __f ? __f->id.__get() : 0); +} + +template <class _Facet> +locale +locale::combine(const locale& __other) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!_VSTD::has_facet<_Facet>(__other)) + throw runtime_error("locale::combine: locale missing facet"); +#endif // _LIBCPP_NO_EXCEPTIONS + return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other))); +} + +template <class _Facet> +inline _LIBCPP_INLINE_VISIBILITY +bool +has_facet(const locale& __l) _NOEXCEPT +{ + return __l.has_facet(_Facet::id); +} + +template <class _Facet> +inline _LIBCPP_INLINE_VISIBILITY +const _Facet& +use_facet(const locale& __l) +{ + return static_cast<const _Facet&>(*__l.use_facet(_Facet::id)); +} + +// template <class _CharT> class collate; + +template <class _CharT> +class _LIBCPP_VISIBLE collate + : public locale::facet +{ +public: + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_INLINE_VISIBILITY + explicit collate(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_INLINE_VISIBILITY + int compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const + { + return do_compare(__lo1, __hi1, __lo2, __hi2); + } + + _LIBCPP_INLINE_VISIBILITY + string_type transform(const char_type* __lo, const char_type* __hi) const + { + return do_transform(__lo, __hi); + } + + _LIBCPP_INLINE_VISIBILITY + long hash(const char_type* __lo, const char_type* __hi) const + { + return do_hash(__lo, __hi); + } + + static locale::id id; + +protected: + ~collate(); + virtual int do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const; + virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const + {return string_type(__lo, __hi);} + virtual long do_hash(const char_type* __lo, const char_type* __hi) const; +}; + +template <class _CharT> locale::id collate<_CharT>::id; + +template <class _CharT> +collate<_CharT>::~collate() +{ +} + +template <class _CharT> +int +collate<_CharT>::do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const +{ + for (; __lo2 != __hi2; ++__lo1, ++__lo2) + { + if (__lo1 == __hi1 || *__lo1 < *__lo2) + return -1; + if (*__lo2 < *__lo1) + return 1; + } + return __lo1 != __hi1; +} + +template <class _CharT> +long +collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const +{ + size_t __h = 0; + const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8; + const size_t __mask = size_t(0xF) << (__sr + 4); + for(const char_type* __p = __lo; __p != __hi; ++__p) + { + __h = (__h << 4) + static_cast<size_t>(*__p); + size_t __g = __h & __mask; + __h ^= __g | (__g >> __sr); + } + return static_cast<long>(__h); +} + +extern template class _LIBCPP_VISIBLE collate<char>; +extern template class _LIBCPP_VISIBLE collate<wchar_t>; + +// template <class CharT> class collate_byname; + +template <class _CharT> class _LIBCPP_VISIBLE collate_byname; + +template <> +class _LIBCPP_VISIBLE collate_byname<char> + : public collate<char> +{ + locale_t __l; +public: + typedef char char_type; + typedef basic_string<char_type> string_type; + + explicit collate_byname(const char* __n, size_t __refs = 0); + explicit collate_byname(const string& __n, size_t __refs = 0); + +protected: + ~collate_byname(); + virtual int do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const; + virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const; +}; + +template <> +class _LIBCPP_VISIBLE collate_byname<wchar_t> + : public collate<wchar_t> +{ + locale_t __l; +public: + typedef wchar_t char_type; + typedef basic_string<char_type> string_type; + + explicit collate_byname(const char* __n, size_t __refs = 0); + explicit collate_byname(const string& __n, size_t __refs = 0); + +protected: + ~collate_byname(); + + virtual int do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const; + virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const; +}; + +template <class _CharT, class _Traits, class _Allocator> +bool +locale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x, + const basic_string<_CharT, _Traits, _Allocator>& __y) const +{ + return _VSTD::use_facet<_VSTD::collate<_CharT> >(*this).compare( + __x.data(), __x.data() + __x.size(), + __y.data(), __y.data() + __y.size()) < 0; +} + +// template <class charT> class ctype + +class _LIBCPP_VISIBLE ctype_base +{ +public: +#if __GLIBC__ + typedef unsigned short mask; + static const mask space = _ISspace; + static const mask print = _ISprint; + static const mask cntrl = _IScntrl; + static const mask upper = _ISupper; + static const mask lower = _ISlower; + static const mask alpha = _ISalpha; + static const mask digit = _ISdigit; + static const mask punct = _ISpunct; + static const mask xdigit = _ISxdigit; + static const mask blank = _ISblank; +#elif _WIN32 + typedef unsigned short mask; + static const mask space = _SPACE; + static const mask print = _BLANK|_PUNCT|_ALPHA|_DIGIT; + static const mask cntrl = _CONTROL; + static const mask upper = _UPPER; + static const mask lower = _LOWER; + static const mask alpha = _ALPHA; + static const mask digit = _DIGIT; + static const mask punct = _PUNCT; + static const mask xdigit = _HEX; + static const mask blank = _BLANK; +#elif (__APPLE__ || __FreeBSD__) +#if __APPLE__ + typedef __uint32_t mask; +#elif __FreeBSD__ + typedef unsigned long mask; +#endif + static const mask space = _CTYPE_S; + static const mask print = _CTYPE_R; + static const mask cntrl = _CTYPE_C; + static const mask upper = _CTYPE_U; + static const mask lower = _CTYPE_L; + static const mask alpha = _CTYPE_A; + static const mask digit = _CTYPE_D; + static const mask punct = _CTYPE_P; + static const mask xdigit = _CTYPE_X; + static const mask blank = _CTYPE_B; +#elif __sun__ + typedef unsigned int mask; + static const mask space = _ISSPACE; + static const mask print = _ISPRINT; + static const mask cntrl = _ISCNTRL; + static const mask upper = _ISUPPER; + static const mask lower = _ISLOWER; + static const mask alpha = _ISALPHA; + static const mask digit = _ISDIGIT; + static const mask punct = _ISPUNCT; + static const mask xdigit = _ISXDIGIT; + static const mask blank = _ISBLANK; +#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ || __sun__ + typedef unsigned long mask; + static const mask space = 1<<0; + static const mask print = 1<<1; + static const mask cntrl = 1<<2; + static const mask upper = 1<<3; + static const mask lower = 1<<4; + static const mask alpha = 1<<5; + static const mask digit = 1<<6; + static const mask punct = 1<<7; + static const mask xdigit = 1<<8; + static const mask blank = 1<<9; +#endif // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ + static const mask alnum = alpha | digit; + static const mask graph = alnum | punct; + + _LIBCPP_ALWAYS_INLINE ctype_base() {} +}; + +template <class _CharT> class _LIBCPP_VISIBLE ctype; + +template <> +class _LIBCPP_VISIBLE ctype<wchar_t> + : public locale::facet, + public ctype_base +{ +public: + typedef wchar_t char_type; + + _LIBCPP_ALWAYS_INLINE + explicit ctype(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + bool is(mask __m, char_type __c) const + { + return do_is(__m, __c); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const + { + return do_is(__low, __high, __vec); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* scan_is(mask __m, const char_type* __low, const char_type* __high) const + { + return do_scan_is(__m, __low, __high); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const + { + return do_scan_not(__m, __low, __high); + } + + _LIBCPP_ALWAYS_INLINE + char_type toupper(char_type __c) const + { + return do_toupper(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* toupper(char_type* __low, const char_type* __high) const + { + return do_toupper(__low, __high); + } + + _LIBCPP_ALWAYS_INLINE + char_type tolower(char_type __c) const + { + return do_tolower(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* tolower(char_type* __low, const char_type* __high) const + { + return do_tolower(__low, __high); + } + + _LIBCPP_ALWAYS_INLINE + char_type widen(char __c) const + { + return do_widen(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char* widen(const char* __low, const char* __high, char_type* __to) const + { + return do_widen(__low, __high, __to); + } + + _LIBCPP_ALWAYS_INLINE + char narrow(char_type __c, char __dfault) const + { + return do_narrow(__c, __dfault); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const + { + return do_narrow(__low, __high, __dfault, __to); + } + + static locale::id id; + +protected: + ~ctype(); + virtual bool do_is(mask __m, char_type __c) const; + virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const; + virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const; + virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const; + virtual char_type do_toupper(char_type) const; + virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const; + virtual char_type do_tolower(char_type) const; + virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const; + virtual char_type do_widen(char) const; + virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const; + virtual char do_narrow(char_type, char __dfault) const; + virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const; +}; + +template <> +class _LIBCPP_VISIBLE ctype<char> + : public locale::facet, public ctype_base +{ + const mask* __tab_; + bool __del_; +public: + typedef char char_type; + + explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0); + + _LIBCPP_ALWAYS_INLINE + bool is(mask __m, char_type __c) const + { + return isascii(__c) ? __tab_[static_cast<int>(__c)] & __m : false; + } + + _LIBCPP_ALWAYS_INLINE + const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const + { + for (; __low != __high; ++__low, ++__vec) + *__vec = isascii(*__low) ? __tab_[static_cast<int>(*__low)] : 0; + return __low; + } + + _LIBCPP_ALWAYS_INLINE + const char_type* scan_is (mask __m, const char_type* __low, const char_type* __high) const + { + for (; __low != __high; ++__low) + if (isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m)) + break; + return __low; + } + + _LIBCPP_ALWAYS_INLINE + const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const + { + for (; __low != __high; ++__low) + if (!(isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m))) + break; + return __low; + } + + _LIBCPP_ALWAYS_INLINE + char_type toupper(char_type __c) const + { + return do_toupper(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* toupper(char_type* __low, const char_type* __high) const + { + return do_toupper(__low, __high); + } + + _LIBCPP_ALWAYS_INLINE + char_type tolower(char_type __c) const + { + return do_tolower(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char_type* tolower(char_type* __low, const char_type* __high) const + { + return do_tolower(__low, __high); + } + + _LIBCPP_ALWAYS_INLINE + char_type widen(char __c) const + { + return do_widen(__c); + } + + _LIBCPP_ALWAYS_INLINE + const char* widen(const char* __low, const char* __high, char_type* __to) const + { + return do_widen(__low, __high, __to); + } + + _LIBCPP_ALWAYS_INLINE + char narrow(char_type __c, char __dfault) const + { + return do_narrow(__c, __dfault); + } + + _LIBCPP_ALWAYS_INLINE + const char* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const + { + return do_narrow(__low, __high, __dfault, __to); + } + + static locale::id id; + +#ifdef _CACHED_RUNES + static const size_t table_size = _CACHED_RUNES; +#else + static const size_t table_size = 256; // FIXME: Don't hardcode this. +#endif + _LIBCPP_ALWAYS_INLINE const mask* table() const _NOEXCEPT {return __tab_;} + static const mask* classic_table() _NOEXCEPT; +#if defined(__GLIBC__) + static const int* __classic_upper_table() _NOEXCEPT; + static const int* __classic_lower_table() _NOEXCEPT; +#endif + +protected: + ~ctype(); + virtual char_type do_toupper(char_type __c) const; + virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const; + virtual char_type do_tolower(char_type __c) const; + virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const; + virtual char_type do_widen(char __c) const; + virtual const char* do_widen(const char* __low, const char* __high, char_type* __to) const; + virtual char do_narrow(char_type __c, char __dfault) const; + virtual const char* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const; +}; + +// template <class CharT> class ctype_byname; + +template <class _CharT> class _LIBCPP_VISIBLE ctype_byname; + +template <> +class _LIBCPP_VISIBLE ctype_byname<char> + : public ctype<char> +{ + locale_t __l; + +public: + explicit ctype_byname(const char*, size_t = 0); + explicit ctype_byname(const string&, size_t = 0); + +protected: + ~ctype_byname(); + virtual char_type do_toupper(char_type) const; + virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const; + virtual char_type do_tolower(char_type) const; + virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const; +}; + +template <> +class _LIBCPP_VISIBLE ctype_byname<wchar_t> + : public ctype<wchar_t> +{ + locale_t __l; + +public: + explicit ctype_byname(const char*, size_t = 0); + explicit ctype_byname(const string&, size_t = 0); + +protected: + ~ctype_byname(); + virtual bool do_is(mask __m, char_type __c) const; + virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const; + virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const; + virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const; + virtual char_type do_toupper(char_type) const; + virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const; + virtual char_type do_tolower(char_type) const; + virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const; + virtual char_type do_widen(char) const; + virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const; + virtual char do_narrow(char_type, char __dfault) const; + virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const; +}; + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isspace(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isprint(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +iscntrl(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isupper(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +islower(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isalpha(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isdigit(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +ispunct(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isxdigit(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isalnum(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +bool +isgraph(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +_CharT +toupper(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).toupper(__c); +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +_CharT +tolower(_CharT __c, const locale& __loc) +{ + return use_facet<ctype<_CharT> >(__loc).tolower(__c); +} + +// codecvt_base + +class _LIBCPP_VISIBLE codecvt_base +{ +public: + _LIBCPP_ALWAYS_INLINE codecvt_base() {} + enum result {ok, partial, error, noconv}; +}; + +// template <class internT, class externT, class stateT> class codecvt; + +template <class _InternT, class _ExternT, class _StateT> class _LIBCPP_VISIBLE codecvt; + +// template <> class codecvt<char, char, mbstate_t> + +template <> +class _LIBCPP_VISIBLE codecvt<char, char, mbstate_t> + : public locale::facet, + public codecvt_base +{ +public: + typedef char intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit codecvt(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_ALWAYS_INLINE + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_ALWAYS_INLINE + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_ALWAYS_INLINE + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + explicit codecvt(const char*, size_t __refs = 0) + : locale::facet(__refs) {} + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +// template <> class codecvt<wchar_t, char, mbstate_t> + +template <> +class _LIBCPP_VISIBLE codecvt<wchar_t, char, mbstate_t> + : public locale::facet, + public codecvt_base +{ + locale_t __l; +public: + typedef wchar_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + explicit codecvt(size_t __refs = 0); + + _LIBCPP_ALWAYS_INLINE + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_ALWAYS_INLINE + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_ALWAYS_INLINE + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_ALWAYS_INLINE + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + explicit codecvt(const char*, size_t __refs = 0); + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +// template <> class codecvt<char16_t, char, mbstate_t> + +template <> +class _LIBCPP_VISIBLE codecvt<char16_t, char, mbstate_t> + : public locale::facet, + public codecvt_base +{ +public: + typedef char16_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit codecvt(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_ALWAYS_INLINE + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_ALWAYS_INLINE + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_ALWAYS_INLINE + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + explicit codecvt(const char*, size_t __refs = 0) + : locale::facet(__refs) {} + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +// template <> class codecvt<char32_t, char, mbstate_t> + +template <> +class _LIBCPP_VISIBLE codecvt<char32_t, char, mbstate_t> + : public locale::facet, + public codecvt_base +{ +public: + typedef char32_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit codecvt(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + result out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const + { + return do_unshift(__st, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + result in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const + { + return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt); + } + + _LIBCPP_ALWAYS_INLINE + int encoding() const _NOEXCEPT + { + return do_encoding(); + } + + _LIBCPP_ALWAYS_INLINE + bool always_noconv() const _NOEXCEPT + { + return do_always_noconv(); + } + + _LIBCPP_ALWAYS_INLINE + int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const + { + return do_length(__st, __frm, __end, __mx); + } + + _LIBCPP_ALWAYS_INLINE + int max_length() const _NOEXCEPT + { + return do_max_length(); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + explicit codecvt(const char*, size_t __refs = 0) + : locale::facet(__refs) {} + + ~codecvt(); + + virtual result do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const _NOEXCEPT; + virtual bool do_always_noconv() const _NOEXCEPT; + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const; + virtual int do_max_length() const _NOEXCEPT; +}; + +// template <class _InternT, class _ExternT, class _StateT> class codecvt_byname + +template <class _InternT, class _ExternT, class _StateT> +class _LIBCPP_VISIBLE codecvt_byname + : public codecvt<_InternT, _ExternT, _StateT> +{ +public: + _LIBCPP_ALWAYS_INLINE + explicit codecvt_byname(const char* __nm, size_t __refs = 0) + : codecvt<_InternT, _ExternT, _StateT>(__nm, __refs) {} + _LIBCPP_ALWAYS_INLINE + explicit codecvt_byname(const string& __nm, size_t __refs = 0) + : codecvt<_InternT, _ExternT, _StateT>(__nm.c_str(), __refs) {} +protected: + ~codecvt_byname(); +}; + +template <class _InternT, class _ExternT, class _StateT> +codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname() +{ +} + +extern template class codecvt_byname<char, char, mbstate_t>; +extern template class codecvt_byname<wchar_t, char, mbstate_t>; +extern template class codecvt_byname<char16_t, char, mbstate_t>; +extern template class codecvt_byname<char32_t, char, mbstate_t>; + +_LIBCPP_VISIBLE void __throw_runtime_error(const char*); + +template <size_t _Np> +struct __narrow_to_utf8 +{ + template <class _OutputIterator, class _CharT> + _OutputIterator + operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const; +}; + +template <> +struct __narrow_to_utf8<8> +{ + template <class _OutputIterator, class _CharT> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const + { + for (; __wb < __we; ++__wb, ++__s) + *__s = *__wb; + return __s; + } +}; + +template <> +struct __narrow_to_utf8<16> + : public codecvt<char16_t, char, mbstate_t> +{ + _LIBCPP_ALWAYS_INLINE + __narrow_to_utf8() : codecvt<char16_t, char, mbstate_t>(1) {} + + ~__narrow_to_utf8(); + + template <class _OutputIterator, class _CharT> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const + { + result __r = ok; + mbstate_t __mb; + while (__wb < __we && __r != error) + { + const int __sz = 32; + char __buf[__sz]; + char* __bn; + const char16_t* __wn = (const char16_t*)__wb; + __r = do_out(__mb, (const char16_t*)__wb, (const char16_t*)__we, __wn, + __buf, __buf+__sz, __bn); + if (__r == codecvt_base::error || __wn == (const char16_t*)__wb) + __throw_runtime_error("locale not supported"); + for (const char* __p = __buf; __p < __bn; ++__p, ++__s) + *__s = *__p; + __wb = (const _CharT*)__wn; + } + return __s; + } +}; + +template <> +struct __narrow_to_utf8<32> + : public codecvt<char32_t, char, mbstate_t> +{ + _LIBCPP_ALWAYS_INLINE + __narrow_to_utf8() : codecvt<char32_t, char, mbstate_t>(1) {} + + ~__narrow_to_utf8(); + + template <class _OutputIterator, class _CharT> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const + { + result __r = ok; + mbstate_t __mb; + while (__wb < __we && __r != error) + { + const int __sz = 32; + char __buf[__sz]; + char* __bn; + const char32_t* __wn = (const char32_t*)__wb; + __r = do_out(__mb, (const char32_t*)__wb, (const char32_t*)__we, __wn, + __buf, __buf+__sz, __bn); + if (__r == codecvt_base::error || __wn == (const char32_t*)__wb) + __throw_runtime_error("locale not supported"); + for (const char* __p = __buf; __p < __bn; ++__p, ++__s) + *__s = *__p; + __wb = (const _CharT*)__wn; + } + return __s; + } +}; + +template <size_t _Np> +struct __widen_from_utf8 +{ + template <class _OutputIterator> + _OutputIterator + operator()(_OutputIterator __s, const char* __nb, const char* __ne) const; +}; + +template <> +struct __widen_from_utf8<8> +{ + template <class _OutputIterator> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const char* __nb, const char* __ne) const + { + for (; __nb < __ne; ++__nb, ++__s) + *__s = *__nb; + return __s; + } +}; + +template <> +struct __widen_from_utf8<16> + : public codecvt<char16_t, char, mbstate_t> +{ + _LIBCPP_ALWAYS_INLINE + __widen_from_utf8() : codecvt<char16_t, char, mbstate_t>(1) {} + + ~__widen_from_utf8(); + + template <class _OutputIterator> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const char* __nb, const char* __ne) const + { + result __r = ok; + mbstate_t __mb; + while (__nb < __ne && __r != error) + { + const int __sz = 32; + char16_t __buf[__sz]; + char16_t* __bn; + const char* __nn = __nb; + __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn, + __buf, __buf+__sz, __bn); + if (__r == codecvt_base::error || __nn == __nb) + __throw_runtime_error("locale not supported"); + for (const char16_t* __p = __buf; __p < __bn; ++__p, ++__s) + *__s = (wchar_t)*__p; + __nb = __nn; + } + return __s; + } +}; + +template <> +struct __widen_from_utf8<32> + : public codecvt<char32_t, char, mbstate_t> +{ + _LIBCPP_ALWAYS_INLINE + __widen_from_utf8() : codecvt<char32_t, char, mbstate_t>(1) {} + + ~__widen_from_utf8(); + + template <class _OutputIterator> + _LIBCPP_ALWAYS_INLINE + _OutputIterator + operator()(_OutputIterator __s, const char* __nb, const char* __ne) const + { + result __r = ok; + mbstate_t __mb; + while (__nb < __ne && __r != error) + { + const int __sz = 32; + char32_t __buf[__sz]; + char32_t* __bn; + const char* __nn = __nb; + __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn, + __buf, __buf+__sz, __bn); + if (__r == codecvt_base::error || __nn == __nb) + __throw_runtime_error("locale not supported"); + for (const char32_t* __p = __buf; __p < __bn; ++__p, ++__s) + *__s = (wchar_t)*__p; + __nb = __nn; + } + return __s; + } +}; + +// template <class charT> class numpunct + +template <class _CharT> class _LIBCPP_VISIBLE numpunct; + +template <> +class _LIBCPP_VISIBLE numpunct<char> + : public locale::facet +{ +public: + typedef char char_type; + typedef basic_string<char_type> string_type; + + explicit numpunct(size_t __refs = 0); + + _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();} + _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();} + _LIBCPP_ALWAYS_INLINE string grouping() const {return do_grouping();} + _LIBCPP_ALWAYS_INLINE string_type truename() const {return do_truename();} + _LIBCPP_ALWAYS_INLINE string_type falsename() const {return do_falsename();} + + static locale::id id; + +protected: + ~numpunct(); + virtual char_type do_decimal_point() const; + virtual char_type do_thousands_sep() const; + virtual string do_grouping() const; + virtual string_type do_truename() const; + virtual string_type do_falsename() const; + + char_type __decimal_point_; + char_type __thousands_sep_; + string __grouping_; +}; + +template <> +class _LIBCPP_VISIBLE numpunct<wchar_t> + : public locale::facet +{ +public: + typedef wchar_t char_type; + typedef basic_string<char_type> string_type; + + explicit numpunct(size_t __refs = 0); + + _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();} + _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();} + _LIBCPP_ALWAYS_INLINE string grouping() const {return do_grouping();} + _LIBCPP_ALWAYS_INLINE string_type truename() const {return do_truename();} + _LIBCPP_ALWAYS_INLINE string_type falsename() const {return do_falsename();} + + static locale::id id; + +protected: + ~numpunct(); + virtual char_type do_decimal_point() const; + virtual char_type do_thousands_sep() const; + virtual string do_grouping() const; + virtual string_type do_truename() const; + virtual string_type do_falsename() const; + + char_type __decimal_point_; + char_type __thousands_sep_; + string __grouping_; +}; + +// template <class charT> class numpunct_byname + +template <class charT> class _LIBCPP_VISIBLE numpunct_byname; + +template <> +class _LIBCPP_VISIBLE numpunct_byname<char> +: public numpunct<char> +{ +public: + typedef char char_type; + typedef basic_string<char_type> string_type; + + explicit numpunct_byname(const char* __nm, size_t __refs = 0); + explicit numpunct_byname(const string& __nm, size_t __refs = 0); + +protected: + ~numpunct_byname(); + +private: + void __init(const char*); +}; + +template <> +class _LIBCPP_VISIBLE numpunct_byname<wchar_t> +: public numpunct<wchar_t> +{ +public: + typedef wchar_t char_type; + typedef basic_string<char_type> string_type; + + explicit numpunct_byname(const char* __nm, size_t __refs = 0); + explicit numpunct_byname(const string& __nm, size_t __refs = 0); + +protected: + ~numpunct_byname(); + +private: + void __init(const char*); +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___LOCALE diff --git a/contrib/libc++/include/__mutex_base b/contrib/libc++/include/__mutex_base new file mode 100644 index 0000000..5410272 --- /dev/null +++ b/contrib/libc++/include/__mutex_base @@ -0,0 +1,439 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___MUTEX_BASE +#define _LIBCPP___MUTEX_BASE + +#include <__config> +#include <chrono> +#include <system_error> +#include <pthread.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifdef _LIBCPP_SHARED_LOCK + +namespace ting { +template <class _Mutex> class shared_lock; +template <class _Mutex> class upgrade_lock; +} + +#endif // _LIBCPP_SHARED_LOCK + + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_VISIBLE mutex +{ + pthread_mutex_t __m_; + +public: + _LIBCPP_INLINE_VISIBILITY + mutex() {__m_ = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;} + ~mutex(); + +private: + mutex(const mutex&);// = delete; + mutex& operator=(const mutex&);// = delete; + +public: + void lock(); + bool try_lock(); + void unlock(); + + typedef pthread_mutex_t* native_handle_type; + _LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__m_;} +}; + +struct _LIBCPP_VISIBLE defer_lock_t {}; +struct _LIBCPP_VISIBLE try_to_lock_t {}; +struct _LIBCPP_VISIBLE adopt_lock_t {}; + +//constexpr +extern const +defer_lock_t defer_lock; + +//constexpr +extern const +try_to_lock_t try_to_lock; + +//constexpr +extern const +adopt_lock_t adopt_lock; + +template <class _Mutex> +class _LIBCPP_VISIBLE lock_guard +{ +public: + typedef _Mutex mutex_type; + +private: + mutex_type& __m_; +public: + + _LIBCPP_INLINE_VISIBILITY + explicit lock_guard(mutex_type& __m) + : __m_(__m) {__m_.lock();} + _LIBCPP_INLINE_VISIBILITY + lock_guard(mutex_type& __m, adopt_lock_t) + : __m_(__m) {} + _LIBCPP_INLINE_VISIBILITY + ~lock_guard() {__m_.unlock();} + +private: + lock_guard(lock_guard const&);// = delete; + lock_guard& operator=(lock_guard const&);// = delete; +}; + +template <class _Mutex> +class _LIBCPP_VISIBLE unique_lock +{ +public: + typedef _Mutex mutex_type; + +private: + mutex_type* __m_; + bool __owns_; + +public: + _LIBCPP_INLINE_VISIBILITY + unique_lock() : __m_(nullptr), __owns_(false) {} + _LIBCPP_INLINE_VISIBILITY + explicit unique_lock(mutex_type& __m) + : __m_(&__m), __owns_(true) {__m_->lock();} + _LIBCPP_INLINE_VISIBILITY + unique_lock(mutex_type& __m, defer_lock_t) + : __m_(&__m), __owns_(false) {} + _LIBCPP_INLINE_VISIBILITY + unique_lock(mutex_type& __m, try_to_lock_t) + : __m_(&__m), __owns_(__m.try_lock()) {} + _LIBCPP_INLINE_VISIBILITY + unique_lock(mutex_type& __m, adopt_lock_t) + : __m_(&__m), __owns_(true) {} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + unique_lock(mutex_type& __m, const chrono::time_point<_Clock, _Duration>& __t) + : __m_(&__m), __owns_(__m.try_lock_until(__t)) {} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + unique_lock(mutex_type& __m, const chrono::duration<_Rep, _Period>& __d) + : __m_(&__m), __owns_(__m.try_lock_for(__d)) {} + _LIBCPP_INLINE_VISIBILITY + ~unique_lock() + { + if (__owns_) + __m_->unlock(); + } + +private: + unique_lock(unique_lock const&); // = delete; + unique_lock& operator=(unique_lock const&); // = delete; + +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + unique_lock(unique_lock&& __u) + : __m_(__u.__m_), __owns_(__u.__owns_) + {__u.__m_ = nullptr; __u.__owns_ = false;} + _LIBCPP_INLINE_VISIBILITY + unique_lock& operator=(unique_lock&& __u) + { + if (__owns_) + __m_->unlock(); + __m_ = __u.__m_; + __owns_ = __u.__owns_; + __u.__m_ = nullptr; + __u.__owns_ = false; + return *this; + } + +#ifdef _LIBCPP_SHARED_LOCK + + unique_lock(ting::shared_lock<mutex_type>&&, try_to_lock_t); + template <class _Clock, class _Duration> + unique_lock(ting::shared_lock<mutex_type>&&, + const chrono::time_point<_Clock, _Duration>&); + template <class _Rep, class _Period> + unique_lock(ting::shared_lock<mutex_type>&&, + const chrono::duration<_Rep, _Period>&); + + explicit unique_lock(ting::upgrade_lock<mutex_type>&&); + unique_lock(ting::upgrade_lock<mutex_type>&&, try_to_lock_t); + template <class _Clock, class _Duration> + unique_lock(ting::upgrade_lock<mutex_type>&&, + const chrono::time_point<_Clock, _Duration>&); + template <class _Rep, class _Period> + unique_lock(ting::upgrade_lock<mutex_type>&&, + const chrono::duration<_Rep, _Period>&); + +#endif // _LIBCPP_SHARED_LOCK + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + void lock(); + bool try_lock(); + + template <class _Rep, class _Period> + bool try_lock_for(const chrono::duration<_Rep, _Period>& __d); + template <class _Clock, class _Duration> + bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t); + + void unlock(); + + _LIBCPP_INLINE_VISIBILITY + void swap(unique_lock& __u) + { + _VSTD::swap(__m_, __u.__m_); + _VSTD::swap(__owns_, __u.__owns_); + } + _LIBCPP_INLINE_VISIBILITY + mutex_type* release() + { + mutex_type* __m = __m_; + __m_ = nullptr; + __owns_ = false; + return __m; + } + + _LIBCPP_INLINE_VISIBILITY + bool owns_lock() const {return __owns_;} + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT + operator bool () const {return __owns_;} + _LIBCPP_INLINE_VISIBILITY + mutex_type* mutex() const {return __m_;} +}; + +template <class _Mutex> +void +unique_lock<_Mutex>::lock() +{ + if (__m_ == nullptr) + __throw_system_error(EPERM, "unique_lock::lock: references null mutex"); + if (__owns_) + __throw_system_error(EDEADLK, "unique_lock::lock: already locked"); + __m_->lock(); + __owns_ = true; +} + +template <class _Mutex> +bool +unique_lock<_Mutex>::try_lock() +{ + if (__m_ == nullptr) + __throw_system_error(EPERM, "unique_lock::try_lock: references null mutex"); + if (__owns_) + __throw_system_error(EDEADLK, "unique_lock::try_lock: already locked"); + __owns_ = __m_->try_lock(); + return __owns_; +} + +template <class _Mutex> +template <class _Rep, class _Period> +bool +unique_lock<_Mutex>::try_lock_for(const chrono::duration<_Rep, _Period>& __d) +{ + if (__m_ == nullptr) + __throw_system_error(EPERM, "unique_lock::try_lock_for: references null mutex"); + if (__owns_) + __throw_system_error(EDEADLK, "unique_lock::try_lock_for: already locked"); + __owns_ = __m_->try_lock_for(__d); + return __owns_; +} + +template <class _Mutex> +template <class _Clock, class _Duration> +bool +unique_lock<_Mutex>::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t) +{ + if (__m_ == nullptr) + __throw_system_error(EPERM, "unique_lock::try_lock_until: references null mutex"); + if (__owns_) + __throw_system_error(EDEADLK, "unique_lock::try_lock_until: already locked"); + __owns_ = __m_->try_lock_until(__t); + return __owns_; +} + +template <class _Mutex> +void +unique_lock<_Mutex>::unlock() +{ + if (!__owns_) + __throw_system_error(EPERM, "unique_lock::unlock: not locked"); + __m_->unlock(); + __owns_ = false; +} + +template <class _Mutex> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unique_lock<_Mutex>& __x, unique_lock<_Mutex>& __y) {__x.swap(__y);} + +struct _LIBCPP_VISIBLE cv_status +{ + enum _ { + no_timeout, + timeout + }; + + _ __v_; + + _LIBCPP_INLINE_VISIBILITY cv_status(_ __v) : __v_(__v) {} + _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} + +}; + +class _LIBCPP_VISIBLE condition_variable +{ + pthread_cond_t __cv_; +public: + _LIBCPP_INLINE_VISIBILITY + condition_variable() {__cv_ = (pthread_cond_t)PTHREAD_COND_INITIALIZER;} + ~condition_variable(); + +private: + condition_variable(const condition_variable&); // = delete; + condition_variable& operator=(const condition_variable&); // = delete; + +public: + void notify_one(); + void notify_all(); + + void wait(unique_lock<mutex>& __lk); + template <class _Predicate> + void wait(unique_lock<mutex>& __lk, _Predicate __pred); + + template <class _Duration> + cv_status + wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<chrono::system_clock, _Duration>& __t); + + template <class _Clock, class _Duration> + cv_status + wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<_Clock, _Duration>& __t); + + template <class _Clock, class _Duration, class _Predicate> + bool + wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<_Clock, _Duration>& __t, + _Predicate __pred); + + template <class _Rep, class _Period> + cv_status + wait_for(unique_lock<mutex>& __lk, + const chrono::duration<_Rep, _Period>& __d); + + template <class _Rep, class _Period, class _Predicate> + bool + wait_for(unique_lock<mutex>& __lk, + const chrono::duration<_Rep, _Period>& __d, + _Predicate __pred); + + typedef pthread_cond_t* native_handle_type; + _LIBCPP_INLINE_VISIBILITY native_handle_type native_handle() {return &__cv_;} + +private: + void __do_timed_wait(unique_lock<mutex>& __lk, + chrono::time_point<chrono::system_clock, chrono::nanoseconds>); +}; + +template <class _To, class _Rep, class _Period> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + chrono::__is_duration<_To>::value, + _To +>::type +__ceil(chrono::duration<_Rep, _Period> __d) +{ + using namespace chrono; + _To __r = duration_cast<_To>(__d); + if (__r < __d) + ++__r; + return __r; +} + +template <class _Predicate> +void +condition_variable::wait(unique_lock<mutex>& __lk, _Predicate __pred) +{ + while (!__pred()) + wait(__lk); +} + +template <class _Duration> +cv_status +condition_variable::wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<chrono::system_clock, _Duration>& __t) +{ + using namespace chrono; + typedef time_point<system_clock, nanoseconds> __nano_sys_tmpt; + __do_timed_wait(__lk, + __nano_sys_tmpt(__ceil<nanoseconds>(__t.time_since_epoch()))); + return system_clock::now() < __t ? cv_status::no_timeout : + cv_status::timeout; +} + +template <class _Clock, class _Duration> +cv_status +condition_variable::wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<_Clock, _Duration>& __t) +{ + using namespace chrono; + system_clock::time_point __s_now = system_clock::now(); + typename _Clock::time_point __c_now = _Clock::now(); + __do_timed_wait(__lk, __s_now + __ceil<nanoseconds>(__t - __c_now)); + return _Clock::now() < __t ? cv_status::no_timeout : cv_status::timeout; +} + +template <class _Clock, class _Duration, class _Predicate> +bool +condition_variable::wait_until(unique_lock<mutex>& __lk, + const chrono::time_point<_Clock, _Duration>& __t, + _Predicate __pred) +{ + while (!__pred()) + { + if (wait_until(__lk, __t) == cv_status::timeout) + return __pred(); + } + return true; +} + +template <class _Rep, class _Period> +cv_status +condition_variable::wait_for(unique_lock<mutex>& __lk, + const chrono::duration<_Rep, _Period>& __d) +{ + using namespace chrono; + system_clock::time_point __s_now = system_clock::now(); + steady_clock::time_point __c_now = steady_clock::now(); + __do_timed_wait(__lk, __s_now + __ceil<nanoseconds>(__d)); + return steady_clock::now() - __c_now < __d ? cv_status::no_timeout : + cv_status::timeout; +} + +template <class _Rep, class _Period, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +condition_variable::wait_for(unique_lock<mutex>& __lk, + const chrono::duration<_Rep, _Period>& __d, + _Predicate __pred) +{ + return wait_until(__lk, chrono::steady_clock::now() + __d, + _VSTD::move(__pred)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___MUTEX_BASE diff --git a/contrib/libc++/include/__split_buffer b/contrib/libc++/include/__split_buffer new file mode 100644 index 0000000..e0aa13b --- /dev/null +++ b/contrib/libc++/include/__split_buffer @@ -0,0 +1,654 @@ +// -*- C++ -*- +#ifndef _LIBCPP_SPLIT_BUFFER +#define _LIBCPP_SPLIT_BUFFER + +#include <__config> +#include <type_traits> +#include <algorithm> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <bool> +class __split_buffer_common +{ +protected: + void __throw_length_error() const; + void __throw_out_of_range() const; +}; + +template <class _Tp, class _Allocator = allocator<_Tp> > +struct __split_buffer + : private __split_buffer_common<true> +{ +private: + __split_buffer(const __split_buffer&); + __split_buffer& operator=(const __split_buffer&); +public: + typedef _Tp value_type; + typedef _Allocator allocator_type; + typedef typename remove_reference<allocator_type>::type __alloc_rr; + typedef allocator_traits<__alloc_rr> __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 __first_; + pointer __begin_; + pointer __end_; + __compressed_pair<pointer, allocator_type> __end_cap_; + + typedef typename add_lvalue_reference<allocator_type>::type __alloc_ref; + typedef typename add_lvalue_reference<allocator_type>::type __alloc_const_ref; + + _LIBCPP_INLINE_VISIBILITY __alloc_rr& __alloc() _NOEXCEPT {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY const __alloc_rr& __alloc() const _NOEXCEPT {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY pointer& __end_cap() _NOEXCEPT {return __end_cap_.first();} + _LIBCPP_INLINE_VISIBILITY const pointer& __end_cap() const _NOEXCEPT {return __end_cap_.first();} + + __split_buffer() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); + explicit __split_buffer(__alloc_rr& __a); + explicit __split_buffer(const __alloc_rr& __a); + __split_buffer(size_type __cap, size_type __start, __alloc_rr& __a); + ~__split_buffer(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __split_buffer(__split_buffer&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); + __split_buffer(__split_buffer&& __c, const __alloc_rr& __a); + __split_buffer& operator=(__split_buffer&& __c) + _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) || + !__alloc_traits::propagate_on_container_move_assignment::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT {return __begin_;} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT {return __begin_;} + _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT {return __end_;} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT {return __end_;} + + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT + {__destruct_at_end(__begin_);} + _LIBCPP_INLINE_VISIBILITY size_type size() const {return static_cast<size_type>(__end_ - __begin_);} + _LIBCPP_INLINE_VISIBILITY bool empty() const {return __end_ == __begin_;} + _LIBCPP_INLINE_VISIBILITY size_type capacity() const {return static_cast<size_type>(__end_cap() - __first_);} + _LIBCPP_INLINE_VISIBILITY size_type __front_spare() const {return static_cast<size_type>(__begin_ - __first_);} + _LIBCPP_INLINE_VISIBILITY size_type __back_spare() const {return static_cast<size_type>(__end_cap() - __end_);} + + _LIBCPP_INLINE_VISIBILITY reference front() {return *__begin_;} + _LIBCPP_INLINE_VISIBILITY const_reference front() const {return *__begin_;} + _LIBCPP_INLINE_VISIBILITY reference back() {return *(__end_ - 1);} + _LIBCPP_INLINE_VISIBILITY const_reference back() const {return *(__end_ - 1);} + + void reserve(size_type __n); + void shrink_to_fit() _NOEXCEPT; + void push_front(const_reference __x); + _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x); +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + void push_front(value_type&& __x); + void push_back(value_type&& __x); +#if !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + void emplace_back(_Args&&... __args); +#endif // !defined(_LIBCPP_HAS_NO_VARIADICS) +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + + _LIBCPP_INLINE_VISIBILITY void pop_front() {__destruct_at_begin(__begin_+1);} + _LIBCPP_INLINE_VISIBILITY void pop_back() {__destruct_at_end(__end_-1);} + + void __construct_at_end(size_type __n); + void __construct_at_end(size_type __n, const_reference __x); + template <class _InputIter> + typename enable_if + < + __is_input_iterator<_InputIter>::value && + !__is_forward_iterator<_InputIter>::value, + void + >::type + __construct_at_end(_InputIter __first, _InputIter __last); + template <class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + void + >::type + __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); + + _LIBCPP_INLINE_VISIBILITY void __destruct_at_begin(pointer __new_begin) + {__destruct_at_begin(__new_begin, is_trivially_destructible<value_type>());} + void __destruct_at_begin(pointer __new_begin, false_type); + void __destruct_at_begin(pointer __new_begin, true_type); + + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last) _NOEXCEPT + {__destruct_at_end(__new_last, false_type());} + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last, false_type) _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(pointer __new_last, true_type) _NOEXCEPT; + + void swap(__split_buffer& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<__alloc_rr>::value); + + bool __invariants() const; + +private: + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__split_buffer& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__split_buffer&, false_type) _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__alloc_rr& __x, __alloc_rr& __y) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<__alloc_rr>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __alloc_traits::propagate_on_container_swap::value>());} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__alloc_rr& __x, __alloc_rr& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<__alloc_rr>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__alloc_rr&, __alloc_rr&, false_type) _NOEXCEPT + {} +}; + +template <class _Tp, class _Allocator> +bool +__split_buffer<_Tp, _Allocator>::__invariants() const +{ + if (__first_ == nullptr) + { + if (__begin_ != nullptr) + return false; + if (__end_ != nullptr) + return false; + if (__end_cap() != nullptr) + return false; + } + else + { + if (__begin_ < __first_) + return false; + if (__end_ < __begin_) + return false; + if (__end_cap() < __end_) + return false; + } + return true; +} + +// 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 +__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n) +{ + __alloc_rr& __a = this->__alloc(); + do + { + __alloc_traits::construct(__a, _VSTD::__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> +void +__split_buffer<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) +{ + __alloc_rr& __a = this->__alloc(); + do + { + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x); + ++this->__end_; + --__n; + } while (__n > 0); +} + +template <class _Tp, class _Allocator> +template <class _InputIter> +typename enable_if +< + __is_input_iterator<_InputIter>::value && + !__is_forward_iterator<_InputIter>::value, + void +>::type +__split_buffer<_Tp, _Allocator>::__construct_at_end(_InputIter __first, _InputIter __last) +{ + __alloc_rr& __a = this->__alloc(); + for (; __first != __last; ++__first) + { + if (__end_ == __end_cap()) + { + size_type __old_cap = __end_cap() - __first_; + size_type __new_cap = _VSTD::max<size_type>(2 * __old_cap, 8); + __split_buffer __buf(__new_cap, 0, __a); + for (pointer __p = __begin_; __p != __end_; ++__p, ++__buf.__end_) + __alloc_traits::construct(__buf.__alloc(), + _VSTD::__to_raw_pointer(__buf.__end_), _VSTD::move(*__p)); + swap(__buf); + } + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first); + ++this->__end_; + } +} + +template <class _Tp, class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +__split_buffer<_Tp, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) +{ + __alloc_rr& __a = this->__alloc(); + for (; __first != __last; ++__first) + { + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first); + ++this->__end_; + } +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, false_type) +{ + while (__begin_ != __new_begin) + __alloc_traits::destroy(__alloc(), __begin_++); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_begin(pointer __new_begin, true_type) +{ + __begin_ = __new_begin; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, false_type) _NOEXCEPT +{ + while (__new_last != __end_) + __alloc_traits::destroy(__alloc(), --__end_); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__split_buffer<_Tp, _Allocator>::__destruct_at_end(pointer __new_last, true_type) _NOEXCEPT +{ + __end_ = __new_last; +} + +template <class _Tp, class _Allocator> +__split_buffer<_Tp, _Allocator>::__split_buffer(size_type __cap, size_type __start, __alloc_rr& __a) + : __end_cap_(0, __a) +{ + __first_ = __cap != 0 ? __alloc_traits::allocate(__alloc(), __cap) : nullptr; + __begin_ = __end_ = __first_ + __start; + __end_cap() = __first_ + __cap; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +__split_buffer<_Tp, _Allocator>::__split_buffer() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + : __first_(0), __begin_(0), __end_(0), __end_cap_(0) +{ +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +__split_buffer<_Tp, _Allocator>::__split_buffer(__alloc_rr& __a) + : __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a) +{ +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +__split_buffer<_Tp, _Allocator>::__split_buffer(const __alloc_rr& __a) + : __first_(0), __begin_(0), __end_(0), __end_cap_(0, __a) +{ +} + +template <class _Tp, class _Allocator> +__split_buffer<_Tp, _Allocator>::~__split_buffer() +{ + clear(); + if (__first_) + __alloc_traits::deallocate(__alloc(), __first_, capacity()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __first_(_VSTD::move(__c.__first_)), + __begin_(_VSTD::move(__c.__begin_)), + __end_(_VSTD::move(__c.__end_)), + __end_cap_(_VSTD::move(__c.__end_cap_)) +{ + __c.__first_ = nullptr; + __c.__begin_ = nullptr; + __c.__end_ = nullptr; + __c.__end_cap() = nullptr; +} + +template <class _Tp, class _Allocator> +__split_buffer<_Tp, _Allocator>::__split_buffer(__split_buffer&& __c, const __alloc_rr& __a) + : __end_cap_(__a) +{ + if (__a == __c.__alloc()) + { + __first_ = __c.__first_; + __begin_ = __c.__begin_; + __end_ = __c.__end_; + __end_cap() = __c.__end_cap(); + __c.__first_ = nullptr; + __c.__begin_ = nullptr; + __c.__end_ = nullptr; + __c.__end_cap() = nullptr; + } + else + { + size_type __cap = __c.size(); + __first_ = __alloc_traits::allocate(__alloc(), __cap); + __begin_ = __end_ = __first_; + __end_cap() = __first_ + __cap; + typedef move_iterator<iterator> _Ip; + __construct_at_end(_Ip(__c.begin()), _Ip(__c.end())); + } +} + +template <class _Tp, class _Allocator> +__split_buffer<_Tp, _Allocator>& +__split_buffer<_Tp, _Allocator>::operator=(__split_buffer&& __c) + _NOEXCEPT_((__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) || + !__alloc_traits::propagate_on_container_move_assignment::value) +{ + clear(); + shrink_to_fit(); + __first_ = __c.__first_; + __begin_ = __c.__begin_; + __end_ = __c.__end_; + __end_cap() = __c.__end_cap(); + __move_assign_alloc(__c, + integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>()); + __c.__first_ = __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::swap(__split_buffer& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<__alloc_rr>::value) +{ + _VSTD::swap(__first_, __x.__first_); + _VSTD::swap(__begin_, __x.__begin_); + _VSTD::swap(__end_, __x.__end_); + _VSTD::swap(__end_cap(), __x.__end_cap()); + __swap_alloc(__alloc(), __x.__alloc()); +} + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::reserve(size_type __n) +{ + if (__n < capacity()) + { + __split_buffer<value_type, __alloc_rr&> __t(__n, 0, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } +} + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT +{ + if (capacity() > size()) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __split_buffer<value_type, __alloc_rr&> __t(size(), 0, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + __t.__end_ = __t.__begin_ + (__end_ - __begin_); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::push_front(const_reference __x) +{ + if (__begin_ == __first_) + { + if (__end_ < __end_cap()) + { + difference_type __d = __end_cap() - __end_; + __d = (__d + 1) / 2; + __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d); + __end_ += __d; + } + else + { + size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1); + __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1), __x); + --__begin_; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::push_front(value_type&& __x) +{ + if (__begin_ == __first_) + { + if (__end_ < __end_cap()) + { + difference_type __d = __end_cap() - __end_; + __d = (__d + 1) / 2; + __begin_ = _VSTD::move_backward(__begin_, __end_, __end_ + __d); + __end_ += __d; + } + else + { + size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1); + __split_buffer<value_type, __alloc_rr&> __t(__c, (__c + 3) / 4, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__begin_-1), + _VSTD::move(__x)); + --__begin_; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__split_buffer<_Tp, _Allocator>::push_back(const_reference __x) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1); + __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), __x); + ++__end_; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +__split_buffer<_Tp, _Allocator>::push_back(value_type&& __x) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1); + __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), + _VSTD::move(__x)); + ++__end_; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +void +__split_buffer<_Tp, _Allocator>::emplace_back(_Args&&... __args) +{ + if (__end_ == __end_cap()) + { + if (__begin_ > __first_) + { + difference_type __d = __begin_ - __first_; + __d = (__d + 1) / 2; + __end_ = _VSTD::move(__begin_, __end_, __begin_ - __d); + __begin_ -= __d; + } + else + { + size_type __c = max<size_type>(2 * static_cast<size_t>(__end_cap() - __first_), 1); + __split_buffer<value_type, __alloc_rr&> __t(__c, __c / 4, __alloc()); + __t.__construct_at_end(move_iterator<pointer>(__begin_), + move_iterator<pointer>(__end_)); + _VSTD::swap(__first_, __t.__first_); + _VSTD::swap(__begin_, __t.__begin_); + _VSTD::swap(__end_, __t.__end_); + _VSTD::swap(__end_cap(), __t.__end_cap()); + } + } + __alloc_traits::construct(__alloc(), _VSTD::__to_raw_pointer(__end_), + _VSTD::forward<_Args>(__args)...); + ++__end_; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(__split_buffer<_Tp, _Allocator>& __x, __split_buffer<_Tp, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_SPLIT_BUFFER diff --git a/contrib/libc++/include/__sso_allocator b/contrib/libc++/include/__sso_allocator new file mode 100644 index 0000000..7240072 --- /dev/null +++ b/contrib/libc++/include/__sso_allocator @@ -0,0 +1,77 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___SSO_ALLOCATOR +#define _LIBCPP___SSO_ALLOCATOR + +#include <__config> +#include <type_traits> +#include <new> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, size_t _Np> class _LIBCPP_HIDDEN __sso_allocator; + +template <size_t _Np> +class _LIBCPP_HIDDEN __sso_allocator<void, _Np> +{ +public: + typedef const void* const_pointer; + typedef void value_type; +}; + +template <class _Tp, size_t _Np> +class _LIBCPP_HIDDEN __sso_allocator +{ + typename aligned_storage<sizeof(_Tp) * _Np>::type buf_; + bool __allocated_; +public: + typedef size_t size_type; + typedef _Tp* pointer; + typedef _Tp value_type; + + _LIBCPP_INLINE_VISIBILITY __sso_allocator() throw() : __allocated_(false) {} + _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator&) throw() : __allocated_(false) {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY __sso_allocator(const __sso_allocator<_Up, _Np>&) throw() + : __allocated_(false) {} +private: + __sso_allocator& operator=(const __sso_allocator&); +public: + _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, typename __sso_allocator<void, _Np>::const_pointer = 0) + { + if (!__allocated_ && __n <= _Np) + { + __allocated_ = true; + return (pointer)&buf_; + } + return static_cast<pointer>(::operator new(__n * sizeof(_Tp))); + } + _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) + { + if (__p == (pointer)&buf_) + __allocated_ = false; + else + ::operator delete(__p); + } + _LIBCPP_INLINE_VISIBILITY size_type max_size() const throw() {return size_type(~0) / sizeof(_Tp);} + + _LIBCPP_INLINE_VISIBILITY + bool operator==(__sso_allocator& __a) const {return &buf_ == &__a.buf_;} + _LIBCPP_INLINE_VISIBILITY + bool operator!=(__sso_allocator& __a) const {return &buf_ != &__a.buf_;} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___SSO_ALLOCATOR diff --git a/contrib/libc++/include/__std_stream b/contrib/libc++/include/__std_stream new file mode 100644 index 0000000..e562e2c --- /dev/null +++ b/contrib/libc++/include/__std_stream @@ -0,0 +1,317 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___STD_STREAM +#define _LIBCPP___STD_STREAM + +#include <__config> +#include <ostream> +#include <istream> +#include <__locale> +#include <cstdio> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +static const int __limit = 8; + +// __stdinbuf + +template <class _CharT> +class _LIBCPP_HIDDEN __stdinbuf + : public basic_streambuf<_CharT, char_traits<_CharT> > +{ +public: + typedef _CharT char_type; + typedef char_traits<char_type> traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef typename traits_type::state_type state_type; + + explicit __stdinbuf(FILE* __fp); + +protected: + virtual int_type underflow(); + virtual int_type uflow(); + virtual int_type pbackfail(int_type __c = traits_type::eof()); + virtual void imbue(const locale& __loc); + +private: + + FILE* __file_; + const codecvt<char_type, char, state_type>* __cv_; + state_type __st_; + int __encoding_; + bool __always_noconv_; + + __stdinbuf(const __stdinbuf&); + __stdinbuf& operator=(const __stdinbuf&); + + int_type __getchar(bool __consume); +}; + +template <class _CharT> +__stdinbuf<_CharT>::__stdinbuf(FILE* __fp) + : __file_(__fp), + __st_() +{ + imbue(this->getloc()); +} + +template <class _CharT> +void +__stdinbuf<_CharT>::imbue(const locale& __loc) +{ + __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); + __encoding_ = __cv_->encoding(); + __always_noconv_ = __cv_->always_noconv(); + if (__encoding_ > __limit) + __throw_runtime_error("unsupported locale for standard input"); +} + +template <class _CharT> +typename __stdinbuf<_CharT>::int_type +__stdinbuf<_CharT>::underflow() +{ + return __getchar(false); +} + +template <class _CharT> +typename __stdinbuf<_CharT>::int_type +__stdinbuf<_CharT>::uflow() +{ + return __getchar(true); +} + +template <class _CharT> +typename __stdinbuf<_CharT>::int_type +__stdinbuf<_CharT>::__getchar(bool __consume) +{ + char __extbuf[__limit]; + int __nread = _VSTD::max(1, __encoding_); + for (int __i = 0; __i < __nread; ++__i) + { + int __c = getc(__file_); + if (__c == EOF) + return traits_type::eof(); + __extbuf[__i] = static_cast<char>(__c); + } + char_type __1buf; + if (__always_noconv_) + __1buf = static_cast<char_type>(__extbuf[0]); + else + { + const char* __enxt; + char_type* __inxt; + codecvt_base::result __r; + do + { + state_type __sv_st = __st_; + __r = __cv_->in(__st_, __extbuf, __extbuf + __nread, __enxt, + &__1buf, &__1buf + 1, __inxt); + switch (__r) + { + case _VSTD::codecvt_base::ok: + break; + case codecvt_base::partial: + __st_ = __sv_st; + if (__nread == sizeof(__extbuf)) + return traits_type::eof(); + { + int __c = getc(__file_); + if (__c == EOF) + return traits_type::eof(); + __extbuf[__nread] = static_cast<char>(__c); + } + ++__nread; + break; + case codecvt_base::error: + return traits_type::eof(); + case _VSTD::codecvt_base::noconv: + __1buf = static_cast<char_type>(__extbuf[0]); + break; + } + } while (__r == _VSTD::codecvt_base::partial); + } + if (!__consume) + { + for (int __i = __nread; __i > 0;) + { + if (ungetc(__extbuf[--__i], __file_) == EOF) + return traits_type::eof(); + } + } + return traits_type::to_int_type(__1buf); +} + +template <class _CharT> +typename __stdinbuf<_CharT>::int_type +__stdinbuf<_CharT>::pbackfail(int_type __c) +{ + if (traits_type::eq_int_type(__c, traits_type::eof())) + return __c; + char __extbuf[__limit]; + char* __enxt; + const char_type __ci = traits_type::to_char_type(__c); + const char_type* __inxt; + switch (__cv_->out(__st_, &__ci, &__ci + 1, __inxt, + __extbuf, __extbuf + sizeof(__extbuf), __enxt)) + { + case _VSTD::codecvt_base::ok: + break; + case _VSTD::codecvt_base::noconv: + __extbuf[0] = static_cast<char>(__c); + __enxt = __extbuf + 1; + break; + case codecvt_base::partial: + case codecvt_base::error: + return traits_type::eof(); + } + while (__enxt > __extbuf) + if (ungetc(*--__enxt, __file_) == EOF) + return traits_type::eof(); + return traits_type::not_eof(__c); +} + +// __stdoutbuf + +template <class _CharT> +class _LIBCPP_HIDDEN __stdoutbuf + : public basic_streambuf<_CharT, char_traits<_CharT> > +{ +public: + typedef _CharT char_type; + typedef char_traits<char_type> traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef typename traits_type::state_type state_type; + + explicit __stdoutbuf(FILE* __fp); + +protected: + virtual int_type overflow (int_type __c = traits_type::eof()); + virtual int sync(); + virtual void imbue(const locale& __loc); + +private: + FILE* __file_; + const codecvt<char_type, char, state_type>* __cv_; + state_type __st_; + bool __always_noconv_; + + __stdoutbuf(const __stdoutbuf&); + __stdoutbuf& operator=(const __stdoutbuf&); +}; + +template <class _CharT> +__stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp) + : __file_(__fp), + __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), + __st_(), + __always_noconv_(__cv_->always_noconv()) +{ +} + +template <class _CharT> +typename __stdoutbuf<_CharT>::int_type +__stdoutbuf<_CharT>::overflow(int_type __c) +{ + char __extbuf[__limit]; + char_type __1buf; + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + this->setp(&__1buf, &__1buf+1); + *this->pptr() = traits_type::to_char_type(__c); + this->pbump(1); + if (__always_noconv_) + { + if (fwrite(this->pbase(), sizeof(char_type), 1, __file_) != 1) + return traits_type::eof(); + } + else + { + char* __extbe = __extbuf; + codecvt_base::result __r; + do + { + const char_type* __e; + __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, + __extbuf, + __extbuf + sizeof(__extbuf), + __extbe); + if (__e == this->pbase()) + return traits_type::eof(); + if (__r == codecvt_base::noconv) + { + if (fwrite(this->pbase(), 1, 1, __file_) != 1) + return traits_type::eof(); + } + else if (__r == codecvt_base::ok || __r == codecvt_base::partial) + { + size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); + if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) + return traits_type::eof(); + if (__r == codecvt_base::partial) + { + this->setp((char_type*)__e, this->pptr()); + this->pbump(static_cast<int>(this->epptr() - this->pbase())); + } + } + else + return traits_type::eof(); + } while (__r == codecvt_base::partial); + } + this->setp(0, 0); + } + return traits_type::not_eof(__c); +} + +template <class _CharT> +int +__stdoutbuf<_CharT>::sync() +{ + char __extbuf[__limit]; + codecvt_base::result __r; + do + { + char* __extbe; + __r = __cv_->unshift(__st_, __extbuf, + __extbuf + sizeof(__extbuf), + __extbe); + size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); + if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) + return -1; + } while (__r == codecvt_base::partial); + if (__r == codecvt_base::error) + return -1; + if (fflush(__file_)) + return -1; + return 0; +} + +template <class _CharT> +void +__stdoutbuf<_CharT>::imbue(const locale& __loc) +{ + sync(); + __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); + __always_noconv_ = __cv_->always_noconv(); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___STD_STREAM diff --git a/contrib/libc++/include/__tree b/contrib/libc++/include/__tree new file mode 100644 index 0000000..f57c80c --- /dev/null +++ b/contrib/libc++/include/__tree @@ -0,0 +1,2293 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___TREE +#define _LIBCPP___TREE + +#include <__config> +#include <iterator> +#include <memory> +#include <stdexcept> +#include <algorithm> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _Compare, class _Allocator> class __tree; +template <class _Tp, class _NodePtr, class _DiffType> + class _LIBCPP_VISIBLE __tree_iterator; +template <class _Tp, class _ConstNodePtr, class _DiffType> + class _LIBCPP_VISIBLE __tree_const_iterator; +template <class _Key, class _Tp, class _Compare, class _Allocator> + class _LIBCPP_VISIBLE map; +template <class _Key, class _Tp, class _Compare, class _Allocator> + class _LIBCPP_VISIBLE multimap; +template <class _Key, class _Compare, class _Allocator> + class _LIBCPP_VISIBLE set; +template <class _Key, class _Compare, class _Allocator> + class _LIBCPP_VISIBLE multiset; + +/* + +_NodePtr algorithms + +The algorithms taking _NodePtr are red black tree algorithms. Those +algorithms taking a parameter named __root should assume that __root +points to a proper red black tree (unless otherwise specified). + +Each algorithm herein assumes that __root->__parent_ points to a non-null +structure which has a member __left_ which points back to __root. No other +member is read or written to at __root->__parent_. + +__root->__parent_ will be referred to below (in comments only) as end_node. +end_node->__left_ is an externably accessible lvalue for __root, and can be +changed by node insertion and removal (without explicit reference to end_node). + +All nodes (with the exception of end_node), even the node referred to as +__root, have a non-null __parent_ field. + +*/ + +// Returns: true if __x is a left child of its parent, else false +// Precondition: __x != nullptr. +template <class _NodePtr> +inline _LIBCPP_INLINE_VISIBILITY +bool +__tree_is_left_child(_NodePtr __x) _NOEXCEPT +{ + return __x == __x->__parent_->__left_; +} + +// Determintes if the subtree rooted at __x is a proper red black subtree. If +// __x is a proper subtree, returns the black height (null counts as 1). If +// __x is an improper subtree, returns 0. +template <class _NodePtr> +unsigned +__tree_sub_invariant(_NodePtr __x) +{ + if (__x == nullptr) + return 1; + // parent consistency checked by caller + // check __x->__left_ consistency + if (__x->__left_ != nullptr && __x->__left_->__parent_ != __x) + return 0; + // check __x->__right_ consistency + if (__x->__right_ != nullptr && __x->__right_->__parent_ != __x) + return 0; + // check __x->__left_ != __x->__right_ unless both are nullptr + if (__x->__left_ == __x->__right_ && __x->__left_ != nullptr) + return 0; + // If this is red, neither child can be red + if (!__x->__is_black_) + { + if (__x->__left_ && !__x->__left_->__is_black_) + return 0; + if (__x->__right_ && !__x->__right_->__is_black_) + return 0; + } + unsigned __h = __tree_sub_invariant(__x->__left_); + if (__h == 0) + return 0; // invalid left subtree + if (__h != __tree_sub_invariant(__x->__right_)) + return 0; // invalid or different height right subtree + return __h + __x->__is_black_; // return black height of this node +} + +// Determintes if the red black tree rooted at __root is a proper red black tree. +// __root == nullptr is a proper tree. Returns true is __root is a proper +// red black tree, else returns false. +template <class _NodePtr> +bool +__tree_invariant(_NodePtr __root) +{ + if (__root == nullptr) + return true; + // check __x->__parent_ consistency + if (__root->__parent_ == nullptr) + return false; + if (!__tree_is_left_child(__root)) + return false; + // root must be black + if (!__root->__is_black_) + return false; + // do normal node checks + return __tree_sub_invariant(__root) != 0; +} + +// Returns: pointer to the left-most node under __x. +// Precondition: __x != nullptr. +template <class _NodePtr> +inline _LIBCPP_INLINE_VISIBILITY +_NodePtr +__tree_min(_NodePtr __x) _NOEXCEPT +{ + while (__x->__left_ != nullptr) + __x = __x->__left_; + return __x; +} + +// Returns: pointer to the right-most node under __x. +// Precondition: __x != nullptr. +template <class _NodePtr> +inline _LIBCPP_INLINE_VISIBILITY +_NodePtr +__tree_max(_NodePtr __x) _NOEXCEPT +{ + while (__x->__right_ != nullptr) + __x = __x->__right_; + return __x; +} + +// Returns: pointer to the next in-order node after __x. +// Precondition: __x != nullptr. +template <class _NodePtr> +_NodePtr +__tree_next(_NodePtr __x) _NOEXCEPT +{ + if (__x->__right_ != nullptr) + return __tree_min(__x->__right_); + while (!__tree_is_left_child(__x)) + __x = __x->__parent_; + return __x->__parent_; +} + +// Returns: pointer to the previous in-order node before __x. +// Precondition: __x != nullptr. +template <class _NodePtr> +_NodePtr +__tree_prev(_NodePtr __x) _NOEXCEPT +{ + if (__x->__left_ != nullptr) + return __tree_max(__x->__left_); + while (__tree_is_left_child(__x)) + __x = __x->__parent_; + return __x->__parent_; +} + +// Returns: pointer to a node which has no children +// Precondition: __x != nullptr. +template <class _NodePtr> +_NodePtr +__tree_leaf(_NodePtr __x) _NOEXCEPT +{ + while (true) + { + if (__x->__left_ != nullptr) + { + __x = __x->__left_; + continue; + } + if (__x->__right_ != nullptr) + { + __x = __x->__right_; + continue; + } + break; + } + return __x; +} + +// Effects: Makes __x->__right_ the subtree root with __x as its left child +// while preserving in-order order. +// Precondition: __x->__right_ != nullptr +template <class _NodePtr> +void +__tree_left_rotate(_NodePtr __x) _NOEXCEPT +{ + _NodePtr __y = __x->__right_; + __x->__right_ = __y->__left_; + if (__x->__right_ != nullptr) + __x->__right_->__parent_ = __x; + __y->__parent_ = __x->__parent_; + if (__tree_is_left_child(__x)) + __x->__parent_->__left_ = __y; + else + __x->__parent_->__right_ = __y; + __y->__left_ = __x; + __x->__parent_ = __y; +} + +// Effects: Makes __x->__left_ the subtree root with __x as its right child +// while preserving in-order order. +// Precondition: __x->__left_ != nullptr +template <class _NodePtr> +void +__tree_right_rotate(_NodePtr __x) _NOEXCEPT +{ + _NodePtr __y = __x->__left_; + __x->__left_ = __y->__right_; + if (__x->__left_ != nullptr) + __x->__left_->__parent_ = __x; + __y->__parent_ = __x->__parent_; + if (__tree_is_left_child(__x)) + __x->__parent_->__left_ = __y; + else + __x->__parent_->__right_ = __y; + __y->__right_ = __x; + __x->__parent_ = __y; +} + +// Effects: Rebalances __root after attaching __x to a leaf. +// Precondition: __root != nulptr && __x != nullptr. +// __x has no children. +// __x == __root or == a direct or indirect child of __root. +// If __x were to be unlinked from __root (setting __root to +// nullptr if __root == __x), __tree_invariant(__root) == true. +// Postcondition: __tree_invariant(end_node->__left_) == true. end_node->__left_ +// may be different than the value passed in as __root. +template <class _NodePtr> +void +__tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT +{ + __x->__is_black_ = __x == __root; + while (__x != __root && !__x->__parent_->__is_black_) + { + // __x->__parent_ != __root because __x->__parent_->__is_black == false + if (__tree_is_left_child(__x->__parent_)) + { + _NodePtr __y = __x->__parent_->__parent_->__right_; + if (__y != nullptr && !__y->__is_black_) + { + __x = __x->__parent_; + __x->__is_black_ = true; + __x = __x->__parent_; + __x->__is_black_ = __x == __root; + __y->__is_black_ = true; + } + else + { + if (!__tree_is_left_child(__x)) + { + __x = __x->__parent_; + __tree_left_rotate(__x); + } + __x = __x->__parent_; + __x->__is_black_ = true; + __x = __x->__parent_; + __x->__is_black_ = false; + __tree_right_rotate(__x); + break; + } + } + else + { + _NodePtr __y = __x->__parent_->__parent_->__left_; + if (__y != nullptr && !__y->__is_black_) + { + __x = __x->__parent_; + __x->__is_black_ = true; + __x = __x->__parent_; + __x->__is_black_ = __x == __root; + __y->__is_black_ = true; + } + else + { + if (__tree_is_left_child(__x)) + { + __x = __x->__parent_; + __tree_right_rotate(__x); + } + __x = __x->__parent_; + __x->__is_black_ = true; + __x = __x->__parent_; + __x->__is_black_ = false; + __tree_left_rotate(__x); + break; + } + } + } +} + +// Precondition: __root != nullptr && __z != nullptr. +// __tree_invariant(__root) == true. +// __z == __root or == a direct or indirect child of __root. +// Effects: unlinks __z from the tree rooted at __root, rebalancing as needed. +// Postcondition: __tree_invariant(end_node->__left_) == true && end_node->__left_ +// nor any of its children refer to __z. end_node->__left_ +// may be different than the value passed in as __root. +template <class _NodePtr> +void +__tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT +{ + // __z will be removed from the tree. Client still needs to destruct/deallocate it + // __y is either __z, or if __z has two children, __tree_next(__z). + // __y will have at most one child. + // __y will be the initial hole in the tree (make the hole at a leaf) + _NodePtr __y = (__z->__left_ == nullptr || __z->__right_ == nullptr) ? + __z : __tree_next(__z); + // __x is __y's possibly null single child + _NodePtr __x = __y->__left_ != nullptr ? __y->__left_ : __y->__right_; + // __w is __x's possibly null uncle (will become __x's sibling) + _NodePtr __w = nullptr; + // link __x to __y's parent, and find __w + if (__x != nullptr) + __x->__parent_ = __y->__parent_; + if (__tree_is_left_child(__y)) + { + __y->__parent_->__left_ = __x; + if (__y != __root) + __w = __y->__parent_->__right_; + else + __root = __x; // __w == nullptr + } + else + { + __y->__parent_->__right_ = __x; + // __y can't be root if it is a right child + __w = __y->__parent_->__left_; + } + bool __removed_black = __y->__is_black_; + // If we didn't remove __z, do so now by splicing in __y for __z, + // but copy __z's color. This does not impact __x or __w. + if (__y != __z) + { + // __z->__left_ != nulptr but __z->__right_ might == __x == nullptr + __y->__parent_ = __z->__parent_; + if (__tree_is_left_child(__z)) + __y->__parent_->__left_ = __y; + else + __y->__parent_->__right_ = __y; + __y->__left_ = __z->__left_; + __y->__left_->__parent_ = __y; + __y->__right_ = __z->__right_; + if (__y->__right_ != nullptr) + __y->__right_->__parent_ = __y; + __y->__is_black_ = __z->__is_black_; + if (__root == __z) + __root = __y; + } + // There is no need to rebalance if we removed a red, or if we removed + // the last node. + if (__removed_black && __root != nullptr) + { + // Rebalance: + // __x has an implicit black color (transferred from the removed __y) + // associated with it, no matter what its color is. + // If __x is __root (in which case it can't be null), it is supposed + // to be black anyway, and if it is doubly black, then the double + // can just be ignored. + // If __x is red (in which case it can't be null), then it can absorb + // the implicit black just by setting its color to black. + // Since __y was black and only had one child (which __x points to), __x + // is either red with no children, else null, otherwise __y would have + // different black heights under left and right pointers. + // if (__x == __root || __x != nullptr && !__x->__is_black_) + if (__x != nullptr) + __x->__is_black_ = true; + else + { + // Else __x isn't root, and is "doubly black", even though it may + // be null. __w can not be null here, else the parent would + // see a black height >= 2 on the __x side and a black height + // of 1 on the __w side (__w must be a non-null black or a red + // with a non-null black child). + while (true) + { + if (!__tree_is_left_child(__w)) // if x is left child + { + if (!__w->__is_black_) + { + __w->__is_black_ = true; + __w->__parent_->__is_black_ = false; + __tree_left_rotate(__w->__parent_); + // __x is still valid + // reset __root only if necessary + if (__root == __w->__left_) + __root = __w; + // reset sibling, and it still can't be null + __w = __w->__left_->__right_; + } + // __w->__is_black_ is now true, __w may have null children + if ((__w->__left_ == nullptr || __w->__left_->__is_black_) && + (__w->__right_ == nullptr || __w->__right_->__is_black_)) + { + __w->__is_black_ = false; + __x = __w->__parent_; + // __x can no longer be null + if (__x == __root || !__x->__is_black_) + { + __x->__is_black_ = true; + break; + } + // reset sibling, and it still can't be null + __w = __tree_is_left_child(__x) ? + __x->__parent_->__right_ : + __x->__parent_->__left_; + // continue; + } + else // __w has a red child + { + if (__w->__right_ == nullptr || __w->__right_->__is_black_) + { + // __w left child is non-null and red + __w->__left_->__is_black_ = true; + __w->__is_black_ = false; + __tree_right_rotate(__w); + // __w is known not to be root, so root hasn't changed + // reset sibling, and it still can't be null + __w = __w->__parent_; + } + // __w has a right red child, left child may be null + __w->__is_black_ = __w->__parent_->__is_black_; + __w->__parent_->__is_black_ = true; + __w->__right_->__is_black_ = true; + __tree_left_rotate(__w->__parent_); + break; + } + } + else + { + if (!__w->__is_black_) + { + __w->__is_black_ = true; + __w->__parent_->__is_black_ = false; + __tree_right_rotate(__w->__parent_); + // __x is still valid + // reset __root only if necessary + if (__root == __w->__right_) + __root = __w; + // reset sibling, and it still can't be null + __w = __w->__right_->__left_; + } + // __w->__is_black_ is now true, __w may have null children + if ((__w->__left_ == nullptr || __w->__left_->__is_black_) && + (__w->__right_ == nullptr || __w->__right_->__is_black_)) + { + __w->__is_black_ = false; + __x = __w->__parent_; + // __x can no longer be null + if (!__x->__is_black_ || __x == __root) + { + __x->__is_black_ = true; + break; + } + // reset sibling, and it still can't be null + __w = __tree_is_left_child(__x) ? + __x->__parent_->__right_ : + __x->__parent_->__left_; + // continue; + } + else // __w has a red child + { + if (__w->__left_ == nullptr || __w->__left_->__is_black_) + { + // __w right child is non-null and red + __w->__right_->__is_black_ = true; + __w->__is_black_ = false; + __tree_left_rotate(__w); + // __w is known not to be root, so root hasn't changed + // reset sibling, and it still can't be null + __w = __w->__parent_; + } + // __w has a left red child, right child may be null + __w->__is_black_ = __w->__parent_->__is_black_; + __w->__parent_->__is_black_ = true; + __w->__left_->__is_black_ = true; + __tree_right_rotate(__w->__parent_); + break; + } + } + } + } + } +} + +template <class _Allocator> class __map_node_destructor; + +template <class _Allocator> +class __tree_node_destructor +{ + typedef _Allocator allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::value_type::value_type value_type; +public: + typedef typename __alloc_traits::pointer pointer; +private: + + allocator_type& __na_; + + __tree_node_destructor& operator=(const __tree_node_destructor&); + +public: + bool __value_constructed; + + _LIBCPP_INLINE_VISIBILITY + explicit __tree_node_destructor(allocator_type& __na) _NOEXCEPT + : __na_(__na), + __value_constructed(false) + {} + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + if (__value_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } + + template <class> friend class __map_node_destructor; +}; + +// node + +template <class _Pointer> +class __tree_end_node +{ +public: + typedef _Pointer pointer; + pointer __left_; + + _LIBCPP_INLINE_VISIBILITY + __tree_end_node() _NOEXCEPT : __left_() {} +}; + +template <class _VoidPtr> +class __tree_node_base + : public __tree_end_node + < + typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__tree_node_base<_VoidPtr> > +#else + rebind<__tree_node_base<_VoidPtr> >::other +#endif + > +{ + __tree_node_base(const __tree_node_base&); + __tree_node_base& operator=(const __tree_node_base&); +public: + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__tree_node_base> +#else + rebind<__tree_node_base>::other +#endif + pointer; + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const __tree_node_base> +#else + rebind<const __tree_node_base>::other +#endif + const_pointer; + typedef __tree_end_node<pointer> base; + + pointer __right_; + pointer __parent_; + bool __is_black_; + + _LIBCPP_INLINE_VISIBILITY + __tree_node_base() _NOEXCEPT + : __right_(), __parent_(), __is_black_(false) {} +}; + +template <class _Tp, class _VoidPtr> +class __tree_node + : public __tree_node_base<_VoidPtr> +{ +public: + typedef __tree_node_base<_VoidPtr> base; + typedef _Tp value_type; + + value_type __value_; + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + explicit __tree_node(_Args&& ...__args) + : __value_(_VSTD::forward<_Args>(__args)...) {} +#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + explicit __tree_node(const value_type& __v) + : __value_(__v) {} +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) +}; + +template <class _TreeIterator> class __map_iterator; +template <class _TreeIterator> class __map_const_iterator; + +template <class _Tp, class _NodePtr, class _DiffType> +class _LIBCPP_VISIBLE __tree_iterator +{ + typedef _NodePtr __node_pointer; + typedef typename pointer_traits<__node_pointer>::element_type __node; + typedef typename __node::base __node_base; + typedef typename __node_base::pointer __node_base_pointer; + + __node_pointer __ptr_; + + typedef pointer_traits<__node_pointer> __pointer_traits; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _DiffType difference_type; + typedef value_type& reference; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __tree_iterator& operator++() + {__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); + return *this;} + _LIBCPP_INLINE_VISIBILITY + __tree_iterator operator++(int) + {__tree_iterator __t(*this); ++(*this); return __t;} + + _LIBCPP_INLINE_VISIBILITY + __tree_iterator& operator--() + {__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); + return *this;} + _LIBCPP_INLINE_VISIBILITY + __tree_iterator operator--(int) + {__tree_iterator __t(*this); --(*this); return __t;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __tree_iterator& __x, const __tree_iterator& __y) + {return __x.__ptr_ == __y.__ptr_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __tree_iterator& __x, const __tree_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __tree_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {} + template <class, class, class> friend class __tree; + template <class, class, class> friend class _LIBCPP_VISIBLE __tree_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __map_iterator; + template <class, class, class, class> friend class _LIBCPP_VISIBLE map; + template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap; + template <class, class, class> friend class _LIBCPP_VISIBLE set; + template <class, class, class> friend class _LIBCPP_VISIBLE multiset; +}; + +template <class _Tp, class _ConstNodePtr, class _DiffType> +class _LIBCPP_VISIBLE __tree_const_iterator +{ + typedef _ConstNodePtr __node_pointer; + typedef typename pointer_traits<__node_pointer>::element_type __node; + typedef const typename __node::base __node_base; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__node_base> +#else + rebind<__node_base>::other +#endif + __node_base_pointer; + + __node_pointer __ptr_; + + typedef pointer_traits<__node_pointer> __pointer_traits; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _DiffType difference_type; + typedef const value_type& reference; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __tree_const_iterator() {} +private: + typedef typename remove_const<__node>::type __non_const_node; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__non_const_node> +#else + rebind<__non_const_node>::other +#endif + __non_const_node_pointer; + typedef __tree_iterator<value_type, __non_const_node_pointer, difference_type> + __non_const_iterator; +public: + _LIBCPP_INLINE_VISIBILITY + __tree_const_iterator(__non_const_iterator __p) _NOEXCEPT + : __ptr_(__p.__ptr_) {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &__ptr_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __tree_const_iterator& operator++() + {__ptr_ = static_cast<__node_pointer>(__tree_next(static_cast<__node_base_pointer>(__ptr_))); + return *this;} + _LIBCPP_INLINE_VISIBILITY + __tree_const_iterator operator++(int) + {__tree_const_iterator __t(*this); ++(*this); return __t;} + + _LIBCPP_INLINE_VISIBILITY + __tree_const_iterator& operator--() + {__ptr_ = static_cast<__node_pointer>(__tree_prev(static_cast<__node_base_pointer>(__ptr_))); + return *this;} + _LIBCPP_INLINE_VISIBILITY + __tree_const_iterator operator--(int) + {__tree_const_iterator __t(*this); --(*this); return __t;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __tree_const_iterator& __x, const __tree_const_iterator& __y) + {return __x.__ptr_ == __y.__ptr_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __tree_const_iterator& __x, const __tree_const_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __tree_const_iterator(__node_pointer __p) _NOEXCEPT + : __ptr_(__p) {} + template <class, class, class> friend class __tree; + template <class, class, class, class> friend class _LIBCPP_VISIBLE map; + template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap; + template <class, class, class> friend class _LIBCPP_VISIBLE set; + template <class, class, class> friend class _LIBCPP_VISIBLE multiset; + template <class> friend class _LIBCPP_VISIBLE __map_const_iterator; +}; + +template <class _Tp, class _Compare, class _Allocator> +class __tree +{ +public: + typedef _Tp value_type; + typedef _Compare value_compare; + typedef _Allocator allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + + typedef __tree_node<value_type, typename __alloc_traits::void_pointer> __node; + typedef __tree_node_base<typename __alloc_traits::void_pointer> __node_base; + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__node> +#else + rebind_alloc<__node>::other +#endif + __node_allocator; + typedef allocator_traits<__node_allocator> __node_traits; + typedef typename __node_traits::pointer __node_pointer; + typedef typename __node_traits::const_pointer __node_const_pointer; + typedef typename __node_base::pointer __node_base_pointer; + typedef typename __node_base::const_pointer __node_base_const_pointer; +private: + typedef typename __node_base::base __end_node_t; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__end_node_t> +#else + rebind<__end_node_t>::other +#endif + __end_node_ptr; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const __end_node_t> +#else + rebind<const __end_node_t>::other +#endif + __end_node_const_ptr; + + __node_pointer __begin_node_; + __compressed_pair<__end_node_t, __node_allocator> __pair1_; + __compressed_pair<size_type, value_compare> __pair3_; + +public: + _LIBCPP_INLINE_VISIBILITY + __node_pointer __end_node() _NOEXCEPT + { + return static_cast<__node_pointer> + ( + pointer_traits<__end_node_ptr>::pointer_to(__pair1_.first()) + ); + } + _LIBCPP_INLINE_VISIBILITY + __node_const_pointer __end_node() const _NOEXCEPT + { + return static_cast<__node_const_pointer> + ( + pointer_traits<__end_node_const_ptr>::pointer_to(__pair1_.first()) + ); + } + _LIBCPP_INLINE_VISIBILITY + __node_allocator& __node_alloc() _NOEXCEPT {return __pair1_.second();} +private: + _LIBCPP_INLINE_VISIBILITY + const __node_allocator& __node_alloc() const _NOEXCEPT + {return __pair1_.second();} + _LIBCPP_INLINE_VISIBILITY + __node_pointer& __begin_node() _NOEXCEPT {return __begin_node_;} + _LIBCPP_INLINE_VISIBILITY + const __node_pointer& __begin_node() const _NOEXCEPT {return __begin_node_;} +public: + _LIBCPP_INLINE_VISIBILITY + allocator_type __alloc() const _NOEXCEPT + {return allocator_type(__node_alloc());} +private: + _LIBCPP_INLINE_VISIBILITY + size_type& size() _NOEXCEPT {return __pair3_.first();} +public: + _LIBCPP_INLINE_VISIBILITY + const size_type& size() const _NOEXCEPT {return __pair3_.first();} + _LIBCPP_INLINE_VISIBILITY + value_compare& value_comp() _NOEXCEPT {return __pair3_.second();} + _LIBCPP_INLINE_VISIBILITY + const value_compare& value_comp() const _NOEXCEPT + {return __pair3_.second();} +public: + _LIBCPP_INLINE_VISIBILITY + __node_pointer __root() _NOEXCEPT + {return static_cast<__node_pointer> (__end_node()->__left_);} + _LIBCPP_INLINE_VISIBILITY + __node_const_pointer __root() const _NOEXCEPT + {return static_cast<__node_const_pointer>(__end_node()->__left_);} + + typedef __tree_iterator<value_type, __node_pointer, difference_type> iterator; + typedef __tree_const_iterator<value_type, __node_const_pointer, difference_type> const_iterator; + + explicit __tree(const value_compare& __comp) + _NOEXCEPT_( + is_nothrow_default_constructible<__node_allocator>::value && + is_nothrow_copy_constructible<value_compare>::value); + explicit __tree(const allocator_type& __a); + __tree(const value_compare& __comp, const allocator_type& __a); + __tree(const __tree& __t); + __tree& operator=(const __tree& __t); + template <class _InputIterator> + void __assign_unique(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + void __assign_multi(_InputIterator __first, _InputIterator __last); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __tree(__tree&& __t) + _NOEXCEPT_( + is_nothrow_move_constructible<__node_allocator>::value && + is_nothrow_move_constructible<value_compare>::value); + __tree(__tree&& __t, const allocator_type& __a); + __tree& operator=(__tree&& __t) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<value_compare>::value && + is_nothrow_move_assignable<__node_allocator>::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + ~__tree(); + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return iterator(__begin_node());} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return const_iterator(__begin_node());} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return iterator(__end_node());} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return const_iterator(__end_node());} + + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + {return __node_traits::max_size(__node_alloc());} + + void clear() _NOEXCEPT; + + void swap(__tree& __t) + _NOEXCEPT_( + __is_nothrow_swappable<value_compare>::value && + (!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value)); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> + pair<iterator, bool> + __emplace_unique(_Args&&... __args); + template <class... _Args> + iterator + __emplace_multi(_Args&&... __args); + + template <class... _Args> + iterator + __emplace_hint_unique(const_iterator __p, _Args&&... __args); + template <class... _Args> + iterator + __emplace_hint_multi(const_iterator __p, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS + + template <class _Vp> + pair<iterator, bool> __insert_unique(_Vp&& __v); + template <class _Vp> + iterator __insert_unique(const_iterator __p, _Vp&& __v); + template <class _Vp> + iterator __insert_multi(_Vp&& __v); + template <class _Vp> + iterator __insert_multi(const_iterator __p, _Vp&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + pair<iterator, bool> __insert_unique(const value_type& __v); + iterator __insert_unique(const_iterator __p, const value_type& __v); + iterator __insert_multi(const value_type& __v); + iterator __insert_multi(const_iterator __p, const value_type& __v); + + pair<iterator, bool> __node_insert_unique(__node_pointer __nd); + iterator __node_insert_unique(const_iterator __p, + __node_pointer __nd); + + iterator __node_insert_multi(__node_pointer __nd); + iterator __node_insert_multi(const_iterator __p, __node_pointer __nd); + + iterator erase(const_iterator __p); + iterator erase(const_iterator __f, const_iterator __l); + template <class _Key> + size_type __erase_unique(const _Key& __k); + template <class _Key> + size_type __erase_multi(const _Key& __k); + + void __insert_node_at(__node_base_pointer __parent, + __node_base_pointer& __child, + __node_base_pointer __new_node); + + template <class _Key> + iterator find(const _Key& __v); + template <class _Key> + const_iterator find(const _Key& __v) const; + + template <class _Key> + size_type __count_unique(const _Key& __k) const; + template <class _Key> + size_type __count_multi(const _Key& __k) const; + + template <class _Key> + _LIBCPP_INLINE_VISIBILITY + iterator lower_bound(const _Key& __v) + {return __lower_bound(__v, __root(), __end_node());} + template <class _Key> + iterator __lower_bound(const _Key& __v, + __node_pointer __root, + __node_pointer __result); + template <class _Key> + _LIBCPP_INLINE_VISIBILITY + const_iterator lower_bound(const _Key& __v) const + {return __lower_bound(__v, __root(), __end_node());} + template <class _Key> + const_iterator __lower_bound(const _Key& __v, + __node_const_pointer __root, + __node_const_pointer __result) const; + template <class _Key> + _LIBCPP_INLINE_VISIBILITY + iterator upper_bound(const _Key& __v) + {return __upper_bound(__v, __root(), __end_node());} + template <class _Key> + iterator __upper_bound(const _Key& __v, + __node_pointer __root, + __node_pointer __result); + template <class _Key> + _LIBCPP_INLINE_VISIBILITY + const_iterator upper_bound(const _Key& __v) const + {return __upper_bound(__v, __root(), __end_node());} + template <class _Key> + const_iterator __upper_bound(const _Key& __v, + __node_const_pointer __root, + __node_const_pointer __result) const; + template <class _Key> + pair<iterator, iterator> + __equal_range_unique(const _Key& __k); + template <class _Key> + pair<const_iterator, const_iterator> + __equal_range_unique(const _Key& __k) const; + + template <class _Key> + pair<iterator, iterator> + __equal_range_multi(const _Key& __k); + template <class _Key> + pair<const_iterator, const_iterator> + __equal_range_multi(const _Key& __k) const; + + typedef __tree_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + + __node_holder remove(const_iterator __p) _NOEXCEPT; +private: + typename __node_base::pointer& + __find_leaf_low(typename __node_base::pointer& __parent, const value_type& __v); + typename __node_base::pointer& + __find_leaf_high(typename __node_base::pointer& __parent, const value_type& __v); + typename __node_base::pointer& + __find_leaf(const_iterator __hint, + typename __node_base::pointer& __parent, const value_type& __v); + template <class _Key> + typename __node_base::pointer& + __find_equal(typename __node_base::pointer& __parent, const _Key& __v); + template <class _Key> + typename __node_base::pointer& + __find_equal(const_iterator __hint, typename __node_base::pointer& __parent, + const _Key& __v); + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class ..._Args> + __node_holder __construct_node(_Args&& ...__args); +#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + __node_holder __construct_node(const value_type& __v); +#endif + + void destroy(__node_pointer __nd) _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __tree& __t) + {__copy_assign_alloc(__t, integral_constant<bool, + __node_traits::propagate_on_container_copy_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __tree& __t, true_type) + {__node_alloc() = __t.__node_alloc();} + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __tree& __t, false_type) {} + + void __move_assign(__tree& __t, false_type); + void __move_assign(__tree& __t, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value && + is_nothrow_move_assignable<__node_allocator>::value); + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__tree& __t) + _NOEXCEPT_( + !__node_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<__node_allocator>::value) + {__move_assign_alloc(__t, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__tree& __t, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) + {__node_alloc() = _VSTD::move(__t.__node_alloc());} + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__tree& __t, false_type) _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y) + _NOEXCEPT_( + !__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __node_traits::propagate_on_container_swap::value>());} + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<__node_allocator>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, false_type) + _NOEXCEPT + {} + + __node_pointer __detach(); + static __node_pointer __detach(__node_pointer); +}; + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp) + _NOEXCEPT_( + is_nothrow_default_constructible<__node_allocator>::value && + is_nothrow_copy_constructible<value_compare>::value) + : __pair3_(0, __comp) +{ + __begin_node() = __end_node(); +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(const allocator_type& __a) + : __pair1_(__node_allocator(__a)), + __begin_node_(__node_pointer()), + __pair3_(0) +{ + __begin_node() = __end_node(); +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp, + const allocator_type& __a) + : __pair1_(__node_allocator(__a)), + __begin_node_(__node_pointer()), + __pair3_(0, __comp) +{ + __begin_node() = __end_node(); +} + +// Precondition: size() != 0 +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_pointer +__tree<_Tp, _Compare, _Allocator>::__detach() +{ + __node_pointer __cache = __begin_node(); + __begin_node() = __end_node(); + __end_node()->__left_->__parent_ = nullptr; + __end_node()->__left_ = nullptr; + size() = 0; + // __cache->__left_ == nullptr + if (__cache->__right_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__right_); + // __cache->__left_ == nullptr + // __cache->__right_ == nullptr + return __cache; +} + +// Precondition: __cache != nullptr +// __cache->left_ == nullptr +// __cache->right_ == nullptr +// This is no longer a red-black tree +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_pointer +__tree<_Tp, _Compare, _Allocator>::__detach(__node_pointer __cache) +{ + if (__cache->__parent_ == nullptr) + return nullptr; + if (__tree_is_left_child(__cache)) + { + __cache->__parent_->__left_ = nullptr; + __cache = static_cast<__node_pointer>(__cache->__parent_); + if (__cache->__right_ == nullptr) + return __cache; + return static_cast<__node_pointer>(__tree_leaf(__cache->__right_)); + } + // __cache is right child + __cache->__parent_->__right_ = nullptr; + __cache = static_cast<__node_pointer>(__cache->__parent_); + if (__cache->__left_ == nullptr) + return __cache; + return static_cast<__node_pointer>(__tree_leaf(__cache->__left_)); +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>& +__tree<_Tp, _Compare, _Allocator>::operator=(const __tree& __t) +{ + if (this != &__t) + { + value_comp() = __t.value_comp(); + __copy_assign_alloc(__t); + __assign_multi(__t.begin(), __t.end()); + } + return *this; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _InputIterator> +void +__tree<_Tp, _Compare, _Allocator>::__assign_unique(_InputIterator __first, _InputIterator __last) +{ + if (size() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__value_ = *__first; + __node_pointer __next = __detach(__cache); + __node_insert_unique(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + if (__cache != nullptr) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + } + } + for (; __first != __last; ++__first) + __insert_unique(*__first); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _InputIterator> +void +__tree<_Tp, _Compare, _Allocator>::__assign_multi(_InputIterator __first, _InputIterator __last) +{ + if (size() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__value_ = *__first; + __node_pointer __next = __detach(__cache); + __node_insert_multi(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + if (__cache != nullptr) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + } + } + for (; __first != __last; ++__first) + __insert_multi(*__first); +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(const __tree& __t) + : __begin_node_(__node_pointer()), + __pair1_(__node_traits::select_on_container_copy_construction(__t.__node_alloc())), + __pair3_(0, __t.value_comp()) +{ + __begin_node() = __end_node(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t) + _NOEXCEPT_( + is_nothrow_move_constructible<__node_allocator>::value && + is_nothrow_move_constructible<value_compare>::value) + : __begin_node_(_VSTD::move(__t.__begin_node_)), + __pair1_(_VSTD::move(__t.__pair1_)), + __pair3_(_VSTD::move(__t.__pair3_)) +{ + if (size() == 0) + __begin_node() = __end_node(); + else + { + __end_node()->__left_->__parent_ = __end_node(); + __t.__begin_node() = __t.__end_node(); + __t.__end_node()->__left_ = nullptr; + __t.size() = 0; + } +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t, const allocator_type& __a) + : __pair1_(__node_allocator(__a)), + __pair3_(0, _VSTD::move(__t.value_comp())) +{ + if (__a == __t.__alloc()) + { + if (__t.size() == 0) + __begin_node() = __end_node(); + else + { + __begin_node() = __t.__begin_node(); + __end_node()->__left_ = __t.__end_node()->__left_; + __end_node()->__left_->__parent_ = __end_node(); + size() = __t.size(); + __t.__begin_node() = __t.__end_node(); + __t.__end_node()->__left_ = nullptr; + __t.size() = 0; + } + } + else + { + __begin_node() = __end_node(); + } +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value && + is_nothrow_move_assignable<__node_allocator>::value) +{ + destroy(static_cast<__node_pointer>(__end_node()->__left_)); + __begin_node_ = __t.__begin_node_; + __pair1_.first() = __t.__pair1_.first(); + __move_assign_alloc(__t); + __pair3_ = _VSTD::move(__t.__pair3_); + if (size() == 0) + __begin_node() = __end_node(); + else + { + __end_node()->__left_->__parent_ = __end_node(); + __t.__begin_node() = __t.__end_node(); + __t.__end_node()->__left_ = nullptr; + __t.size() = 0; + } +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, false_type) +{ + if (__node_alloc() == __t.__node_alloc()) + __move_assign(__t, true_type()); + else + { + value_comp() = _VSTD::move(__t.value_comp()); + const_iterator __e = end(); + if (size() != 0) + { + __node_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + while (__cache != nullptr && __t.size() != 0) + { + __cache->__value_ = _VSTD::move(__t.remove(__t.begin())->__value_); + __node_pointer __next = __detach(__cache); + __node_insert_multi(__cache); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + if (__cache != nullptr) + { + while (__cache->__parent_ != nullptr) + __cache = static_cast<__node_pointer>(__cache->__parent_); + destroy(__cache); + } + } + while (__t.size() != 0) + __insert_multi(__e, _VSTD::move(__t.remove(__t.begin())->__value_)); + } +} + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>& +__tree<_Tp, _Compare, _Allocator>::operator=(__tree&& __t) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<value_compare>::value && + is_nothrow_move_assignable<__node_allocator>::value) + +{ + __move_assign(__t, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Compare, class _Allocator> +__tree<_Tp, _Compare, _Allocator>::~__tree() +{ + destroy(__root()); +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::destroy(__node_pointer __nd) _NOEXCEPT +{ + if (__nd != nullptr) + { + destroy(static_cast<__node_pointer>(__nd->__left_)); + destroy(static_cast<__node_pointer>(__nd->__right_)); + __node_allocator& __na = __node_alloc(); + __node_traits::destroy(__na, _VSTD::addressof(__nd->__value_)); + __node_traits::deallocate(__na, __nd, 1); + } +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::swap(__tree& __t) + _NOEXCEPT_( + __is_nothrow_swappable<value_compare>::value && + (!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value)) +{ + using _VSTD::swap; + swap(__begin_node_, __t.__begin_node_); + swap(__pair1_.first(), __t.__pair1_.first()); + __swap_alloc(__node_alloc(), __t.__node_alloc()); + __pair3_.swap(__t.__pair3_); + if (size() == 0) + __begin_node() = __end_node(); + else + __end_node()->__left_->__parent_ = __end_node(); + if (__t.size() == 0) + __t.__begin_node() = __t.__end_node(); + else + __t.__end_node()->__left_->__parent_ = __t.__end_node(); +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::clear() _NOEXCEPT +{ + destroy(__root()); + size() = 0; + __begin_node() = __end_node(); + __end_node()->__left_ = nullptr; +} + +// Find lower_bound place to insert +// Set __parent to parent of null leaf +// Return reference to null leaf +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_base::pointer& +__tree<_Tp, _Compare, _Allocator>::__find_leaf_low(typename __node_base::pointer& __parent, + const value_type& __v) +{ + __node_pointer __nd = __root(); + if (__nd != nullptr) + { + while (true) + { + if (value_comp()(__nd->__value_, __v)) + { + if (__nd->__right_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__right_); + else + { + __parent = __nd; + return __parent->__right_; + } + } + else + { + if (__nd->__left_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__left_); + else + { + __parent = __nd; + return __parent->__left_; + } + } + } + } + __parent = __end_node(); + return __parent->__left_; +} + +// Find upper_bound place to insert +// Set __parent to parent of null leaf +// Return reference to null leaf +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_base::pointer& +__tree<_Tp, _Compare, _Allocator>::__find_leaf_high(typename __node_base::pointer& __parent, + const value_type& __v) +{ + __node_pointer __nd = __root(); + if (__nd != nullptr) + { + while (true) + { + if (value_comp()(__v, __nd->__value_)) + { + if (__nd->__left_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__left_); + else + { + __parent = __nd; + return __parent->__left_; + } + } + else + { + if (__nd->__right_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__right_); + else + { + __parent = __nd; + return __parent->__right_; + } + } + } + } + __parent = __end_node(); + return __parent->__left_; +} + +// Find leaf place to insert closest to __hint +// First check prior to __hint. +// Next check after __hint. +// Next do O(log N) search. +// Set __parent to parent of null leaf +// Return reference to null leaf +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_base::pointer& +__tree<_Tp, _Compare, _Allocator>::__find_leaf(const_iterator __hint, + typename __node_base::pointer& __parent, + const value_type& __v) +{ + if (__hint == end() || !value_comp()(*__hint, __v)) // check before + { + // __v <= *__hint + const_iterator __prior = __hint; + if (__prior == begin() || !value_comp()(__v, *--__prior)) + { + // *prev(__hint) <= __v <= *__hint + if (__hint.__ptr_->__left_ == nullptr) + { + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent->__left_; + } + else + { + __parent = const_cast<__node_pointer&>(__prior.__ptr_); + return __parent->__right_; + } + } + // __v < *prev(__hint) + return __find_leaf_high(__parent, __v); + } + // else __v > *__hint + return __find_leaf_low(__parent, __v); +} + +// Find place to insert if __v doesn't exist +// Set __parent to parent of null leaf +// Return reference to null leaf +// If __v exists, set parent to node of __v and return reference to node of __v +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::__node_base::pointer& +__tree<_Tp, _Compare, _Allocator>::__find_equal(typename __node_base::pointer& __parent, + const _Key& __v) +{ + __node_pointer __nd = __root(); + if (__nd != nullptr) + { + while (true) + { + if (value_comp()(__v, __nd->__value_)) + { + if (__nd->__left_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__left_); + else + { + __parent = __nd; + return __parent->__left_; + } + } + else if (value_comp()(__nd->__value_, __v)) + { + if (__nd->__right_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__right_); + else + { + __parent = __nd; + return __parent->__right_; + } + } + else + { + __parent = __nd; + return __parent; + } + } + } + __parent = __end_node(); + return __parent->__left_; +} + +// Find place to insert if __v doesn't exist +// First check prior to __hint. +// Next check after __hint. +// Next do O(log N) search. +// Set __parent to parent of null leaf +// Return reference to null leaf +// If __v exists, set parent to node of __v and return reference to node of __v +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::__node_base::pointer& +__tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint, + typename __node_base::pointer& __parent, + const _Key& __v) +{ + if (__hint == end() || value_comp()(__v, *__hint)) // check before + { + // __v < *__hint + const_iterator __prior = __hint; + if (__prior == begin() || value_comp()(*--__prior, __v)) + { + // *prev(__hint) < __v < *__hint + if (__hint.__ptr_->__left_ == nullptr) + { + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent->__left_; + } + else + { + __parent = const_cast<__node_pointer&>(__prior.__ptr_); + return __parent->__right_; + } + } + // __v <= *prev(__hint) + return __find_equal(__parent, __v); + } + else if (value_comp()(*__hint, __v)) // check after + { + // *__hint < __v + const_iterator __next = _VSTD::next(__hint); + if (__next == end() || value_comp()(__v, *__next)) + { + // *__hint < __v < *_VSTD::next(__hint) + if (__hint.__ptr_->__right_ == nullptr) + { + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent->__right_; + } + else + { + __parent = const_cast<__node_pointer&>(__next.__ptr_); + return __parent->__left_; + } + } + // *next(__hint) <= __v + return __find_equal(__parent, __v); + } + // else __v == *__hint + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent; +} + +template <class _Tp, class _Compare, class _Allocator> +void +__tree<_Tp, _Compare, _Allocator>::__insert_node_at(__node_base_pointer __parent, + __node_base_pointer& __child, + __node_base_pointer __new_node) +{ + __new_node->__left_ = nullptr; + __new_node->__right_ = nullptr; + __new_node->__parent_ = __parent; + __child = __new_node; + if (__begin_node()->__left_ != nullptr) + __begin_node() = static_cast<__node_pointer>(__begin_node()->__left_); + __tree_balance_after_insert(__end_node()->__left_, __child); + ++size(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Compare, class _Allocator> +template <class ..._Args> +typename __tree<_Tp, _Compare, _Allocator>::__node_holder +__tree<_Tp, _Compare, _Allocator>::__construct_node(_Args&& ...__args) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__value_constructed = true; + return __h; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class... _Args> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> +__tree<_Tp, _Compare, _Allocator>::__emplace_unique(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__parent, __h->__value_); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) + { + __insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + __inserted = true; + } + return pair<iterator, bool>(iterator(__r), __inserted); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class... _Args> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique(const_iterator __p, _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__p, __parent, __h->__value_); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) + { + __insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + } + return iterator(__r); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class... _Args> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_); + __insert_node_at(__parent, __child, __h.get()); + return iterator(static_cast<__node_pointer>(__h.release())); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class... _Args> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p, + _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_); + __insert_node_at(__parent, __child, __h.get()); + return iterator(static_cast<__node_pointer>(__h.release())); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Compare, class _Allocator> +template <class _Vp> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> +__tree<_Tp, _Compare, _Allocator>::__insert_unique(_Vp&& __v) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v)); + pair<iterator, bool> __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Vp> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, _Vp&& __v) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v)); + iterator __r = __node_insert_unique(__p, __h.get()); + if (__r.__ptr_ == __h.get()) + __h.release(); + return __r; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Vp> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_multi(_Vp&& __v) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v)); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf_high(__parent, __h->__value_); + __insert_node_at(__parent, __child, __h.get()); + return iterator(__h.release()); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Vp> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, _Vp&& __v) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Vp>(__v)); + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf(__p, __parent, __h->__value_); + __insert_node_at(__parent, __child, __h.get()); + return iterator(__h.release()); +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_holder +__tree<_Tp, _Compare, _Allocator>::__construct_node(const value_type& __v) +{ + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), __v); + __h.get_deleter().__value_constructed = true; + return _VSTD::move(__h); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Compare, class _Allocator> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> +__tree<_Tp, _Compare, _Allocator>::__insert_unique(const value_type& __v) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__parent, __v); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) + { + __node_holder __h = __construct_node(__v); + __insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + __inserted = true; + } + return pair<iterator, bool>(iterator(__r), __inserted); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, const value_type& __v) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__p, __parent, __v); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) + { + __node_holder __h = __construct_node(__v); + __insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + } + return iterator(__r); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_multi(const value_type& __v) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf_high(__parent, __v); + __node_holder __h = __construct_node(__v); + __insert_node_at(__parent, __child, __h.get()); + return iterator(__h.release()); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const value_type& __v) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf(__p, __parent, __v); + __node_holder __h = __construct_node(__v); + __insert_node_at(__parent, __child, __h.get()); + return iterator(__h.release()); +} + +template <class _Tp, class _Compare, class _Allocator> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool> +__tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__parent, __nd->__value_); + __node_pointer __r = static_cast<__node_pointer>(__child); + bool __inserted = false; + if (__child == nullptr) + { + __insert_node_at(__parent, __child, __nd); + __r = __nd; + __inserted = true; + } + return pair<iterator, bool>(iterator(__r), __inserted); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__node_insert_unique(const_iterator __p, + __node_pointer __nd) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal(__p, __parent, __nd->__value_); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) + { + __insert_node_at(__parent, __child, __nd); + __r = __nd; + } + return iterator(__r); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf_high(__parent, __nd->__value_); + __insert_node_at(__parent, __child, __nd); + return iterator(__nd); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p, + __node_pointer __nd) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_leaf(__p, __parent, __nd->__value_); + __insert_node_at(__parent, __child, __nd); + return iterator(__nd); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __p) +{ + __node_pointer __np = const_cast<__node_pointer>(__p.__ptr_); + iterator __r(__np); + ++__r; + if (__begin_node() == __np) + __begin_node() = __r.__ptr_; + --size(); + __node_allocator& __na = __node_alloc(); + __node_traits::destroy(__na, const_cast<value_type*>(_VSTD::addressof(*__p))); + __tree_remove(__end_node()->__left_, + static_cast<__node_base_pointer>(__np)); + __node_traits::deallocate(__na, __np, 1); + return __r; +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::erase(const_iterator __f, const_iterator __l) +{ + while (__f != __l) + __f = erase(__f); + return iterator(const_cast<__node_pointer>(__l.__ptr_)); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::size_type +__tree<_Tp, _Compare, _Allocator>::__erase_unique(const _Key& __k) +{ + iterator __i = find(__k); + if (__i == end()) + return 0; + erase(__i); + return 1; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::size_type +__tree<_Tp, _Compare, _Allocator>::__erase_multi(const _Key& __k) +{ + pair<iterator, iterator> __p = __equal_range_multi(__k); + size_type __r = 0; + for (; __p.first != __p.second; ++__r) + __p.first = erase(__p.first); + return __r; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) +{ + iterator __p = __lower_bound(__v, __root(), __end_node()); + if (__p != end() && !value_comp()(__v, *__p)) + return __p; + return end(); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::const_iterator +__tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) const +{ + const_iterator __p = __lower_bound(__v, __root(), __end_node()); + if (__p != end() && !value_comp()(__v, *__p)) + return __p; + return end(); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::size_type +__tree<_Tp, _Compare, _Allocator>::__count_unique(const _Key& __k) const +{ + __node_const_pointer __result = __end_node(); + __node_const_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_const_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_const_pointer>(__rt->__right_); + else + return 1; + } + return 0; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::size_type +__tree<_Tp, _Compare, _Allocator>::__count_multi(const _Key& __k) const +{ + typedef pair<const_iterator, const_iterator> _Pp; + __node_const_pointer __result = __end_node(); + __node_const_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_const_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_const_pointer>(__rt->__right_); + else + return _VSTD::distance( + __lower_bound(__k, static_cast<__node_const_pointer>(__rt->__left_), __rt), + __upper_bound(__k, static_cast<__node_const_pointer>(__rt->__right_), __result) + ); + } + return 0; +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v, + __node_pointer __root, + __node_pointer __result) +{ + while (__root != nullptr) + { + if (!value_comp()(__root->__value_, __v)) + { + __result = __root; + __root = static_cast<__node_pointer>(__root->__left_); + } + else + __root = static_cast<__node_pointer>(__root->__right_); + } + return iterator(__result); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::const_iterator +__tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v, + __node_const_pointer __root, + __node_const_pointer __result) const +{ + while (__root != nullptr) + { + if (!value_comp()(__root->__value_, __v)) + { + __result = __root; + __root = static_cast<__node_const_pointer>(__root->__left_); + } + else + __root = static_cast<__node_const_pointer>(__root->__right_); + } + return const_iterator(__result); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::iterator +__tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v, + __node_pointer __root, + __node_pointer __result) +{ + while (__root != nullptr) + { + if (value_comp()(__v, __root->__value_)) + { + __result = __root; + __root = static_cast<__node_pointer>(__root->__left_); + } + else + __root = static_cast<__node_pointer>(__root->__right_); + } + return iterator(__result); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +typename __tree<_Tp, _Compare, _Allocator>::const_iterator +__tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v, + __node_const_pointer __root, + __node_const_pointer __result) const +{ + while (__root != nullptr) + { + if (value_comp()(__v, __root->__value_)) + { + __result = __root; + __root = static_cast<__node_const_pointer>(__root->__left_); + } + else + __root = static_cast<__node_const_pointer>(__root->__right_); + } + return const_iterator(__result); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, + typename __tree<_Tp, _Compare, _Allocator>::iterator> +__tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) +{ + typedef pair<iterator, iterator> _Pp; + __node_pointer __result = __end_node(); + __node_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_pointer>(__rt->__right_); + else + return _Pp(iterator(__rt), + iterator( + __rt->__right_ != nullptr ? + static_cast<__node_pointer>(__tree_min(__rt->__right_)) + : __result)); + } + return _Pp(iterator(__result), iterator(__result)); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator, + typename __tree<_Tp, _Compare, _Allocator>::const_iterator> +__tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) const +{ + typedef pair<const_iterator, const_iterator> _Pp; + __node_const_pointer __result = __end_node(); + __node_const_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_const_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_const_pointer>(__rt->__right_); + else + return _Pp(const_iterator(__rt), + const_iterator( + __rt->__right_ != nullptr ? + static_cast<__node_const_pointer>(__tree_min(__rt->__right_)) + : __result)); + } + return _Pp(const_iterator(__result), const_iterator(__result)); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, + typename __tree<_Tp, _Compare, _Allocator>::iterator> +__tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) +{ + typedef pair<iterator, iterator> _Pp; + __node_pointer __result = __end_node(); + __node_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_pointer>(__rt->__right_); + else + return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), __rt), + __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)); + } + return _Pp(iterator(__result), iterator(__result)); +} + +template <class _Tp, class _Compare, class _Allocator> +template <class _Key> +pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator, + typename __tree<_Tp, _Compare, _Allocator>::const_iterator> +__tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) const +{ + typedef pair<const_iterator, const_iterator> _Pp; + __node_const_pointer __result = __end_node(); + __node_const_pointer __rt = __root(); + while (__rt != nullptr) + { + if (value_comp()(__k, __rt->__value_)) + { + __result = __rt; + __rt = static_cast<__node_const_pointer>(__rt->__left_); + } + else if (value_comp()(__rt->__value_, __k)) + __rt = static_cast<__node_const_pointer>(__rt->__right_); + else + return _Pp(__lower_bound(__k, static_cast<__node_const_pointer>(__rt->__left_), __rt), + __upper_bound(__k, static_cast<__node_const_pointer>(__rt->__right_), __result)); + } + return _Pp(const_iterator(__result), const_iterator(__result)); +} + +template <class _Tp, class _Compare, class _Allocator> +typename __tree<_Tp, _Compare, _Allocator>::__node_holder +__tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT +{ + __node_pointer __np = const_cast<__node_pointer>(__p.__ptr_); + if (__begin_node() == __np) + { + if (__np->__right_ != nullptr) + __begin_node() = static_cast<__node_pointer>(__np->__right_); + else + __begin_node() = static_cast<__node_pointer>(__np->__parent_); + } + --size(); + __tree_remove(__end_node()->__left_, + static_cast<__node_base_pointer>(__np)); + return __node_holder(__np, _Dp(__node_alloc())); +} + +template <class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__tree<_Tp, _Compare, _Allocator>& __x, + __tree<_Tp, _Compare, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___TREE diff --git a/contrib/libc++/include/__tuple b/contrib/libc++/include/__tuple new file mode 100644 index 0000000..3b2be1c --- /dev/null +++ b/contrib/libc++/include/__tuple @@ -0,0 +1,269 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___TUPLE +#define _LIBCPP___TUPLE + +#include <__config> +#include <cstddef> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifdef _LIBCPP_HAS_NO_VARIADICS + +#include <__tuple_03> + +#else // _LIBCPP_HAS_NO_VARIADICS + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp> class _LIBCPP_VISIBLE tuple_size; + +template <class _Tp> +class _LIBCPP_VISIBLE tuple_size<const _Tp> + : public tuple_size<_Tp> {}; + +template <class _Tp> +class _LIBCPP_VISIBLE tuple_size<volatile _Tp> + : public tuple_size<_Tp> {}; + +template <class _Tp> +class _LIBCPP_VISIBLE tuple_size<const volatile _Tp> + : public tuple_size<_Tp> {}; + +template <size_t _Ip, class _Tp> class _LIBCPP_VISIBLE tuple_element; + +template <size_t _Ip, class _Tp> +class _LIBCPP_VISIBLE tuple_element<_Ip, const _Tp> +{ +public: + typedef typename add_const<typename tuple_element<_Ip, _Tp>::type>::type type; +}; + +template <size_t _Ip, class _Tp> +class _LIBCPP_VISIBLE tuple_element<_Ip, volatile _Tp> +{ +public: + typedef typename add_volatile<typename tuple_element<_Ip, _Tp>::type>::type type; +}; + +template <size_t _Ip, class _Tp> +class _LIBCPP_VISIBLE tuple_element<_Ip, const volatile _Tp> +{ +public: + typedef typename add_cv<typename tuple_element<_Ip, _Tp>::type>::type type; +}; + +template <class ..._Tp> class _LIBCPP_VISIBLE tuple; +template <class _T1, class _T2> struct _LIBCPP_VISIBLE pair; +template <class _Tp, size_t _Size> struct _LIBCPP_VISIBLE array; + +template <class _Tp> struct __tuple_like : false_type {}; + +template <class _Tp> struct __tuple_like<const _Tp> : public __tuple_like<_Tp> {}; +template <class _Tp> struct __tuple_like<volatile _Tp> : public __tuple_like<_Tp> {}; +template <class _Tp> struct __tuple_like<const volatile _Tp> : public __tuple_like<_Tp> {}; + +template <class... _Tp> struct __tuple_like<tuple<_Tp...> > : true_type {}; +template <class _T1, class _T2> struct __tuple_like<pair<_T1, _T2> > : true_type {}; +template <class _Tp, size_t _Size> struct __tuple_like<array<_Tp, _Size> > : true_type {}; + +template <size_t _Ip, class ..._Tp> +typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(tuple<_Tp...>&) _NOEXCEPT; + +template <size_t _Ip, class ..._Tp> +const typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(const tuple<_Tp...>&) _NOEXCEPT; + +template <size_t _Ip, class ..._Tp> +typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(tuple<_Tp...>&&) _NOEXCEPT; + +template <size_t _Ip, class _T1, class _T2> +typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(pair<_T1, _T2>&) _NOEXCEPT; + +template <size_t _Ip, class _T1, class _T2> +const typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(const pair<_T1, _T2>&) _NOEXCEPT; + +template <size_t _Ip, class _T1, class _T2> +typename tuple_element<_Ip, pair<_T1, _T2> >::type&& +get(pair<_T1, _T2>&&) _NOEXCEPT; + +template <size_t _Ip, class _Tp, size_t _Size> +_Tp& +get(array<_Tp, _Size>&) _NOEXCEPT; + +template <size_t _Ip, class _Tp, size_t _Size> +const _Tp& +get(const array<_Tp, _Size>&) _NOEXCEPT; + +template <size_t _Ip, class _Tp, size_t _Size> +_Tp&& +get(array<_Tp, _Size>&&) _NOEXCEPT; + +// __make_tuple_indices + +template <size_t...> struct __tuple_indices {}; + +template <size_t _Sp, class _IntTuple, size_t _Ep> +struct __make_indices_imp; + +template <size_t _Sp, size_t ..._Indices, size_t _Ep> +struct __make_indices_imp<_Sp, __tuple_indices<_Indices...>, _Ep> +{ + typedef typename __make_indices_imp<_Sp+1, __tuple_indices<_Indices..., _Sp>, _Ep>::type type; +}; + +template <size_t _Ep, size_t ..._Indices> +struct __make_indices_imp<_Ep, __tuple_indices<_Indices...>, _Ep> +{ + typedef __tuple_indices<_Indices...> type; +}; + +template <size_t _Ep, size_t _Sp = 0> +struct __make_tuple_indices +{ + static_assert(_Sp <= _Ep, "__make_tuple_indices input error"); + typedef typename __make_indices_imp<_Sp, __tuple_indices<>, _Ep>::type type; +}; + +// __tuple_types + +template <class ..._Tp> struct __tuple_types {}; + +template <size_t _Ip> +class _LIBCPP_VISIBLE tuple_element<_Ip, __tuple_types<> > +{ +public: + static_assert(_Ip == 0, "tuple_element index out of range"); + static_assert(_Ip != 0, "tuple_element index out of range"); +}; + +template <class _Hp, class ..._Tp> +class _LIBCPP_VISIBLE tuple_element<0, __tuple_types<_Hp, _Tp...> > +{ +public: + typedef _Hp type; +}; + +template <size_t _Ip, class _Hp, class ..._Tp> +class _LIBCPP_VISIBLE tuple_element<_Ip, __tuple_types<_Hp, _Tp...> > +{ +public: + typedef typename tuple_element<_Ip-1, __tuple_types<_Tp...> >::type type; +}; + +template <class ..._Tp> +class _LIBCPP_VISIBLE tuple_size<__tuple_types<_Tp...> > + : public integral_constant<size_t, sizeof...(_Tp)> +{ +}; + +template <class... _Tp> struct __tuple_like<__tuple_types<_Tp...> > : true_type {}; + +// __make_tuple_types + +// __make_tuple_types<_Tuple<_Types...>, _Ep, _Sp>::type is a +// __tuple_types<_Types...> using only those _Types in the range [_Sp, _Ep). +// _Sp defaults to 0 and _Ep defaults to tuple_size<_Tuple>. If _Tuple is a +// lvalue_reference type, then __tuple_types<_Types&...> is the result. + +template <class _TupleTypes, class _Tp, size_t _Sp, size_t _Ep> +struct __make_tuple_types_imp; + +template <class ..._Types, class _Tp, size_t _Sp, size_t _Ep> +struct __make_tuple_types_imp<__tuple_types<_Types...>, _Tp, _Sp, _Ep> +{ + typedef typename remove_reference<_Tp>::type _Tpr; + typedef typename __make_tuple_types_imp<__tuple_types<_Types..., + typename conditional<is_lvalue_reference<_Tp>::value, + typename tuple_element<_Sp, _Tpr>::type&, + typename tuple_element<_Sp, _Tpr>::type>::type>, + _Tp, _Sp+1, _Ep>::type type; +}; + +template <class ..._Types, class _Tp, size_t _Ep> +struct __make_tuple_types_imp<__tuple_types<_Types...>, _Tp, _Ep, _Ep> +{ + typedef __tuple_types<_Types...> type; +}; + +template <class _Tp, size_t _Ep = tuple_size<typename remove_reference<_Tp>::type>::value, size_t _Sp = 0> +struct __make_tuple_types +{ + static_assert(_Sp <= _Ep, "__make_tuple_types input error"); + typedef typename __make_tuple_types_imp<__tuple_types<>, _Tp, _Sp, _Ep>::type type; +}; + +// __tuple_convertible + +template <bool, class _Tp, class _Up> +struct __tuple_convertible_imp : public false_type {}; + +template <class _Tp0, class ..._Tp, class _Up0, class ..._Up> +struct __tuple_convertible_imp<true, __tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> > + : public integral_constant<bool, + is_constructible<_Up0, _Tp0>::value && + __tuple_convertible_imp<true, __tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {}; + +template <> +struct __tuple_convertible_imp<true, __tuple_types<>, __tuple_types<> > + : public true_type {}; + +template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value, + bool = __tuple_like<_Up>::value> +struct __tuple_convertible + : public false_type {}; + +template <class _Tp, class _Up> +struct __tuple_convertible<_Tp, _Up, true, true> + : public __tuple_convertible_imp<tuple_size<typename remove_reference<_Tp>::type>::value == + tuple_size<_Up>::value, + typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type> +{}; + +// __tuple_assignable + +template <bool, class _Tp, class _Up> +struct __tuple_assignable_imp : public false_type {}; + +template <class _Tp0, class ..._Tp, class _Up0, class ..._Up> +struct __tuple_assignable_imp<true, __tuple_types<_Tp0, _Tp...>, __tuple_types<_Up0, _Up...> > + : public integral_constant<bool, + is_assignable<_Up0&, _Tp0>::value && + __tuple_assignable_imp<true, __tuple_types<_Tp...>, __tuple_types<_Up...> >::value> {}; + +template <> +struct __tuple_assignable_imp<true, __tuple_types<>, __tuple_types<> > + : public true_type {}; + +template <class _Tp, class _Up, bool = __tuple_like<typename remove_reference<_Tp>::type>::value, + bool = __tuple_like<_Up>::value> +struct __tuple_assignable + : public false_type {}; + +template <class _Tp, class _Up> +struct __tuple_assignable<_Tp, _Up, true, true> + : public __tuple_assignable_imp<tuple_size<typename remove_reference<_Tp>::type>::value == + tuple_size<_Up>::value, + typename __make_tuple_types<_Tp>::type, typename __make_tuple_types<_Up>::type> +{}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP___TUPLE diff --git a/contrib/libc++/include/__tuple_03 b/contrib/libc++/include/__tuple_03 new file mode 100644 index 0000000..a28ac08 --- /dev/null +++ b/contrib/libc++/include/__tuple_03 @@ -0,0 +1,27 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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___TUPLE_03 +#define _LIBCPP___TUPLE_03 + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp> class _LIBCPP_VISIBLE tuple_size; +template <size_t _Ip, class _Tp> class _LIBCPP_VISIBLE tuple_element; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___TUPLE_03 diff --git a/contrib/libc++/include/__undef_min_max b/contrib/libc++/include/__undef_min_max new file mode 100644 index 0000000..88bc53f --- /dev/null +++ b/contrib/libc++/include/__undef_min_max @@ -0,0 +1,19 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#ifdef min +#warning: macro min is incompatible with C++. #undef'ing min +#undef min +#endif + +#ifdef max +#warning: macro max is incompatible with C++. #undef'ing max +#undef max +#endif diff --git a/contrib/libc++/include/algorithm b/contrib/libc++/include/algorithm new file mode 100644 index 0000000..f9c6843 --- /dev/null +++ b/contrib/libc++/include/algorithm @@ -0,0 +1,5396 @@ +// -*- C++ -*- +//===-------------------------- algorithm ---------------------------------===// +// +// 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_ALGORITHM +#define _LIBCPP_ALGORITHM + +/* + algorithm synopsis + +#include <initializer_list> + +namespace std +{ + +template <class InputIterator, class Predicate> + bool + all_of(InputIterator first, InputIterator last, Predicate pred); + +template <class InputIterator, class Predicate> + bool + any_of(InputIterator first, InputIterator last, Predicate pred); + +template <class InputIterator, class Predicate> + bool + none_of(InputIterator first, InputIterator last, Predicate pred); + +template <class InputIterator, class Function> + Function + for_each(InputIterator first, InputIterator last, Function f); + +template <class InputIterator, class T> + InputIterator + find(InputIterator first, InputIterator last, const T& value); + +template <class InputIterator, class Predicate> + InputIterator + find_if(InputIterator first, InputIterator last, Predicate pred); + +template<class InputIterator, class Predicate> + InputIterator + find_if_not(InputIterator first, InputIterator last, Predicate pred); + +template <class ForwardIterator1, class ForwardIterator2> + ForwardIterator1 + find_end(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2); + +template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> + ForwardIterator1 + find_end(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); + +template <class ForwardIterator1, class ForwardIterator2> + ForwardIterator1 + find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2); + +template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> + ForwardIterator1 + find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); + +template <class ForwardIterator> + ForwardIterator + adjacent_find(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class BinaryPredicate> + ForwardIterator + adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); + +template <class InputIterator, class T> + typename iterator_traits<InputIterator>::difference_type + count(InputIterator first, InputIterator last, const T& value); + +template <class InputIterator, class Predicate> + typename iterator_traits<InputIterator>::difference_type + count_if(InputIterator first, InputIterator last, Predicate pred); + +template <class InputIterator1, class InputIterator2> + pair<InputIterator1, InputIterator2> + mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); + +template <class InputIterator1, class InputIterator2, class BinaryPredicate> + pair<InputIterator1, InputIterator2> + mismatch(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, BinaryPredicate pred); + +template <class InputIterator1, class InputIterator2> + bool + equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); + +template <class InputIterator1, class InputIterator2, class BinaryPredicate> + bool + equal(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, BinaryPredicate pred); + +template<class ForwardIterator1, class ForwardIterator2> + bool + is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2); + +template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> + bool + is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, BinaryPredicate pred); + +template <class ForwardIterator1, class ForwardIterator2> + ForwardIterator1 + search(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2); + +template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> + ForwardIterator1 + search(ForwardIterator1 first1, ForwardIterator1 last1, + ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); + +template <class ForwardIterator, class Size, class T> + ForwardIterator + search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); + +template <class ForwardIterator, class Size, class T, class BinaryPredicate> + ForwardIterator + search_n(ForwardIterator first, ForwardIterator last, + Size count, const T& value, BinaryPredicate pred); + +template <class InputIterator, class OutputIterator> + OutputIterator + copy(InputIterator first, InputIterator last, OutputIterator result); + +template<class InputIterator, class OutputIterator, class Predicate> + OutputIterator + copy_if(InputIterator first, InputIterator last, + OutputIterator result, Predicate pred); + +template<class InputIterator, class Size, class OutputIterator> + OutputIterator + copy_n(InputIterator first, Size n, OutputIterator result); + +template <class BidirectionalIterator1, class BidirectionalIterator2> + BidirectionalIterator2 + copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, + BidirectionalIterator2 result); + +template <class ForwardIterator1, class ForwardIterator2> + ForwardIterator2 + swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); + +template <class ForwardIterator1, class ForwardIterator2> + void + iter_swap(ForwardIterator1 a, ForwardIterator2 b); + +template <class InputIterator, class OutputIterator, class UnaryOperation> + OutputIterator + transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> + OutputIterator + transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, + OutputIterator result, BinaryOperation binary_op); + +template <class ForwardIterator, class T> + void + replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); + +template <class ForwardIterator, class Predicate, class T> + void + replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); + +template <class InputIterator, class OutputIterator, class T> + OutputIterator + replace_copy(InputIterator first, InputIterator last, OutputIterator result, + const T& old_value, const T& new_value); + +template <class InputIterator, class OutputIterator, class Predicate, class T> + OutputIterator + replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); + +template <class ForwardIterator, class T> + void + fill(ForwardIterator first, ForwardIterator last, const T& value); + +template <class OutputIterator, class Size, class T> + OutputIterator + fill_n(OutputIterator first, Size n, const T& value); + +template <class ForwardIterator, class Generator> + void + generate(ForwardIterator first, ForwardIterator last, Generator gen); + +template <class OutputIterator, class Size, class Generator> + OutputIterator + generate_n(OutputIterator first, Size n, Generator gen); + +template <class ForwardIterator, class T> + ForwardIterator + remove(ForwardIterator first, ForwardIterator last, const T& value); + +template <class ForwardIterator, class Predicate> + ForwardIterator + remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); + +template <class InputIterator, class OutputIterator, class T> + OutputIterator + remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); + +template <class InputIterator, class OutputIterator, class Predicate> + OutputIterator + remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); + +template <class ForwardIterator> + ForwardIterator + unique(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class BinaryPredicate> + ForwardIterator + unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); + +template <class InputIterator, class OutputIterator> + OutputIterator + unique_copy(InputIterator first, InputIterator last, OutputIterator result); + +template <class InputIterator, class OutputIterator, class BinaryPredicate> + OutputIterator + unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); + +template <class BidirectionalIterator> + void + reverse(BidirectionalIterator first, BidirectionalIterator last); + +template <class BidirectionalIterator, class OutputIterator> + OutputIterator + reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); + +template <class ForwardIterator> + ForwardIterator + rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); + +template <class ForwardIterator, class OutputIterator> + OutputIterator + rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); + +template <class RandomAccessIterator> + void + random_shuffle(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class RandomNumberGenerator> + void + random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand); + +template<class RandomAccessIterator, class UniformRandomNumberGenerator> + void shuffle(RandomAccessIterator first, RandomAccessIterator last, + UniformRandomNumberGenerator&& g); + +template <class InputIterator, class Predicate> + bool + is_partitioned(InputIterator first, InputIterator last, Predicate pred); + +template <class ForwardIterator, class Predicate> + ForwardIterator + partition(ForwardIterator first, ForwardIterator last, Predicate pred); + +template <class InputIterator, class OutputIterator1, + class OutputIterator2, class Predicate> + pair<OutputIterator1, OutputIterator2> + partition_copy(InputIterator first, InputIterator last, + OutputIterator1 out_true, OutputIterator2 out_false, + Predicate pred); + +template <class ForwardIterator, class Predicate> + ForwardIterator + stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); + +template<class ForwardIterator, class Predicate> + ForwardIterator + partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); + +template <class ForwardIterator> + bool + is_sorted(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class Compare> + bool + is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); + +template<class ForwardIterator> + ForwardIterator + is_sorted_until(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class Compare> + ForwardIterator + is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); + +template <class RandomAccessIterator> + void + sort(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + void + stable_sort(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + void + partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); + +template <class InputIterator, class RandomAccessIterator> + RandomAccessIterator + partial_sort_copy(InputIterator first, InputIterator last, + RandomAccessIterator result_first, RandomAccessIterator result_last); + +template <class InputIterator, class RandomAccessIterator, class Compare> + RandomAccessIterator + partial_sort_copy(InputIterator first, InputIterator last, + RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); + +template <class RandomAccessIterator> + void + nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); + +template <class ForwardIterator, class T> + ForwardIterator + lower_bound(ForwardIterator first, ForwardIterator last, const T& value); + +template <class ForwardIterator, class T, class Compare> + ForwardIterator + lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); + +template <class ForwardIterator, class T> + ForwardIterator + upper_bound(ForwardIterator first, ForwardIterator last, const T& value); + +template <class ForwardIterator, class T, class Compare> + ForwardIterator + upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); + +template <class ForwardIterator, class T> + pair<ForwardIterator, ForwardIterator> + equal_range(ForwardIterator first, ForwardIterator last, const T& value); + +template <class ForwardIterator, class T, class Compare> + pair<ForwardIterator, ForwardIterator> + equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); + +template <class ForwardIterator, class T> + bool + binary_search(ForwardIterator first, ForwardIterator last, const T& value); + +template <class ForwardIterator, class T, class Compare> + bool + binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); + +template <class InputIterator1, class InputIterator2, class OutputIterator> + OutputIterator + merge(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> + OutputIterator + merge(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); + +template <class BidirectionalIterator> + void + inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); + +template <class BidirectionalIterator, class Compare> + void + inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); + +template <class InputIterator1, class InputIterator2> + bool + includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); + +template <class InputIterator1, class InputIterator2, class Compare> + bool + includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); + +template <class InputIterator1, class InputIterator2, class OutputIterator> + OutputIterator + set_union(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> + OutputIterator + set_union(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); + +template <class InputIterator1, class InputIterator2, class OutputIterator> + OutputIterator + set_intersection(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> + OutputIterator + set_intersection(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); + +template <class InputIterator1, class InputIterator2, class OutputIterator> + OutputIterator + set_difference(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> + OutputIterator + set_difference(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); + +template <class InputIterator1, class InputIterator2, class OutputIterator> + OutputIterator + set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result); + +template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> + OutputIterator + set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); + +template <class RandomAccessIterator> + void + push_heap(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + void + pop_heap(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + void + make_heap(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + void + sort_heap(RandomAccessIterator first, RandomAccessIterator last); + +template <class RandomAccessIterator, class Compare> + void + sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); + +template <class RandomAccessIterator> + bool + is_heap(RandomAccessIterator first, RandomAccessiterator last); + +template <class RandomAccessIterator, class Compare> + bool + is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); + +template <class RandomAccessIterator> + RandomAccessIterator + is_heap_until(RandomAccessIterator first, RandomAccessiterator last); + +template <class RandomAccessIterator, class Compare> + RandomAccessIterator + is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); + +template <class ForwardIterator> + ForwardIterator + min_element(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class Compare> + ForwardIterator + min_element(ForwardIterator first, ForwardIterator last, Compare comp); + +template <class T> + const T& + min(const T& a, const T& b); + +template <class T, class Compare> + const T& + min(const T& a, const T& b, Compare comp); + +template<class T> + T + min(initializer_list<T> t); + +template<class T, class Compare> + T + min(initializer_list<T> t, Compare comp); + +template <class ForwardIterator> + ForwardIterator + max_element(ForwardIterator first, ForwardIterator last); + +template <class ForwardIterator, class Compare> + ForwardIterator + max_element(ForwardIterator first, ForwardIterator last, Compare comp); + +template <class T> + const T& + max(const T& a, const T& b); + +template <class T, class Compare> + const T& + max(const T& a, const T& b, Compare comp); + +template<class T> + T + max(initializer_list<T> t); + +template<class T, class Compare> + T + max(initializer_list<T> t, Compare comp); + +template<class ForwardIterator> + pair<ForwardIterator, ForwardIterator> + minmax_element(ForwardIterator first, ForwardIterator last); + +template<class ForwardIterator, class Compare> + pair<ForwardIterator, ForwardIterator> + minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); + +template<class T> + pair<const T&, const T&> + minmax(const T& a, const T& b); + +template<class T, class Compare> + pair<const T&, const T&> + minmax(const T& a, const T& b, Compare comp); + +template<class T> + pair<T, T> + minmax(initializer_list<T> t); + +template<class T, class Compare> + pair<T, T> + minmax(initializer_list<T> t, Compare comp); + +template <class InputIterator1, class InputIterator2> + bool + lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); + +template <class InputIterator1, class InputIterator2, class Compare> + bool + lexicographical_compare(InputIterator1 first1, InputIterator1 last1, + InputIterator2 first2, InputIterator2 last2, Compare comp); + +template <class BidirectionalIterator> + bool + next_permutation(BidirectionalIterator first, BidirectionalIterator last); + +template <class BidirectionalIterator, class Compare> + bool + next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); + +template <class BidirectionalIterator> + bool + prev_permutation(BidirectionalIterator first, BidirectionalIterator last); + +template <class BidirectionalIterator, class Compare> + bool + prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); + +} // std + +*/ + +#include <__config> +#include <initializer_list> +#include <type_traits> +#include <cstring> +#include <utility> +#include <memory> +#include <iterator> +#include <cstdlib> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _T1, class _T2 = _T1> +struct __equal_to +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;} +}; + +template <class _T1> +struct __equal_to<_T1, _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} +}; + +template <class _T1> +struct __equal_to<const _T1, _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} +}; + +template <class _T1> +struct __equal_to<_T1, const _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} +}; + +template <class _T1, class _T2 = _T1> +struct __less +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;} + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;} +}; + +template <class _T1> +struct __less<_T1, _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +template <class _T1> +struct __less<const _T1, _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +template <class _T1> +struct __less<_T1, const _T1> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +template <class _Predicate> +class __negate +{ +private: + _Predicate __p_; +public: + _LIBCPP_INLINE_VISIBILITY __negate() {} + + _LIBCPP_INLINE_VISIBILITY + explicit __negate(_Predicate __p) : __p_(__p) {} + + template <class _T1> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _T1& __x) {return !__p_(__x);} + + template <class _T1, class _T2> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);} +}; + +#ifdef _LIBCPP_DEBUG2 + +template <class _Compare> +struct __debug_less +{ + _Compare __comp_; + __debug_less(_Compare& __c) : __comp_(__c) {} + template <class _Tp, class _Up> + bool operator()(const _Tp& __x, const _Up& __y) + { + bool __r = __comp_(__x, __y); + if (__r) + _LIBCPP_ASSERT(!__comp_(__y, __x), "Comparator does not induce a strict weak ordering"); + return __r; + } +}; + +#endif // _LIBCPP_DEBUG2 + +// Precondition: __x != 0 +inline _LIBCPP_INLINE_VISIBILITY +unsigned +__ctz(unsigned __x) +{ + return static_cast<unsigned>(__builtin_ctz(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +unsigned long +__ctz(unsigned long __x) +{ + return static_cast<unsigned long>(__builtin_ctzl(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +__ctz(unsigned long long __x) +{ + return static_cast<unsigned long long>(__builtin_ctzll(__x)); +} + +// Precondition: __x != 0 +inline _LIBCPP_INLINE_VISIBILITY +unsigned +__clz(unsigned __x) +{ + return static_cast<unsigned>(__builtin_clz(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +unsigned long +__clz(unsigned long __x) +{ + return static_cast<unsigned long>(__builtin_clzl (__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +__clz(unsigned long long __x) +{ + return static_cast<unsigned long long>(__builtin_clzll(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);} +inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);} +inline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);} + +// all_of + +template <class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (!__pred(*__first)) + return false; + return true; +} + +// any_of + +template <class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (__pred(*__first)) + return true; + return false; +} + +// none_of + +template <class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (__pred(*__first)) + return false; + return true; +} + +// for_each + +template <class _InputIterator, class _Function> +inline _LIBCPP_INLINE_VISIBILITY +_Function +for_each(_InputIterator __first, _InputIterator __last, _Function __f) +{ + for (; __first != __last; ++__first) + __f(*__first); + return _VSTD::move(__f); +} + +// find + +template <class _InputIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_InputIterator +find(_InputIterator __first, _InputIterator __last, const _Tp& __value_) +{ + for (; __first != __last; ++__first) + if (*__first == __value_) + break; + return __first; +} + +// find_if + +template <class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_InputIterator +find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (__pred(*__first)) + break; + return __first; +} + +// find_if_not + +template<class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_InputIterator +find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (!__pred(*__first)) + break; + return __first; +} + +// find_end + +template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2> +_ForwardIterator1 +__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred, + forward_iterator_tag, forward_iterator_tag) +{ + // modeled after search algorithm + _ForwardIterator1 __r = __last1; // __last1 is the "default" answer + if (__first2 == __last2) + return __r; + while (true) + { + while (true) + { + if (__first1 == __last1) // if source exhausted return last correct answer + return __r; // (or __last1 if never found) + if (__pred(*__first1, *__first2)) + break; + ++__first1; + } + // *__first1 matches *__first2, now match elements after here + _ForwardIterator1 __m1 = __first1; + _ForwardIterator2 __m2 = __first2; + while (true) + { + if (++__m2 == __last2) + { // Pattern exhaused, record answer and search for another one + __r = __first1; + ++__first1; + break; + } + if (++__m1 == __last1) // Source exhausted, return last answer + return __r; + if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first + { + ++__first1; + break; + } // else there is a match, check next elements + } + } +} + +template <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2> +_BidirectionalIterator1 +__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, + _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred, + bidirectional_iterator_tag, bidirectional_iterator_tag) +{ + // modeled after search algorithm (in reverse) + if (__first2 == __last2) + return __last1; // Everything matches an empty sequence + _BidirectionalIterator1 __l1 = __last1; + _BidirectionalIterator2 __l2 = __last2; + --__l2; + while (true) + { + // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks + while (true) + { + if (__first1 == __l1) // return __last1 if no element matches *__first2 + return __last1; + if (__pred(*--__l1, *__l2)) + break; + } + // *__l1 matches *__l2, now match elements before here + _BidirectionalIterator1 __m1 = __l1; + _BidirectionalIterator2 __m2 = __l2; + while (true) + { + if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern) + return __m1; + if (__m1 == __first1) // Otherwise if source exhaused, pattern not found + return __last1; + if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1 + { + break; + } // else there is a match, check next elements + } + } +} + +template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2> +_RandomAccessIterator1 +__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, + _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, + random_access_iterator_tag, random_access_iterator_tag) +{ + // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern + typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2; + if (__len2 == 0) + return __last1; + typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1; + if (__len1 < __len2) + return __last1; + const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here + _RandomAccessIterator1 __l1 = __last1; + _RandomAccessIterator2 __l2 = __last2; + --__l2; + while (true) + { + while (true) + { + if (__s == __l1) + return __last1; + if (__pred(*--__l1, *__l2)) + break; + } + _RandomAccessIterator1 __m1 = __l1; + _RandomAccessIterator2 __m2 = __l2; + while (true) + { + if (__m2 == __first2) + return __m1; + // no need to check range on __m1 because __s guarantees we have enough source + if (!__pred(*--__m1, *--__m2)) + { + break; + } + } + } +} + +template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator1 +find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) +{ + return _VSTD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type> + (__first1, __last1, __first2, __last2, __pred, + typename iterator_traits<_ForwardIterator1>::iterator_category(), + typename iterator_traits<_ForwardIterator2>::iterator_category()); +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator1 +find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) +{ + typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; + typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; + return _VSTD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); +} + +// find_first_of + +template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> +_ForwardIterator1 +find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) +{ + for (; __first1 != __last1; ++__first1) + for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) + if (__pred(*__first1, *__j)) + return __first1; + return __last1; +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator1 +find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) +{ + typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; + typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; + return _VSTD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); +} + +// adjacent_find + +template <class _ForwardIterator, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (__pred(*__first, *__i)) + return __first; + __first = __i; + } + } + return __last; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +adjacent_find(_ForwardIterator __first, _ForwardIterator __last) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type __v; + return _VSTD::adjacent_find(__first, __last, __equal_to<__v>()); +} + +// count + +template <class _InputIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename iterator_traits<_InputIterator>::difference_type +count(_InputIterator __first, _InputIterator __last, const _Tp& __value_) +{ + typename iterator_traits<_InputIterator>::difference_type __r(0); + for (; __first != __last; ++__first) + if (*__first == __value_) + ++__r; + return __r; +} + +// count_if + +template <class _InputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +typename iterator_traits<_InputIterator>::difference_type +count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + typename iterator_traits<_InputIterator>::difference_type __r(0); + for (; __first != __last; ++__first) + if (__pred(*__first)) + ++__r; + return __r; +} + +// mismatch + +template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +pair<_InputIterator1, _InputIterator2> +mismatch(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _BinaryPredicate __pred) +{ + for (; __first1 != __last1; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + break; + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); +} + +template <class _InputIterator1, class _InputIterator2> +inline _LIBCPP_INLINE_VISIBILITY +pair<_InputIterator1, _InputIterator2> +mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return _VSTD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>()); +} + +// equal + +template <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) +{ + for (; __first1 != __last1; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + return false; + return true; +} + +template <class _InputIterator1, class _InputIterator2> +inline _LIBCPP_INLINE_VISIBILITY +bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return _VSTD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>()); +} + +// is_permutation + +template<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> +bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _BinaryPredicate __pred) +{ + // shorten sequences as much as possible by lopping of any equal parts + for (; __first1 != __last1; ++__first1, ++__first2) + if (!__pred(*__first1, *__first2)) + goto __not_done; + return true; +__not_done: + // __first1 != __last1 && *__first1 != *__first2 + typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1; + _D1 __l1 = _VSTD::distance(__first1, __last1); + if (__l1 == _D1(1)) + return false; + _ForwardIterator2 __last2 = _VSTD::next(__first2, __l1); + // For each element in [f1, l1) see if there are the same number of + // equal elements in [f2, l2) + for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i) + { + // Have we already counted the number of *__i in [f1, l1)? + for (_ForwardIterator1 __j = __first1; __j != __i; ++__j) + if (__pred(*__j, *__i)) + goto __next_iter; + { + // Count number of *__i in [f2, l2) + _D1 __c2 = 0; + for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) + if (__pred(*__i, *__j)) + ++__c2; + if (__c2 == 0) + return false; + // Count number of *__i in [__i, l1) (we can start with 1) + _D1 __c1 = 1; + for (_ForwardIterator1 __j = _VSTD::next(__i); __j != __last1; ++__j) + if (__pred(*__i, *__j)) + ++__c1; + if (__c1 != __c2) + return false; + } +__next_iter:; + } + return true; +} + +template<class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2) +{ + typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; + typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; + return _VSTD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>()); +} + +// search + +template <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2> +_ForwardIterator1 +__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred, + forward_iterator_tag, forward_iterator_tag) +{ + if (__first2 == __last2) + return __first1; // Everything matches an empty sequence + while (true) + { + // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks + while (true) + { + if (__first1 == __last1) // return __last1 if no element matches *__first2 + return __last1; + if (__pred(*__first1, *__first2)) + break; + ++__first1; + } + // *__first1 matches *__first2, now match elements after here + _ForwardIterator1 __m1 = __first1; + _ForwardIterator2 __m2 = __first2; + while (true) + { + if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern) + return __first1; + if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found + return __last1; + if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1 + { + ++__first1; + break; + } // else there is a match, check next elements + } + } +} + +template <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2> +_RandomAccessIterator1 +__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, + _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, + random_access_iterator_tag, random_access_iterator_tag) +{ + typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1; + typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2; + // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern + _D2 __len2 = __last2 - __first2; + if (__len2 == 0) + return __first1; + _D1 __len1 = __last1 - __first1; + if (__len1 < __len2) + return __last1; + const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here + while (true) + { +#if !_LIBCPP_UNROLL_LOOPS + while (true) + { + if (__first1 == __s) + return __last1; + if (__pred(*__first1, *__first2)) + break; + ++__first1; + } +#else // !_LIBCPP_UNROLL_LOOPS + for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll) + { + if (__pred(*__first1, *__first2)) + goto __phase2; + if (__pred(*++__first1, *__first2)) + goto __phase2; + if (__pred(*++__first1, *__first2)) + goto __phase2; + if (__pred(*++__first1, *__first2)) + goto __phase2; + ++__first1; + } + switch (__s - __first1) + { + case 3: + if (__pred(*__first1, *__first2)) + break; + ++__first1; + case 2: + if (__pred(*__first1, *__first2)) + break; + ++__first1; + case 1: + if (__pred(*__first1, *__first2)) + break; + case 0: + return __last1; + } + __phase2: +#endif // !_LIBCPP_UNROLL_LOOPS + _RandomAccessIterator1 __m1 = __first1; + _RandomAccessIterator2 __m2 = __first2; +#if !_LIBCPP_UNROLL_LOOPS + while (true) + { + if (++__m2 == __last2) + return __first1; + ++__m1; // no need to check range on __m1 because __s guarantees we have enough source + if (!__pred(*__m1, *__m2)) + { + ++__first1; + break; + } + } +#else // !_LIBCPP_UNROLL_LOOPS + ++__m2; + ++__m1; + for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll) + { + if (!__pred(*__m1, *__m2)) + goto __continue; + if (!__pred(*++__m1, *++__m2)) + goto __continue; + if (!__pred(*++__m1, *++__m2)) + goto __continue; + if (!__pred(*++__m1, *++__m2)) + goto __continue; + ++__m1; + ++__m2; + } + switch (__last2 - __m2) + { + case 3: + if (!__pred(*__m1, *__m2)) + break; + ++__m1; + ++__m2; + case 2: + if (!__pred(*__m1, *__m2)) + break; + ++__m1; + ++__m2; + case 1: + if (!__pred(*__m1, *__m2)) + break; + case 0: + return __first1; + } + __continue: + ++__first1; +#endif // !_LIBCPP_UNROLL_LOOPS + } +} + +template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator1 +search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) +{ + return _VSTD::__search<typename add_lvalue_reference<_BinaryPredicate>::type> + (__first1, __last1, __first2, __last2, __pred, + typename std::iterator_traits<_ForwardIterator1>::iterator_category(), + typename std::iterator_traits<_ForwardIterator2>::iterator_category()); +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator1 +search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) +{ + typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1; + typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2; + return _VSTD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); +} + +// search_n + +template <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp> +_ForwardIterator +__search_n(_ForwardIterator __first, _ForwardIterator __last, + _Size __count, const _Tp& __value_, _BinaryPredicate __pred, forward_iterator_tag) +{ + if (__count <= 0) + return __first; + while (true) + { + // Find first element in sequence that matchs __value_, with a mininum of loop checks + while (true) + { + if (__first == __last) // return __last if no element matches __value_ + return __last; + if (__pred(*__first, __value_)) + break; + ++__first; + } + // *__first matches __value_, now match elements after here + _ForwardIterator __m = __first; + _Size __c(0); + while (true) + { + if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) + return __first; + if (++__m == __last) // Otherwise if source exhaused, pattern not found + return __last; + if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first + { + __first = __m; + ++__first; + break; + } // else there is a match, check next elements + } + } +} + +template <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp> +_RandomAccessIterator +__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last, + _Size __count, const _Tp& __value_, _BinaryPredicate __pred, random_access_iterator_tag) +{ + if (__count <= 0) + return __first; + _Size __len = static_cast<_Size>(__last - __first); + if (__len < __count) + return __last; + const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here + while (true) + { + // Find first element in sequence that matchs __value_, with a mininum of loop checks + while (true) + { + if (__first == __s) // return __last if no element matches __value_ + return __last; + if (__pred(*__first, __value_)) + break; + ++__first; + } + // *__first matches __value_, now match elements after here + _RandomAccessIterator __m = __first; + _Size __c(0); + while (true) + { + if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) + return __first; + ++__m; // no need to check range on __m because __s guarantees we have enough source + if (!__pred(*__m, __value_)) // if there is a mismatch, restart with a new __first + { + __first = __m; + ++__first; + break; + } // else there is a match, check next elements + } + } +} + +template <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +search_n(_ForwardIterator __first, _ForwardIterator __last, + _Size __count, const _Tp& __value_, _BinaryPredicate __pred) +{ + return _VSTD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type> + (__first, __last, __count, __value_, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); +} + +template <class _ForwardIterator, class _Size, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value_) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type __v; + return _VSTD::search_n(__first, __last, __count, __value_, __equal_to<__v, _Tp>()); +} + +// copy + +template <class _Iter> +struct __libcpp_is_trivial_iterator +{ + static const bool value = is_pointer<_Iter>::value; +}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > +{ + static const bool value = is_pointer<_Iter>::value; +}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > +{ + static const bool value = is_pointer<_Iter>::value; +}; + +template <class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +_Iter +__unwrap_iter(_Iter __i) +{ + return __i; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_trivially_copy_assignable<_Tp>::value, + _Tp* +>::type +__unwrap_iter(move_iterator<_Tp*> __i) +{ + return __i.base(); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_trivially_copy_assignable<_Tp>::value, + _Tp* +>::type +__unwrap_iter(__wrap_iter<_Tp*> __i) +{ + return __i.base(); +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + for (; __first != __last; ++__first, ++__result) + *__result = *__first; + return __result; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_same<typename remove_const<_Tp>::type, _Up>::value && + is_trivially_copy_assignable<_Up>::value, + _Up* +>::type +__copy(_Tp* __first, _Tp* __last, _Up* __result) +{ + const size_t __n = static_cast<size_t>(__last - __first); + _VSTD::memmove(__result, __first, __n * sizeof(_Up)); + return __result + __n; +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + return _VSTD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); +} + +// copy_backward + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + while (__first != __last) + *--__result = *--__last; + return __result; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_same<typename remove_const<_Tp>::type, _Up>::value && + is_trivially_copy_assignable<_Up>::value, + _Up* +>::type +__copy_backward(_Tp* __first, _Tp* __last, _Up* __result) +{ + const size_t __n = static_cast<size_t>(__last - __first); + __result -= __n; + _VSTD::memmove(__result, __first, __n * sizeof(_Up)); + return __result; +} + +template <class _BidirectionalIterator1, class _BidirectionalIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_BidirectionalIterator2 +copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, + _BidirectionalIterator2 __result) +{ + return _VSTD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); +} + +// copy_if + +template<class _InputIterator, class _OutputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (__pred(*__first)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +// copy_n + +template<class _InputIterator, class _Size, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_input_iterator<_InputIterator>::value && + !__is_random_access_iterator<_InputIterator>::value, + _OutputIterator +>::type +copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) +{ + if (__n > 0) + { + *__result = *__first; + ++__result; + for (--__n; __n > 0; --__n) + { + ++__first; + *__result = *__first; + ++__result; + } + } + return __result; +} + +template<class _InputIterator, class _Size, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_random_access_iterator<_InputIterator>::value, + _OutputIterator +>::type +copy_n(_InputIterator __first, _Size __n, _OutputIterator __result) +{ + return _VSTD::copy(__first, __first + __n, __result); +} + +// move + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + for (; __first != __last; ++__first, ++__result) + *__result = _VSTD::move(*__first); + return __result; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_same<typename remove_const<_Tp>::type, _Up>::value && + is_trivially_copy_assignable<_Up>::value, + _Up* +>::type +__move(_Tp* __first, _Tp* __last, _Up* __result) +{ + const size_t __n = static_cast<size_t>(__last - __first); + _VSTD::memmove(__result, __first, __n * sizeof(_Up)); + return __result + __n; +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + return _VSTD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); +} + +// move_backward + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + while (__first != __last) + *--__result = _VSTD::move(*--__last); + return __result; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_same<typename remove_const<_Tp>::type, _Up>::value && + is_trivially_copy_assignable<_Up>::value, + _Up* +>::type +__move_backward(_Tp* __first, _Tp* __last, _Up* __result) +{ + const size_t __n = static_cast<size_t>(__last - __first); + __result -= __n; + _VSTD::memmove(__result, __first, __n * sizeof(_Up)); + return __result; +} + +template <class _BidirectionalIterator1, class _BidirectionalIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_BidirectionalIterator2 +move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, + _BidirectionalIterator2 __result) +{ + return _VSTD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); +} + +// iter_swap + +// moved to <type_traits> for better swap / noexcept support + +// transform + +template <class _InputIterator, class _OutputIterator, class _UnaryOperation> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) +{ + for (; __first != __last; ++__first, ++__result) + *__result = __op(*__first); + return __result; +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, + _OutputIterator __result, _BinaryOperation __binary_op) +{ + for (; __first1 != __last1; ++__first1, ++__first2, ++__result) + *__result = __binary_op(*__first1, *__first2); + return __result; +} + +// replace + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value) +{ + for (; __first != __last; ++__first) + if (*__first == __old_value) + *__first = __new_value; +} + +// replace_if + +template <class _ForwardIterator, class _Predicate, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value) +{ + for (; __first != __last; ++__first) + if (__pred(*__first)) + *__first = __new_value; +} + +// replace_copy + +template <class _InputIterator, class _OutputIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + const _Tp& __old_value, const _Tp& __new_value) +{ + for (; __first != __last; ++__first, ++__result) + if (*__first == __old_value) + *__result = __new_value; + else + *__result = *__first; + return __result; +} + +// replace_copy_if + +template <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + _Predicate __pred, const _Tp& __new_value) +{ + for (; __first != __last; ++__first, ++__result) + if (__pred(*__first)) + *__result = __new_value; + else + *__result = *__first; + return __result; +} + +// fill_n + +template <class _OutputIterator, class _Size, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, false_type) +{ + for (; __n > 0; ++__first, --__n) + *__first = __value_; + return __first; +} + +template <class _OutputIterator, class _Size, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_, true_type) +{ + if (__n > 0) + _VSTD::memset(__first, (unsigned char)__value_, (size_t)(__n)); + return __first + __n; +} + +template <class _OutputIterator, class _Size, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +fill_n(_OutputIterator __first, _Size __n, const _Tp& __value_) +{ + return _VSTD::__fill_n(__first, __n, __value_, integral_constant<bool, + is_pointer<_OutputIterator>::value && + is_trivially_copy_assignable<_Tp>::value && + sizeof(_Tp) == 1>()); +} + +// fill + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, forward_iterator_tag) +{ + for (; __first != __last; ++__first) + *__first = __value_; +} + +template <class _RandomAccessIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value_, random_access_iterator_tag) +{ + _VSTD::fill_n(__first, __last - __first, __value_); +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + _VSTD::__fill(__first, __last, __value_, typename iterator_traits<_ForwardIterator>::iterator_category()); +} + +// generate + +template <class _ForwardIterator, class _Generator> +inline _LIBCPP_INLINE_VISIBILITY +void +generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) +{ + for (; __first != __last; ++__first) + *__first = __gen(); +} + +// generate_n + +template <class _OutputIterator, class _Size, class _Generator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +generate_n(_OutputIterator __first, _Size __n, _Generator __gen) +{ + for (; __n > 0; ++__first, --__n) + *__first = __gen(); + return __first; +} + +// remove + +template <class _ForwardIterator, class _Tp> +_ForwardIterator +remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + __first = _VSTD::find(__first, __last, __value_); + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (!(*__i == __value_)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + } + } + return __first; +} + +// remove_if + +template <class _ForwardIterator, class _Predicate> +_ForwardIterator +remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + __first = _VSTD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type> + (__first, __last, __pred); + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (!__pred(*__i)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + } + } + return __first; +} + +// remove_copy + +template <class _InputIterator, class _OutputIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value_) +{ + for (; __first != __last; ++__first) + { + if (!(*__first == __value_)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +// remove_copy_if + +template <class _InputIterator, class _OutputIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (!__pred(*__first)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +// unique + +template <class _ForwardIterator, class _BinaryPredicate> +_ForwardIterator +unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) +{ + __first = _VSTD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type> + (__first, __last, __pred); + if (__first != __last) + { + // ... a a ? ... + // f i + _ForwardIterator __i = __first; + for (++__i; ++__i != __last;) + if (!__pred(*__first, *__i)) + *++__first = _VSTD::move(*__i); + ++__first; + } + return __first; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +unique(_ForwardIterator __first, _ForwardIterator __last) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type __v; + return _VSTD::unique(__first, __last, __equal_to<__v>()); +} + +// unique_copy + +template <class _BinaryPredicate, class _InputIterator, class _OutputIterator> +_OutputIterator +__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred, + input_iterator_tag, output_iterator_tag) +{ + if (__first != __last) + { + typename iterator_traits<_InputIterator>::value_type __t(*__first); + *__result = __t; + ++__result; + while (++__first != __last) + { + if (!__pred(__t, *__first)) + { + __t = *__first; + *__result = __t; + ++__result; + } + } + } + return __result; +} + +template <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator> +_OutputIterator +__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred, + forward_iterator_tag, output_iterator_tag) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + *__result = *__i; + ++__result; + while (++__first != __last) + { + if (!__pred(*__i, *__first)) + { + *__result = *__first; + ++__result; + __i = __first; + } + } + } + return __result; +} + +template <class _BinaryPredicate, class _InputIterator, class _ForwardIterator> +_ForwardIterator +__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred, + input_iterator_tag, forward_iterator_tag) +{ + if (__first != __last) + { + *__result = *__first; + while (++__first != __last) + if (!__pred(*__result, *__first)) + *++__result = *__first; + ++__result; + } + return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryPredicate> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred) +{ + return _VSTD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type> + (__first, __last, __result, __pred, + typename iterator_traits<_InputIterator>::iterator_category(), + typename iterator_traits<_OutputIterator>::iterator_category()); +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + typedef typename iterator_traits<_InputIterator>::value_type __v; + return _VSTD::unique_copy(__first, __last, __result, __equal_to<__v>()); +} + +// reverse + +template <class _BidirectionalIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag) +{ + while (__first != __last) + { + if (__first == --__last) + break; + swap(*__first, *__last); + ++__first; + } +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag) +{ + if (__first != __last) + for (; __first < --__last; ++__first) + swap(*__first, *__last); +} + +template <class _BidirectionalIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + _VSTD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category()); +} + +// reverse_copy + +template <class _BidirectionalIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result) +{ + for (; __first != __last; ++__result) + *__result = *--__last; + return __result; +} + +// rotate + +template <class _ForwardIterator> +_ForwardIterator +__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type) +{ + if (__first == __middle) + return __last; + if (__middle == __last) + return __first; + _ForwardIterator __i = __middle; + while (true) + { + swap(*__first, *__i); + ++__first; + if (++__i == __last) + break; + if (__first == __middle) + __middle = __i; + } + _ForwardIterator __r = __first; + if (__first != __middle) + { + __i = __middle; + while (true) + { + swap(*__first, *__i); + ++__first; + if (++__i == __last) + { + if (__first == __middle) + break; + __i = __middle; + } + else if (__first == __middle) + __middle = __i; + } + } + return __r; +} + +template<typename _Integral> +inline _LIBCPP_INLINE_VISIBILITY +_Integral +__gcd(_Integral __x, _Integral __y) +{ + do + { + _Integral __t = __x % __y; + __x = __y; + __y = __t; + } while (__y); + return __x; +} + +template<typename _RandomAccessIterator> +_RandomAccessIterator +__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + + if (__first == __middle) + return __last; + if (__middle == __last) + return __first; + const difference_type __m1 = __middle - __first; + const difference_type __m2 = __last - __middle; + if (__m1 == __m2) + { + _VSTD::swap_ranges(__first, __middle, __middle); + return __middle; + } + const difference_type __g = __gcd(__m1, __m2); + for (_RandomAccessIterator __p = __first + __g; __p != __first;) + { + value_type __t(*--__p); + _RandomAccessIterator __p1 = __p; + _RandomAccessIterator __p2 = __p1 + __m1; + do + { + *__p1 = *__p2; + __p1 = __p2; + const difference_type __d = __last - __p2; + if (__m1 < __d) + __p2 += __m1; + else + __p2 = __first + (__m1 - __d); + } while (__p2 != __p); + *__p1 = __t; + } + return __first + __m2; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last) +{ + return _VSTD::__rotate(__first, __middle, __last, + integral_constant + < + bool, + is_convertible + < + typename iterator_traits<_ForwardIterator>::iterator_category, + random_access_iterator_tag + >::value && + is_trivially_copy_assignable + < + typename iterator_traits<_ForwardIterator>::value_type + >::value + >()); +} + +// rotate_copy + +template <class _ForwardIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result) +{ + return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result)); +} + +// min_element + +template <class _ForwardIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + if (__comp(*__i, *__first)) + __first = __i; + } + return __first; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +min_element(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::min_element(__first, __last, + __less<typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// min + +template <class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp& +min(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__b, __a) ? __b : __a; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp& +min(const _Tp& __a, const _Tp& __b) +{ + return _VSTD::min(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +min(initializer_list<_Tp> __t, _Compare __comp) +{ + return *_VSTD::min_element(__t.begin(), __t.end(), __comp); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +min(initializer_list<_Tp> __t) +{ + return *_VSTD::min_element(__t.begin(), __t.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +// max_element + +template <class _ForwardIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + if (__comp(*__first, *__i)) + __first = __i; + } + return __first; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +max_element(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::max_element(__first, __last, + __less<typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// max + +template <class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp& +max(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__a, __b) ? __b : __a; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp& +max(const _Tp& __a, const _Tp& __b) +{ + return _VSTD::max(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +max(initializer_list<_Tp> __t, _Compare __comp) +{ + return *_VSTD::max_element(__t.begin(), __t.end(), __comp); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +max(initializer_list<_Tp> __t) +{ + return *_VSTD::max_element(__t.begin(), __t.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +// minmax_element + +template <class _ForwardIterator, class _Compare> +std::pair<_ForwardIterator, _ForwardIterator> +minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first); + if (__first != __last) + { + if (++__first != __last) + { + if (__comp(*__first, *__result.first)) + __result.first = __first; + else + __result.second = __first; + while (++__first != __last) + { + _ForwardIterator __i = __first; + if (++__first == __last) + { + if (__comp(*__i, *__result.first)) + __result.first = __i; + else if (!__comp(*__i, *__result.second)) + __result.second = __i; + break; + } + else + { + if (__comp(*__first, *__i)) + { + if (__comp(*__first, *__result.first)) + __result.first = __first; + if (!__comp(*__i, *__result.second)) + __result.second = __i; + } + else + { + if (__comp(*__i, *__result.first)) + __result.first = __i; + if (!__comp(*__first, *__result.second)) + __result.second = __first; + } + } + } + } + } + return __result; +} + +template <class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +std::pair<_ForwardIterator, _ForwardIterator> +minmax_element(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// minmax + +template<class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +pair<const _Tp&, const _Tp&> +minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__b, __a) ? pair<const _Tp&, const _Tp&>(__b, __a) : + pair<const _Tp&, const _Tp&>(__a, __b); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +pair<const _Tp&, const _Tp&> +minmax(const _Tp& __a, const _Tp& __b) +{ + return _VSTD::minmax(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +pair<_Tp, _Tp> +minmax(initializer_list<_Tp> __t) +{ + pair<const _Tp*, const _Tp*> __p = + _VSTD::minmax_element(__t.begin(), __t.end()); + return pair<_Tp, _Tp>(*__p.first, *__p.second); +} + +template<class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +pair<_Tp, _Tp> +minmax(initializer_list<_Tp> __t, _Compare __comp) +{ + pair<const _Tp*, const _Tp*> __p = + _VSTD::minmax_element(__t.begin(), __t.end(), __comp); + return pair<_Tp, _Tp>(*__p.first, *__p.second); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +// random_shuffle + +// __independent_bits_engine + +template <unsigned long long _Xp, size_t _Rp> +struct __log2_imp +{ + static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp + : __log2_imp<_Xp, _Rp - 1>::value; +}; + +template <unsigned long long _Xp> +struct __log2_imp<_Xp, 0> +{ + static const size_t value = 0; +}; + +template <size_t _Rp> +struct __log2_imp<0, _Rp> +{ + static const size_t value = _Rp + 1; +}; + +template <class _UI, _UI _Xp> +struct __log2 +{ + static const size_t value = __log2_imp<_Xp, + sizeof(_UI) * __CHAR_BIT__ - 1>::value; +}; + +template<class _Engine, class _UIntType> +class __independent_bits_engine +{ +public: + // types + typedef _UIntType result_type; + +private: + typedef typename _Engine::result_type _Engine_result_type; + typedef typename conditional + < + sizeof(_Engine_result_type) <= sizeof(result_type), + result_type, + _Engine_result_type + >::type _Working_result_type; + + _Engine& __e_; + size_t __w_; + size_t __w0_; + size_t __n_; + size_t __n0_; + _Working_result_type __y0_; + _Working_result_type __y1_; + _Engine_result_type __mask0_; + _Engine_result_type __mask1_; + + static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min + + _Working_result_type(1); + static const size_t __m = __log2<_Working_result_type, _Rp>::value; + static const size_t _WDt = numeric_limits<_Working_result_type>::digits; + static const size_t _EDt = numeric_limits<_Engine_result_type>::digits; + +public: + // constructors and seeding functions + __independent_bits_engine(_Engine& __e, size_t __w); + + // generating functions + result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} + +private: + result_type __eval(false_type); + result_type __eval(true_type); +}; + +template<class _Engine, class _UIntType> +__independent_bits_engine<_Engine, _UIntType> + ::__independent_bits_engine(_Engine& __e, size_t __w) + : __e_(__e), + __w_(__w) +{ + __n_ = __w_ / __m + (__w_ % __m != 0); + __w0_ = __w_ / __n_; + if (_Rp == 0) + __y0_ = _Rp; + else if (__w0_ < _WDt) + __y0_ = (_Rp >> __w0_) << __w0_; + else + __y0_ = 0; + if (_Rp - __y0_ > __y0_ / __n_) + { + ++__n_; + __w0_ = __w_ / __n_; + if (__w0_ < _WDt) + __y0_ = (_Rp >> __w0_) << __w0_; + else + __y0_ = 0; + } + __n0_ = __n_ - __w_ % __n_; + if (__w0_ < _WDt - 1) + __y1_ = (_Rp >> (__w0_ + 1)) << (__w0_ + 1); + else + __y1_ = 0; + __mask0_ = __w0_ > 0 ? _Engine_result_type(~0) >> (_EDt - __w0_) : + _Engine_result_type(0); + __mask1_ = __w0_ < _EDt - 1 ? + _Engine_result_type(~0) >> (_EDt - (__w0_ + 1)) : + _Engine_result_type(~0); +} + +template<class _Engine, class _UIntType> +inline +_UIntType +__independent_bits_engine<_Engine, _UIntType>::__eval(false_type) +{ + return static_cast<result_type>(__e_() & __mask0_); +} + +template<class _Engine, class _UIntType> +_UIntType +__independent_bits_engine<_Engine, _UIntType>::__eval(true_type) +{ + result_type _Sp = 0; + for (size_t __k = 0; __k < __n0_; ++__k) + { + _Engine_result_type __u; + do + { + __u = __e_() - _Engine::min(); + } while (__u >= __y0_); + if (__w0_ < _WDt) + _Sp <<= __w0_; + else + _Sp = 0; + _Sp += __u & __mask0_; + } + for (size_t __k = __n0_; __k < __n_; ++__k) + { + _Engine_result_type __u; + do + { + __u = __e_() - _Engine::min(); + } while (__u >= __y1_); + if (__w0_ < _WDt - 1) + _Sp <<= __w0_ + 1; + else + _Sp = 0; + _Sp += __u & __mask1_; + } + return _Sp; +} + +// uniform_int_distribution + +template<class _IntType = int> +class uniform_int_distribution +{ +public: + // types + typedef _IntType result_type; + + class param_type + { + result_type __a_; + result_type __b_; + public: + typedef uniform_int_distribution distribution_type; + + explicit param_type(result_type __a = 0, + result_type __b = numeric_limits<result_type>::max()) + : __a_(__a), __b_(__b) {} + + result_type a() const {return __a_;} + result_type b() const {return __b_;} + + friend bool operator==(const param_type& __x, const param_type& __y) + {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} + friend bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + explicit uniform_int_distribution(result_type __a = 0, + result_type __b = numeric_limits<result_type>::max()) + : __p_(param_type(__a, __b)) {} + explicit uniform_int_distribution(const param_type& __p) : __p_(__p) {} + void reset() {} + + // generating functions + template<class _URNG> result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + result_type a() const {return __p_.a();} + result_type b() const {return __p_.b();} + + param_type param() const {return __p_;} + void param(const param_type& __p) {__p_ = __p;} + + result_type min() const {return a();} + result_type max() const {return b();} + + friend bool operator==(const uniform_int_distribution& __x, + const uniform_int_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend bool operator!=(const uniform_int_distribution& __x, + const uniform_int_distribution& __y) + {return !(__x == __y);} +}; + +template<class _IntType> +template<class _URNG> +typename uniform_int_distribution<_IntType>::result_type +uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) +{ + typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t), + uint32_t, uint64_t>::type _UIntType; + const _UIntType _Rp = __p.b() - __p.a() + _UIntType(1); + if (_Rp == 1) + return __p.a(); + const size_t _Dt = numeric_limits<_UIntType>::digits; + typedef __independent_bits_engine<_URNG, _UIntType> _Eng; + if (_Rp == 0) + return static_cast<result_type>(_Eng(__g, _Dt)()); + size_t __w = _Dt - __clz(_Rp) - 1; + if ((_Rp & (_UIntType(~0) >> (_Dt - __w))) != 0) + ++__w; + _Eng __e(__g, __w); + _UIntType __u; + do + { + __u = __e(); + } while (__u >= _Rp); + return static_cast<result_type>(__u + __p.a()); +} + +class __rs_default; + +__rs_default __rs_get(); + +class __rs_default +{ + static unsigned __c_; + + __rs_default(); +public: + typedef unsigned result_type; + + static const result_type _Min = 0; + static const result_type _Max = 0xFFFFFFFF; + + __rs_default(const __rs_default&); + ~__rs_default(); + + result_type operator()(); + + static constexpr result_type min() {return _Min;} + static constexpr result_type max() {return _Max;} + + friend __rs_default __rs_get(); +}; + +__rs_default __rs_get(); + +template <class _RandomAccessIterator> +void +random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef uniform_int_distribution<ptrdiff_t> _Dp; + typedef typename _Dp::param_type _Pp; + difference_type __d = __last - __first; + if (__d > 1) + { + _Dp __uid; + __rs_default __g = __rs_get(); + for (--__last, --__d; __first < __last; ++__first, --__d) + { + difference_type __i = __uid(__g, _Pp(0, __d)); + if (__i != difference_type(0)) + swap(*__first, *(__first + __i)); + } + } +} + +template <class _RandomAccessIterator, class _RandomNumberGenerator> +void +random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _RandomNumberGenerator&& __rand) +#else + _RandomNumberGenerator& __rand) +#endif +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __d = __last - __first; + if (__d > 1) + { + for (--__last; __first < __last; ++__first, --__d) + { + difference_type __i = __rand(__d); + swap(*__first, *(__first + __i)); + } + } +} + +template<class _RandomAccessIterator, class _UniformRandomNumberGenerator> + void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _UniformRandomNumberGenerator&& __g) +#else + _UniformRandomNumberGenerator& __g) +#endif +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef uniform_int_distribution<ptrdiff_t> _Dp; + typedef typename _Dp::param_type _Pp; + difference_type __d = __last - __first; + if (__d > 1) + { + _Dp __uid; + for (--__last, --__d; __first < __last; ++__first, --__d) + { + difference_type __i = __uid(__g, _Pp(0, __d)); + if (__i != difference_type(0)) + swap(*__first, *(__first + __i)); + } + } +} + +template <class _InputIterator, class _Predicate> +bool +is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (!__pred(*__first)) + break; + for (; __first != __last; ++__first) + if (__pred(*__first)) + return false; + return true; +} + +// partition + +template <class _Predicate, class _ForwardIterator> +_ForwardIterator +__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag) +{ + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + for (_ForwardIterator __p = __first; ++__p != __last;) + { + if (__pred(*__p)) + { + swap(*__first, *__p); + ++__first; + } + } + return __first; +} + +template <class _Predicate, class _BidirectionalIterator> +_BidirectionalIterator +__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, + bidirectional_iterator_tag) +{ + while (true) + { + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + do + { + if (__first == --__last) + return __first; + } while (!__pred(*__last)); + swap(*__first, *__last); + ++__first; + } +} + +template <class _ForwardIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + return _VSTD::__partition<typename add_lvalue_reference<_Predicate>::type> + (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); +} + +// partition_copy + +template <class _InputIterator, class _OutputIterator1, + class _OutputIterator2, class _Predicate> +pair<_OutputIterator1, _OutputIterator2> +partition_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator1 __out_true, _OutputIterator2 __out_false, + _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (__pred(*__first)) + { + *__out_true = *__first; + ++__out_true; + } + else + { + *__out_false = *__first; + ++__out_false; + } + } + return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); +} + +// partition_point + +template<class _ForwardIterator, class _Predicate> +_ForwardIterator +partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + difference_type __len = _VSTD::distance(__first, __last); + while (__len != 0) + { + difference_type __l2 = __len / 2; + _ForwardIterator __m = __first; + _VSTD::advance(__m, __l2); + if (__pred(*__m)) + { + __first = ++__m; + __len -= __l2 + 1; + } + else + __len = __l2; + } + return __first; +} + +// stable_partition + +template <class _Predicate, class _ForwardIterator, class _Distance, class _Pair> +_ForwardIterator +__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, + _Distance __len, _Pair __p, forward_iterator_tag __fit) +{ + // *__first is known to be false + // __len >= 1 + if (__len == 1) + return __first; + if (__len == 2) + { + _ForwardIterator __m = __first; + if (__pred(*++__m)) + { + swap(*__first, *__m); + return __m; + } + return __first; + } + if (__len <= __p.second) + { // The buffer is big enough to use + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); + // Move the falses into the temporary buffer, and the trues to the front of the line + // Update __first to always point to the end of the trues + value_type* __t = __p.first; + ::new(__t) value_type(_VSTD::move(*__first)); + __d.__incr((value_type*)0); + ++__t; + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (__pred(*__i)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + else + { + ::new(__t) value_type(_VSTD::move(*__i)); + __d.__incr((value_type*)0); + ++__t; + } + } + // All trues now at start of range, all falses in buffer + // Move falses back into range, but don't mess up __first which points to first false + __i = __first; + for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) + *__i = _VSTD::move(*__t2); + // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer + return __first; + } + // Else not enough buffer, do in place + // __len >= 3 + _ForwardIterator __m = __first; + _Distance __len2 = __len / 2; // __len2 >= 2 + _VSTD::advance(__m, __len2); + // recurse on [__first, __m), *__first know to be false + // F????????????????? + // f m l + typedef typename add_lvalue_reference<_Predicate>::type _PredRef; + _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit); + // TTTFFFFF?????????? + // f ff m l + // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true + _ForwardIterator __m1 = __m; + _ForwardIterator __second_false = __last; + _Distance __len_half = __len - __len2; + while (__pred(*__m1)) + { + if (++__m1 == __last) + goto __second_half_done; + --__len_half; + } + // TTTFFFFFTTTF?????? + // f ff m m1 l + __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit); +__second_half_done: + // TTTFFFFFTTTTTFFFFF + // f ff m sf l + return _VSTD::rotate(__first_false, __m, __second_false); + // TTTTTTTTFFFFFFFFFF + // | +} + +struct __return_temporary_buffer +{ + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_VSTD::return_temporary_buffer(__p);} +}; + +template <class _Predicate, class _ForwardIterator> +_ForwardIterator +__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, + forward_iterator_tag) +{ + const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment + // Either prove all true and return __first or point to first false + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + // We now have a reduced range [__first, __last) + // *__first is known to be false + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + difference_type __len = _VSTD::distance(__first, __last); + pair<value_type*, ptrdiff_t> __p(0, 0); + unique_ptr<value_type, __return_temporary_buffer> __h; + if (__len >= __alloc_limit) + { + __p = _VSTD::get_temporary_buffer<value_type>(__len); + __h.reset(__p.first); + } + return __stable_partition<typename add_lvalue_reference<_Predicate>::type> + (__first, __last, __pred, __len, __p, forward_iterator_tag()); +} + +template <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair> +_BidirectionalIterator +__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, + _Distance __len, _Pair __p, bidirectional_iterator_tag __bit) +{ + // *__first is known to be false + // *__last is known to be true + // __len >= 2 + if (__len == 2) + { + swap(*__first, *__last); + return __last; + } + if (__len == 3) + { + _BidirectionalIterator __m = __first; + if (__pred(*++__m)) + { + swap(*__first, *__m); + swap(*__m, *__last); + return __last; + } + swap(*__m, *__last); + swap(*__first, *__m); + return __m; + } + if (__len <= __p.second) + { // The buffer is big enough to use + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); + // Move the falses into the temporary buffer, and the trues to the front of the line + // Update __first to always point to the end of the trues + value_type* __t = __p.first; + ::new(__t) value_type(_VSTD::move(*__first)); + __d.__incr((value_type*)0); + ++__t; + _BidirectionalIterator __i = __first; + while (++__i != __last) + { + if (__pred(*__i)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + else + { + ::new(__t) value_type(_VSTD::move(*__i)); + __d.__incr((value_type*)0); + ++__t; + } + } + // move *__last, known to be true + *__first = _VSTD::move(*__i); + __i = ++__first; + // All trues now at start of range, all falses in buffer + // Move falses back into range, but don't mess up __first which points to first false + for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) + *__i = _VSTD::move(*__t2); + // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer + return __first; + } + // Else not enough buffer, do in place + // __len >= 4 + _BidirectionalIterator __m = __first; + _Distance __len2 = __len / 2; // __len2 >= 2 + _VSTD::advance(__m, __len2); + // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false + // F????????????????T + // f m l + _BidirectionalIterator __m1 = __m; + _BidirectionalIterator __first_false = __first; + _Distance __len_half = __len2; + while (!__pred(*--__m1)) + { + if (__m1 == __first) + goto __first_half_done; + --__len_half; + } + // F???TFFF?????????T + // f m1 m l + typedef typename add_lvalue_reference<_Predicate>::type _PredRef; + __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit); +__first_half_done: + // TTTFFFFF?????????T + // f ff m l + // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true + __m1 = __m; + _BidirectionalIterator __second_false = __last; + ++__second_false; + __len_half = __len - __len2; + while (__pred(*__m1)) + { + if (++__m1 == __last) + goto __second_half_done; + --__len_half; + } + // TTTFFFFFTTTF?????T + // f ff m m1 l + __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit); +__second_half_done: + // TTTFFFFFTTTTTFFFFF + // f ff m sf l + return _VSTD::rotate(__first_false, __m, __second_false); + // TTTTTTTTFFFFFFFFFF + // | +} + +template <class _Predicate, class _BidirectionalIterator> +_BidirectionalIterator +__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, + bidirectional_iterator_tag) +{ + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment + // Either prove all true and return __first or point to first false + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + // __first points to first false, everything prior to __first is already set. + // Either prove [__first, __last) is all false and return __first, or point __last to last true + do + { + if (__first == --__last) + return __first; + } while (!__pred(*__last)); + // We now have a reduced range [__first, __last] + // *__first is known to be false + // *__last is known to be true + // __len >= 2 + difference_type __len = _VSTD::distance(__first, __last) + 1; + pair<value_type*, ptrdiff_t> __p(0, 0); + unique_ptr<value_type, __return_temporary_buffer> __h; + if (__len >= __alloc_limit) + { + __p = _VSTD::get_temporary_buffer<value_type>(__len); + __h.reset(__p.first); + } + return __stable_partition<typename add_lvalue_reference<_Predicate>::type> + (__first, __last, __pred, __len, __p, bidirectional_iterator_tag()); +} + +template <class _ForwardIterator, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + return __stable_partition<typename add_lvalue_reference<_Predicate>::type> + (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); +} + +// is_sorted_until + +template <class _ForwardIterator, class _Compare> +_ForwardIterator +is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (__comp(*__i, *__first)) + return __i; + __first = __i; + } + } + return __last; +} + +template<class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +is_sorted_until(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// is_sorted + +template <class _ForwardIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + return _VSTD::is_sorted_until(__first, __last, __comp) == __last; +} + +template<class _ForwardIterator> +inline _LIBCPP_INLINE_VISIBILITY +bool +is_sorted(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// sort + +// stable, 2-3 compares, 0-2 swaps + +template <class _Compare, class _ForwardIterator> +unsigned +__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c) +{ + unsigned __r = 0; + if (!__c(*__y, *__x)) // if x <= y + { + if (!__c(*__z, *__y)) // if y <= z + return __r; // x <= y && y <= z + // x <= y && y > z + swap(*__y, *__z); // x <= z && y < z + __r = 1; + if (__c(*__y, *__x)) // if x > y + { + swap(*__x, *__y); // x < y && y <= z + __r = 2; + } + return __r; // x <= y && y < z + } + if (__c(*__z, *__y)) // x > y, if y > z + { + swap(*__x, *__z); // x < y && y < z + __r = 1; + return __r; + } + swap(*__x, *__y); // x > y && y <= z + __r = 1; // x < y && x <= z + if (__c(*__z, *__y)) // if y > z + { + swap(*__y, *__z); // x <= y && y < z + __r = 2; + } + return __r; +} // x <= y && y <= z + +// stable, 3-6 compares, 0-5 swaps + +template <class _Compare, class _ForwardIterator> +unsigned +__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, + _ForwardIterator __x4, _Compare __c) +{ + unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c); + if (__c(*__x4, *__x3)) + { + swap(*__x3, *__x4); + ++__r; + if (__c(*__x3, *__x2)) + { + swap(*__x2, *__x3); + ++__r; + if (__c(*__x2, *__x1)) + { + swap(*__x1, *__x2); + ++__r; + } + } + } + return __r; +} + +// stable, 4-10 compares, 0-9 swaps + +template <class _Compare, class _ForwardIterator> +unsigned +__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, + _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c) +{ + unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c); + if (__c(*__x5, *__x4)) + { + swap(*__x4, *__x5); + ++__r; + if (__c(*__x4, *__x3)) + { + swap(*__x3, *__x4); + ++__r; + if (__c(*__x3, *__x2)) + { + swap(*__x2, *__x3); + ++__r; + if (__c(*__x2, *__x1)) + { + swap(*__x1, *__x2); + ++__r; + } + } + } + } + return __r; +} + +// Assumes size > 0 +template <class _Compare, class _BirdirectionalIterator> +void +__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp) +{ + _BirdirectionalIterator __lm1 = __last; + for (--__lm1; __first != __lm1; ++__first) + { + _BirdirectionalIterator __i = _VSTD::min_element<_BirdirectionalIterator, + typename add_lvalue_reference<_Compare>::type> + (__first, __last, __comp); + if (__i != __first) + swap(*__first, *__i); + } +} + +template <class _Compare, class _BirdirectionalIterator> +void +__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp) +{ + typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type; + if (__first != __last) + { + _BirdirectionalIterator __i = __first; + for (++__i; __i != __last; ++__i) + { + _BirdirectionalIterator __j = __i; + value_type __t(_VSTD::move(*__j)); + for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j) + *__j = _VSTD::move(*__k); + *__j = _VSTD::move(__t); + } + } +} + +template <class _Compare, class _RandomAccessIterator> +void +__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + _RandomAccessIterator __j = __first+2; + __sort3<_Compare>(__first, __first+1, __j, __comp); + for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) + { + if (__comp(*__i, *__j)) + { + value_type __t(_VSTD::move(*__i)); + _RandomAccessIterator __k = __j; + __j = __i; + do + { + *__j = _VSTD::move(*__k); + __j = __k; + } while (__j != __first && __comp(__t, *--__k)); + *__j = _VSTD::move(__t); + } + __j = __i; + } +} + +template <class _Compare, class _RandomAccessIterator> +bool +__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + switch (__last - __first) + { + case 0: + case 1: + return true; + case 2: + if (__comp(*--__last, *__first)) + swap(*__first, *__last); + return true; + case 3: + _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp); + return true; + case 4: + _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp); + return true; + case 5: + _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp); + return true; + } + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + _RandomAccessIterator __j = __first+2; + __sort3<_Compare>(__first, __first+1, __j, __comp); + const unsigned __limit = 8; + unsigned __count = 0; + for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) + { + if (__comp(*__i, *__j)) + { + value_type __t(_VSTD::move(*__i)); + _RandomAccessIterator __k = __j; + __j = __i; + do + { + *__j = _VSTD::move(*__k); + __j = __k; + } while (__j != __first && __comp(__t, *--__k)); + *__j = _VSTD::move(__t); + if (++__count == __limit) + return ++__i == __last; + } + __j = __i; + } + return true; +} + +template <class _Compare, class _BirdirectionalIterator> +void +__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1, + typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp) +{ + typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type; + if (__first1 != __last1) + { + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h(__first2, __d); + value_type* __last2 = __first2; + ::new(__last2) value_type(_VSTD::move(*__first1)); + __d.__incr((value_type*)0); + for (++__last2; ++__first1 != __last1; ++__last2) + { + value_type* __j2 = __last2; + value_type* __i2 = __j2; + if (__comp(*__first1, *--__i2)) + { + ::new(__j2) value_type(_VSTD::move(*__i2)); + __d.__incr((value_type*)0); + for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2) + *__j2 = _VSTD::move(*__i2); + *__j2 = _VSTD::move(*__first1); + } + else + { + ::new(__j2) value_type(_VSTD::move(*__first1)); + __d.__incr((value_type*)0); + } + } + __h.release(); + } +} + +template <class _Compare, class _RandomAccessIterator> +void +__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + // _Compare is known to be a reference type + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + const difference_type __limit = is_trivially_copy_constructible<value_type>::value && + is_trivially_copy_assignable<value_type>::value ? 30 : 6; + while (true) + { + __restart: + difference_type __len = __last - __first; + switch (__len) + { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + swap(*__first, *__last); + return; + case 3: + _VSTD::__sort3<_Compare>(__first, __first+1, --__last, __comp); + return; + case 4: + _VSTD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp); + return; + case 5: + _VSTD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp); + return; + } + if (__len <= __limit) + { + _VSTD::__insertion_sort_3<_Compare>(__first, __last, __comp); + return; + } + // __len > 5 + _RandomAccessIterator __m = __first; + _RandomAccessIterator __lm1 = __last; + --__lm1; + unsigned __n_swaps; + { + difference_type __delta; + if (__len >= 1000) + { + __delta = __len/2; + __m += __delta; + __delta /= 2; + __n_swaps = _VSTD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp); + } + else + { + __delta = __len/2; + __m += __delta; + __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, __lm1, __comp); + } + } + // *__m is median + // partition [__first, __m) < *__m and *__m <= [__m, __last) + // (this inhibits tossing elements equivalent to __m around unnecessarily) + _RandomAccessIterator __i = __first; + _RandomAccessIterator __j = __lm1; + // j points beyond range to be tested, *__m is known to be <= *__lm1 + // The search going up is known to be guarded but the search coming down isn't. + // Prime the downward search with a guard. + if (!__comp(*__i, *__m)) // if *__first == *__m + { + // *__first == *__m, *__first doesn't go in first part + // manually guard downward moving __j against __i + while (true) + { + if (__i == --__j) + { + // *__first == *__m, *__m <= all other elements + // Parition instead into [__first, __i) == *__first and *__first < [__i, __last) + ++__i; // __first + 1 + __j = __last; + if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1) + { + while (true) + { + if (__i == __j) + return; // [__first, __last) all equivalent elements + if (__comp(*__first, *__i)) + { + swap(*__i, *__j); + ++__n_swaps; + ++__i; + break; + } + ++__i; + } + } + // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1 + if (__i == __j) + return; + while (true) + { + while (!__comp(*__first, *__i)) + ++__i; + while (__comp(*__first, *--__j)) + ; + if (__i >= __j) + break; + swap(*__i, *__j); + ++__n_swaps; + ++__i; + } + // [__first, __i) == *__first and *__first < [__i, __last) + // The first part is sorted, sort the secod part + // _VSTD::__sort<_Compare>(__i, __last, __comp); + __first = __i; + goto __restart; + } + if (__comp(*__j, *__m)) + { + swap(*__i, *__j); + ++__n_swaps; + break; // found guard for downward moving __j, now use unguarded partition + } + } + } + // It is known that *__i < *__m + ++__i; + // j points beyond range to be tested, *__m is known to be <= *__lm1 + // if not yet partitioned... + if (__i < __j) + { + // known that *(__i - 1) < *__m + // known that __i <= __m + while (true) + { + // __m still guards upward moving __i + while (__comp(*__i, *__m)) + ++__i; + // It is now known that a guard exists for downward moving __j + while (!__comp(*--__j, *__m)) + ; + if (__i > __j) + break; + swap(*__i, *__j); + ++__n_swaps; + // It is known that __m != __j + // If __m just moved, follow it + if (__m == __i) + __m = __j; + ++__i; + } + } + // [__first, __i) < *__m and *__m <= [__i, __last) + if (__i != __m && __comp(*__m, *__i)) + { + swap(*__i, *__m); + ++__n_swaps; + } + // [__first, __i) < *__i and *__i <= [__i+1, __last) + // If we were given a perfect partition, see if insertion sort is quick... + if (__n_swaps == 0) + { + bool __fs = _VSTD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp); + if (_VSTD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp)) + { + if (__fs) + return; + __last = __i; + continue; + } + else + { + if (__fs) + { + __first = ++__i; + continue; + } + } + } + // sort smaller range with recursive call and larger with tail recursion elimination + if (__i - __first < __last - __i) + { + _VSTD::__sort<_Compare>(__first, __i, __comp); + // _VSTD::__sort<_Compare>(__i+1, __last, __comp); + __first = ++__i; + } + else + { + _VSTD::__sort<_Compare>(__i+1, __last, __comp); + // _VSTD::__sort<_Compare>(__first, __i, __comp); + __last = __i; + } + } +} + +// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __sort<_Comp_ref>(__first, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __sort<_Comp_ref>(__first, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +sort(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +sort(_Tp** __first, _Tp** __last) +{ + _VSTD::sort((size_t*)__first, (size_t*)__last, __less<size_t>()); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last) +{ + _VSTD::sort(__first.base(), __last.base()); +} + +template <class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp) +{ + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp); +} + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4231) +#endif // _MSC_VER +extern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&); +extern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); +extern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); +extern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); +extern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&); +extern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); +extern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&); +extern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); +extern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&); +extern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); +extern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); +extern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); +extern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&); +extern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&); +extern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); + +extern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&); +extern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); +extern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); +extern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); +extern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&); +extern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); +extern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&); +extern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); +extern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&); +extern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); +extern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); +extern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); +extern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&); +extern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&); +extern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); + +extern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&); +#ifdef _MSC_VER +#pragma warning( pop ) +#endif // _MSC_VER + +// lower_bound + +template <class _Compare, class _ForwardIterator, class _Tp> +_ForwardIterator +__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + difference_type __len = _VSTD::distance(__first, __last); + while (__len != 0) + { + difference_type __l2 = __len / 2; + _ForwardIterator __m = __first; + _VSTD::advance(__m, __l2); + if (__comp(*__m, __value_)) + { + __first = ++__m; + __len -= __l2 + 1; + } + else + __len = __l2; + } + return __first; +} + +template <class _ForwardIterator, class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __lower_bound<_Comp_ref>(__first, __last, __value_, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __lower_bound<_Comp_ref>(__first, __last, __value_, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + return _VSTD::lower_bound(__first, __last, __value_, + __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); +} + +// upper_bound + +template <class _Compare, class _ForwardIterator, class _Tp> +_ForwardIterator +__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + difference_type __len = _VSTD::distance(__first, __last); + while (__len != 0) + { + difference_type __l2 = __len / 2; + _ForwardIterator __m = __first; + _VSTD::advance(__m, __l2); + if (__comp(__value_, *__m)) + __len = __l2; + else + { + __first = ++__m; + __len -= __l2 + 1; + } + } + return __first; +} + +template <class _ForwardIterator, class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __upper_bound<_Comp_ref>(__first, __last, __value_, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __upper_bound<_Comp_ref>(__first, __last, __value_, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + return _VSTD::upper_bound(__first, __last, __value_, + __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>()); +} + +// equal_range + +template <class _Compare, class _ForwardIterator, class _Tp> +pair<_ForwardIterator, _ForwardIterator> +__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + difference_type __len = _VSTD::distance(__first, __last); + while (__len != 0) + { + difference_type __l2 = __len / 2; + _ForwardIterator __m = __first; + _VSTD::advance(__m, __l2); + if (__comp(*__m, __value_)) + { + __first = ++__m; + __len -= __l2 + 1; + } + else if (__comp(__value_, *__m)) + { + __last = __m; + __len = __l2; + } + else + { + _ForwardIterator __mp1 = __m; + return pair<_ForwardIterator, _ForwardIterator> + ( + __lower_bound<_Compare>(__first, __m, __value_, __comp), + __upper_bound<_Compare>(++__mp1, __last, __value_, __comp) + ); + } + } + return pair<_ForwardIterator, _ForwardIterator>(__first, __first); +} + +template <class _ForwardIterator, class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +pair<_ForwardIterator, _ForwardIterator> +equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __equal_range<_Comp_ref>(__first, __last, __value_, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __equal_range<_Comp_ref>(__first, __last, __value_, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +pair<_ForwardIterator, _ForwardIterator> +equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + return _VSTD::equal_range(__first, __last, __value_, + __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); +} + +// binary_search + +template <class _Compare, class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ + __first = __lower_bound<_Compare>(__first, __last, __value_, __comp); + return __first != __last && !__comp(__value_, *__first); +} + +template <class _ForwardIterator, class _Tp, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __binary_search<_Comp_ref>(__first, __last, __value_, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __binary_search<_Comp_ref>(__first, __last, __value_, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_) +{ + return _VSTD::binary_search(__first, __last, __value_, + __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); +} + +// merge + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +_OutputIterator +__merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + return _VSTD::copy(__first1, __last1, __result); + if (__comp(*__first2, *__first1)) + { + *__result = *__first2; + ++__first2; + } + else + { + *__result = *__first1; + ++__first1; + } + } + return _VSTD::copy(__first2, __last2, __result); +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return _VSTD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>()); +} + +// inplace_merge + +template <class _Compare, class _BidirectionalIterator> +void +__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, + _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1, + typename iterator_traits<_BidirectionalIterator>::difference_type __len2, + typename iterator_traits<_BidirectionalIterator>::value_type* __buff) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer; + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); + if (__len1 <= __len2) + { + value_type* __p = __buff; + for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p) + ::new(__p) value_type(_VSTD::move(*__i)); + __merge<_Compare>(move_iterator<value_type*>(__buff), + move_iterator<value_type*>(__p), + move_iterator<_BidirectionalIterator>(__middle), + move_iterator<_BidirectionalIterator>(__last), + __first, __comp); + } + else + { + value_type* __p = __buff; + for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p) + ::new(__p) value_type(_VSTD::move(*__i)); + typedef reverse_iterator<_BidirectionalIterator> _RBi; + typedef reverse_iterator<value_type*> _Rv; + __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)), + move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)), + _RBi(__last), __negate<_Compare>(__comp)); + } +} + +template <class _Compare, class _BidirectionalIterator> +void +__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, + _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1, + typename iterator_traits<_BidirectionalIterator>::difference_type __len2, + typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + while (true) + { + // if __middle == __last, we're done + if (__len2 == 0) + return; + // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0 + for (; true; ++__first, --__len1) + { + if (__len1 == 0) + return; + if (__comp(*__middle, *__first)) + break; + } + if (__len1 <= __buff_size || __len2 <= __buff_size) + { + __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff); + return; + } + // __first < __middle < __last + // *__first > *__middle + // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that + // all elements in: + // [__first, __m1) <= [__middle, __m2) + // [__middle, __m2) < [__m1, __middle) + // [__m1, __middle) <= [__m2, __last) + // and __m1 or __m2 is in the middle of its range + _BidirectionalIterator __m1; // "median" of [__first, __middle) + _BidirectionalIterator __m2; // "median" of [__middle, __last) + difference_type __len11; // distance(__first, __m1) + difference_type __len21; // distance(__middle, __m2) + // binary search smaller range + if (__len1 < __len2) + { // __len >= 1, __len2 >= 2 + __len21 = __len2 / 2; + __m2 = __middle; + _VSTD::advance(__m2, __len21); + __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp); + __len11 = _VSTD::distance(__first, __m1); + } + else + { + if (__len1 == 1) + { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1 + // It is known *__first > *__middle + swap(*__first, *__middle); + return; + } + // __len1 >= 2, __len2 >= 1 + __len11 = __len1 / 2; + __m1 = __first; + _VSTD::advance(__m1, __len11); + __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp); + __len21 = _VSTD::distance(__middle, __m2); + } + difference_type __len12 = __len1 - __len11; // distance(__m1, __middle) + difference_type __len22 = __len2 - __len21; // distance(__m2, __last) + // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) + // swap middle two partitions + __middle = _VSTD::rotate(__m1, __middle, __m2); + // __len12 and __len21 now have swapped meanings + // merge smaller range with recurisve call and larger with tail recursion elimination + if (__len11 + __len21 < __len12 + __len22) + { + __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size); +// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size); + __first = __middle; + __middle = __m2; + __len1 = __len12; + __len2 = __len22; + } + else + { + __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size); +// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size); + __last = __middle; + __middle = __m1; + __len1 = __len11; + __len2 = __len21; + } + } +} + +template <class _Tp> +struct __inplace_merge_switch +{ + static const unsigned value = is_trivially_copy_assignable<_Tp>::value; +}; + +template <class _BidirectionalIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, + _Compare __comp) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + difference_type __len1 = _VSTD::distance(__first, __middle); + difference_type __len2 = _VSTD::distance(__middle, __last); + difference_type __buf_size = _VSTD::min(__len1, __len2); + pair<value_type*, ptrdiff_t> __buf(0, 0); + unique_ptr<value_type, __return_temporary_buffer> __h; + if (__inplace_merge_switch<value_type>::value && __buf_size > 8) + { + __buf = _VSTD::get_temporary_buffer<value_type>(__buf_size); + __h.reset(__buf.first); + } +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2, + __buf.first, __buf.second); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return _VSTD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2, + __buf.first, __buf.second); +#endif // _LIBCPP_DEBUG2 +} + +template <class _BidirectionalIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last) +{ + _VSTD::inplace_merge(__first, __middle, __last, + __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); +} + +// stable_sort + +template <class _Compare, class _InputIterator1, class _InputIterator2> +void +__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp) +{ + typedef typename iterator_traits<_InputIterator1>::value_type value_type; + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h(__result, __d); + for (; true; ++__result) + { + if (__first1 == __last1) + { + for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0)) + ::new (__result) value_type(_VSTD::move(*__first2)); + __h.release(); + return; + } + if (__first2 == __last2) + { + for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0)) + ::new (__result) value_type(_VSTD::move(*__first1)); + __h.release(); + return; + } + if (__comp(*__first2, *__first1)) + { + ::new (__result) value_type(_VSTD::move(*__first2)); + __d.__incr((value_type*)0); + ++__first2; + } + else + { + ::new (__result) value_type(_VSTD::move(*__first1)); + __d.__incr((value_type*)0); + ++__first1; + } + } +} + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +void +__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) +{ + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + { + for (; __first1 != __last1; ++__first1, ++__result) + *__result = _VSTD::move(*__first1); + return; + } + if (__comp(*__first2, *__first1)) + { + *__result = _VSTD::move(*__first2); + ++__first2; + } + else + { + *__result = _VSTD::move(*__first1); + ++__first1; + } + } + for (; __first2 != __last2; ++__first2, ++__result) + *__result = _VSTD::move(*__first2); +} + +template <class _Compare, class _RandomAccessIterator> +void +__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size); + +template <class _Compare, class _RandomAccessIterator> +void +__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __first2) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + switch (__len) + { + case 0: + return; + case 1: + ::new(__first2) value_type(_VSTD::move(*__first1)); + return; + case 2: + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h2(__first2, __d); + if (__comp(*--__last1, *__first1)) + { + ::new(__first2) value_type(_VSTD::move(*__last1)); + __d.__incr((value_type*)0); + ++__first2; + ::new(__first2) value_type(_VSTD::move(*__first1)); + } + else + { + ::new(__first2) value_type(_VSTD::move(*__first1)); + __d.__incr((value_type*)0); + ++__first2; + ::new(__first2) value_type(_VSTD::move(*__last1)); + } + __h2.release(); + return; + } + if (__len <= 8) + { + __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp); + return; + } + typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; + _RandomAccessIterator __m = __first1 + __l2; + __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2); + __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2); + __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp); +} + +template <class _Tp> +struct __stable_sort_switch +{ + static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value; +}; + +template <class _Compare, class _RandomAccessIterator> +void +__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + switch (__len) + { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + swap(*__first, *__last); + return; + } + if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value)) + { + __insertion_sort<_Compare>(__first, __last, __comp); + return; + } + typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; + _RandomAccessIterator __m = __first + __l2; + if (__len <= __buff_size) + { + __destruct_n __d(0); + unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); + __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff); + __d.__set(__l2, (value_type*)0); + __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2); + __d.__set(__len, (value_type*)0); + __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp); +// __merge<_Compare>(move_iterator<value_type*>(__buff), +// move_iterator<value_type*>(__buff + __l2), +// move_iterator<_RandomAccessIterator>(__buff + __l2), +// move_iterator<_RandomAccessIterator>(__buff + __len), +// __first, __comp); + return; + } + __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size); + __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size); + __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size); +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __len = __last - __first; + pair<value_type*, ptrdiff_t> __buf(0, 0); + unique_ptr<value_type, __return_temporary_buffer> __h; + if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value)) + { + __buf = _VSTD::get_temporary_buffer<value_type>(__len); + __h.reset(__buf.first); + } +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// is_heap_until + +template <class _RandomAccessIterator, class _Compare> +_RandomAccessIterator +is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + typedef typename _VSTD::iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __len = __last - __first; + difference_type __p = 0; + difference_type __c = 1; + _RandomAccessIterator __pp = __first; + while (__c < __len) + { + _RandomAccessIterator __cp = __first + __c; + if (__comp(*__pp, *__cp)) + return __cp; + ++__c; + ++__cp; + if (__c == __len) + return __last; + if (__comp(*__pp, *__cp)) + return __cp; + ++__p; + ++__pp; + __c = 2 * __p + 1; + } + return __last; +} + +template<class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +_RandomAccessIterator +is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + return _VSTD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// is_heap + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + return _VSTD::is_heap_until(__first, __last, __comp) == __last; +} + +template<class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +bool +is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + return _VSTD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// push_heap + +template <class _Compare, class _RandomAccessIterator> +void +__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + if (__len > 1) + { + difference_type __p = 0; + _RandomAccessIterator __pp = __first; + difference_type __c = 2; + _RandomAccessIterator __cp = __first + __c; + if (__c == __len || __comp(*__cp, *(__cp - 1))) + { + --__c; + --__cp; + } + if (__comp(*__pp, *__cp)) + { + value_type __t(_VSTD::move(*__pp)); + do + { + *__pp = _VSTD::move(*__cp); + __pp = __cp; + __p = __c; + __c = (__p + 1) * 2; + if (__c > __len) + break; + __cp = __first + __c; + if (__c == __len || __comp(*__cp, *(__cp - 1))) + { + --__c; + --__cp; + } + } while (__comp(__t, *__cp)); + *__pp = _VSTD::move(__t); + } + } +} + +template <class _Compare, class _RandomAccessIterator> +void +__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + if (__len > 1) + { + __len = (__len - 2) / 2; + _RandomAccessIterator __ptr = __first + __len; + if (__comp(*__ptr, *--__last)) + { + value_type __t(_VSTD::move(*__last)); + do + { + *__last = _VSTD::move(*__ptr); + __last = __ptr; + if (__len == 0) + break; + __len = (__len - 1) / 2; + __ptr = __first + __len; + } while (__comp(*__ptr, __t)); + *__last = _VSTD::move(__t); + } + } +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// pop_heap + +template <class _Compare, class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) +{ + if (__len > 1) + { + swap(*__first, *--__last); + __push_heap_front<_Compare>(__first, __last, __comp, __len-1); + } +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// make_heap + +template <class _Compare, class _RandomAccessIterator> +void +__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __n = __last - __first; + if (__n > 1) + { + __last = __first; + ++__last; + for (difference_type __i = 1; __i < __n;) + __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i); + } +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __make_heap<_Comp_ref>(__first, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __make_heap<_Comp_ref>(__first, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// sort_heap + +template <class _Compare, class _RandomAccessIterator> +void +__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + for (difference_type __n = __last - __first; __n > 1; --__last, --__n) + __pop_heap<_Compare>(__first, __last, __comp, __n); +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __sort_heap<_Comp_ref>(__first, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __sort_heap<_Comp_ref>(__first, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + _VSTD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// partial_sort + +template <class _Compare, class _RandomAccessIterator> +void +__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, + _Compare __comp) +{ + __make_heap<_Compare>(__first, __middle, __comp); + typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first; + for (_RandomAccessIterator __i = __middle; __i != __last; ++__i) + { + if (__comp(*__i, *__first)) + { + swap(*__i, *__first); + __push_heap_front<_Compare>(__first, __middle, __comp, __len); + } + } + __sort_heap<_Compare>(__first, __middle, __comp); +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, + _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __partial_sort<_Comp_ref>(__first, __middle, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __partial_sort<_Comp_ref>(__first, __middle, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last) +{ + _VSTD::partial_sort(__first, __middle, __last, + __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// partial_sort_copy + +template <class _Compare, class _InputIterator, class _RandomAccessIterator> +_RandomAccessIterator +__partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp) +{ + _RandomAccessIterator __r = __result_first; + if (__r != __result_last) + { + typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0; + for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len) + *__r = *__first; + __make_heap<_Compare>(__result_first, __r, __comp); + for (; __first != __last; ++__first) + if (__comp(*__first, *__result_first)) + { + *__result_first = *__first; + __push_heap_front<_Compare>(__result_first, __r, __comp, __len); + } + __sort_heap<_Compare>(__result_first, __r, __comp); + } + return __r; +} + +template <class _InputIterator, class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_RandomAccessIterator +partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator, class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +_RandomAccessIterator +partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, _RandomAccessIterator __result_last) +{ + return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last, + __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// nth_element + +template <class _Compare, class _RandomAccessIterator> +void +__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) +{ + // _Compare is known to be a reference type + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + const difference_type __limit = 7; + while (true) + { + __restart: + if (__nth == __last) + return; + difference_type __len = __last - __first; + switch (__len) + { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + swap(*__first, *__last); + return; + case 3: + { + _RandomAccessIterator __m = __first; + _VSTD::__sort3<_Compare>(__first, ++__m, --__last, __comp); + return; + } + } + if (__len <= __limit) + { + __selection_sort<_Compare>(__first, __last, __comp); + return; + } + // __len > __limit >= 3 + _RandomAccessIterator __m = __first + __len/2; + _RandomAccessIterator __lm1 = __last; + unsigned __n_swaps = _VSTD::__sort3<_Compare>(__first, __m, --__lm1, __comp); + // *__m is median + // partition [__first, __m) < *__m and *__m <= [__m, __last) + // (this inhibits tossing elements equivalent to __m around unnecessarily) + _RandomAccessIterator __i = __first; + _RandomAccessIterator __j = __lm1; + // j points beyond range to be tested, *__lm1 is known to be <= *__m + // The search going up is known to be guarded but the search coming down isn't. + // Prime the downward search with a guard. + if (!__comp(*__i, *__m)) // if *__first == *__m + { + // *__first == *__m, *__first doesn't go in first part + // manually guard downward moving __j against __i + while (true) + { + if (__i == --__j) + { + // *__first == *__m, *__m <= all other elements + // Parition instead into [__first, __i) == *__first and *__first < [__i, __last) + ++__i; // __first + 1 + __j = __last; + if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1) + { + while (true) + { + if (__i == __j) + return; // [__first, __last) all equivalent elements + if (__comp(*__first, *__i)) + { + swap(*__i, *__j); + ++__n_swaps; + ++__i; + break; + } + ++__i; + } + } + // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1 + if (__i == __j) + return; + while (true) + { + while (!__comp(*__first, *__i)) + ++__i; + while (__comp(*__first, *--__j)) + ; + if (__i >= __j) + break; + swap(*__i, *__j); + ++__n_swaps; + ++__i; + } + // [__first, __i) == *__first and *__first < [__i, __last) + // The first part is sorted, + if (__nth < __i) + return; + // __nth_element the secod part + // __nth_element<_Compare>(__i, __nth, __last, __comp); + __first = __i; + goto __restart; + } + if (__comp(*__j, *__m)) + { + swap(*__i, *__j); + ++__n_swaps; + break; // found guard for downward moving __j, now use unguarded partition + } + } + } + ++__i; + // j points beyond range to be tested, *__lm1 is known to be <= *__m + // if not yet partitioned... + if (__i < __j) + { + // known that *(__i - 1) < *__m + while (true) + { + // __m still guards upward moving __i + while (__comp(*__i, *__m)) + ++__i; + // It is now known that a guard exists for downward moving __j + while (!__comp(*--__j, *__m)) + ; + if (__i >= __j) + break; + swap(*__i, *__j); + ++__n_swaps; + // It is known that __m != __j + // If __m just moved, follow it + if (__m == __i) + __m = __j; + ++__i; + } + } + // [__first, __i) < *__m and *__m <= [__i, __last) + if (__i != __m && __comp(*__m, *__i)) + { + swap(*__i, *__m); + ++__n_swaps; + } + // [__first, __i) < *__i and *__i <= [__i+1, __last) + if (__nth == __i) + return; + if (__n_swaps == 0) + { + // We were given a perfectly partitioned sequence. Coincidence? + if (__nth < __i) + { + // Check for [__first, __i) already sorted + __j = __m = __first; + while (++__j != __i) + { + if (__comp(*__j, *__m)) + // not yet sorted, so sort + goto not_sorted; + __m = __j; + } + // [__first, __i) sorted + return; + } + else + { + // Check for [__i, __last) already sorted + __j = __m = __i; + while (++__j != __last) + { + if (__comp(*__j, *__m)) + // not yet sorted, so sort + goto not_sorted; + __m = __j; + } + // [__i, __last) sorted + return; + } + } +not_sorted: + // __nth_element on range containing __nth + if (__nth < __i) + { + // __nth_element<_Compare>(__first, __nth, __i, __comp); + __last = __i; + } + else + { + // __nth_element<_Compare>(__i+1, __nth, __last, __comp); + __first = ++__i; + } + } +} + +template <class _RandomAccessIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + __nth_element<_Comp_ref>(__first, __nth, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + __nth_element<_Comp_ref>(__first, __nth, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _RandomAccessIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last) +{ + _VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); +} + +// includes + +template <class _Compare, class _InputIterator1, class _InputIterator2> +bool +__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, + _Compare __comp) +{ + for (; __first2 != __last2; ++__first1) + { + if (__first1 == __last1 || __comp(*__first2, *__first1)) + return false; + if (!__comp(*__first1, *__first2)) + ++__first2; + } + return true; +} + +template <class _InputIterator1, class _InputIterator2, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, + _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2> +inline _LIBCPP_INLINE_VISIBILITY +bool +includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) +{ + return _VSTD::includes(__first1, __last1, __first2, __last2, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// set_union + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +_OutputIterator +__set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + return _VSTD::copy(__first1, __last1, __result); + if (__comp(*__first2, *__first1)) + { + *__result = *__first2; + ++__first2; + } + else + { + *__result = *__first1; + if (!__comp(*__first1, *__first2)) + ++__first2; + ++__first1; + } + } + return _VSTD::copy(__first2, __last2, __result); +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_union(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + return _VSTD::set_union(__first1, __last1, __first2, __last2, __result, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// set_intersection + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +_OutputIterator +__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + while (__first1 != __last1 && __first2 != __last2) + { + if (__comp(*__first1, *__first2)) + ++__first1; + else + { + if (!__comp(*__first2, *__first1)) + { + *__result = *__first1; + ++__result; + ++__first1; + } + ++__first2; + } + } + return __result; +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + return _VSTD::set_intersection(__first1, __last1, __first2, __last2, __result, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// set_difference + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +_OutputIterator +__set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + while (__first1 != __last1) + { + if (__first2 == __last2) + return _VSTD::copy(__first1, __last1, __result); + if (__comp(*__first1, *__first2)) + { + *__result = *__first1; + ++__result; + ++__first1; + } + else + { + if (!__comp(*__first2, *__first1)) + ++__first1; + ++__first2; + } + } + return __result; +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + return _VSTD::set_difference(__first1, __last1, __first2, __last2, __result, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// set_symmetric_difference + +template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> +_OutputIterator +__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + while (__first1 != __last1) + { + if (__first2 == __last2) + return _VSTD::copy(__first1, __last1, __result); + if (__comp(*__first1, *__first2)) + { + *__result = *__first1; + ++__result; + ++__first1; + } + else + { + if (__comp(*__first2, *__first1)) + { + *__result = *__first2; + ++__result; + } + else + ++__first1; + ++__first2; + } + } + return _VSTD::copy(__first2, __last2, __result); +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + return _VSTD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// lexicographical_compare + +template <class _Compare, class _InputIterator1, class _InputIterator2> +bool +__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) +{ + for (; __first2 != __last2; ++__first1, ++__first2) + { + if (__first1 == __last1 || __comp(*__first1, *__first2)) + return true; + if (__comp(*__first2, *__first1)) + return false; + } + return false; +} + +template <class _InputIterator1, class _InputIterator2, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _InputIterator1, class _InputIterator2> +inline _LIBCPP_INLINE_VISIBILITY +bool +lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) +{ + return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2, + __less<typename iterator_traits<_InputIterator1>::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +// next_permutation + +template <class _Compare, class _BidirectionalIterator> +bool +__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ + _BidirectionalIterator __i = __last; + if (__first == __last || __first == --__i) + return false; + while (true) + { + _BidirectionalIterator __ip1 = __i; + if (__comp(*--__i, *__ip1)) + { + _BidirectionalIterator __j = __last; + while (!__comp(*__i, *--__j)) + ; + swap(*__i, *__j); + _VSTD::reverse(__ip1, __last); + return true; + } + if (__i == __first) + { + _VSTD::reverse(__first, __last); + return false; + } + } +} + +template <class _BidirectionalIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __next_permutation<_Comp_ref>(__first, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __next_permutation<_Comp_ref>(__first, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _BidirectionalIterator> +inline _LIBCPP_INLINE_VISIBILITY +bool +next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + return _VSTD::next_permutation(__first, __last, + __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); +} + +// prev_permutation + +template <class _Compare, class _BidirectionalIterator> +bool +__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ + _BidirectionalIterator __i = __last; + if (__first == __last || __first == --__i) + return false; + while (true) + { + _BidirectionalIterator __ip1 = __i; + if (__comp(*__ip1, *--__i)) + { + _BidirectionalIterator __j = __last; + while (!__comp(*--__j, *__i)) + ; + swap(*__i, *__j); + _VSTD::reverse(__ip1, __last); + return true; + } + if (__i == __first) + { + _VSTD::reverse(__first, __last); + return false; + } + } +} + +template <class _BidirectionalIterator, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +bool +prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ +#ifdef _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; + __debug_less<_Compare> __c(__comp); + return __prev_permutation<_Comp_ref>(__first, __last, __c); +#else // _LIBCPP_DEBUG2 + typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; + return __prev_permutation<_Comp_ref>(__first, __last, __comp); +#endif // _LIBCPP_DEBUG2 +} + +template <class _BidirectionalIterator> +inline _LIBCPP_INLINE_VISIBILITY +bool +prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + return _VSTD::prev_permutation(__first, __last, + __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + _Tp +>::type +__rotate_left(_Tp __t, _Tp __n = 1) +{ + const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1); + __n &= __bits; + return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n))); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + _Tp +>::type +__rotate_right(_Tp __t, _Tp __n = 1) +{ + const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1); + __n &= __bits; + return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_ALGORITHM diff --git a/contrib/libc++/include/array b/contrib/libc++/include/array new file mode 100644 index 0000000..c11f4bd --- /dev/null +++ b/contrib/libc++/include/array @@ -0,0 +1,338 @@ +// -*- C++ -*- +//===---------------------------- array -----------------------------------===// +// +// 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_ARRAY +#define _LIBCPP_ARRAY + +/* + array synopsis + +namespace std +{ +template <class T, size_t N > +struct array +{ + // types: + typedef T & reference; + typedef const T & const_reference; + typedef implementation defined iterator; + typedef implementation defined const_iterator; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + // No explicit construct/copy/destroy for aggregate type + void fill(const T& u); + void swap(array& a) noexcept(noexcept(swap(declval<T&>(), declval<T&>()))); + + // iterators: + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + constexpr size_type size() const noexcept; + constexpr size_type max_size() const noexcept; + bool empty() const noexcept; + + // element access: + reference operator[](size_type n); + const_reference operator[](size_type n) const; + const_reference at(size_type n) const; + reference at(size_type n); + + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + T* data() noexcept; + const T* data() const noexcept; +}; + +template <class T, size_t N> + bool operator==(const array<T,N>& x, const array<T,N>& y); +template <class T, size_t N> + bool operator!=(const array<T,N>& x, const array<T,N>& y); +template <class T, size_t N> + bool operator<(const array<T,N>& x, const array<T,N>& y); +template <class T, size_t N> + bool operator>(const array<T,N>& x, const array<T,N>& y); +template <class T, size_t N> + bool operator<=(const array<T,N>& x, const array<T,N>& y); +template <class T, size_t N> + bool operator>=(const array<T,N>& x, const array<T,N>& y); + +template <class T, size_t N > + void swap(array<T,N>& x, array<T,N>& y) noexcept(noexcept(x.swap(y))); + +template <class T> class tuple_size; +template <int I, class T> class tuple_element; +template <class T, size_t N> struct tuple_size<array<T, N>>; +template <int I, class T, size_t N> struct tuple_element<I, array<T, N>>; +template <int I, class T, size_t N> T& get(array<T, N>&) noexcept; +template <int I, class T, size_t N> const T& get(const array<T, N>&) noexcept; +template <int I, class T, size_t N> T&& get(array<T, N>&&) noexcept; + +} // std + +*/ + +#include <__config> +#include <__tuple> +#include <type_traits> +#include <utility> +#include <iterator> +#include <algorithm> +#include <stdexcept> +#if defined(_LIBCPP_NO_EXCEPTIONS) + #include <cassert> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, size_t _Size> +struct _LIBCPP_VISIBLE array +{ + // types: + typedef array __self; + typedef _Tp value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + value_type __elems_[_Size > 0 ? _Size : 1]; + + // No explicit construct/copy/destroy for aggregate type + _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u) + {_VSTD::fill_n(__elems_, _Size, __u);} + _LIBCPP_INLINE_VISIBILITY + void swap(array& __a) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) + {_VSTD::swap_ranges(__elems_, __elems_ + _Size, __a.__elems_);} + + // iterators: + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return iterator(__elems_);} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return const_iterator(__elems_);} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return iterator(__elems_ + _Size);} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return const_iterator(__elems_ + _Size);} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT {return rend();} + + // capacity: + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ size_type size() const _NOEXCEPT {return _Size;} + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ size_type max_size() const _NOEXCEPT {return _Size;} + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return _Size == 0;} + + // element access: + _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __elems_[__n];} + _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __elems_[__n];} + reference at(size_type __n); + const_reference at(size_type __n) const; + + _LIBCPP_INLINE_VISIBILITY reference front() {return __elems_[0];} + _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __elems_[0];} + _LIBCPP_INLINE_VISIBILITY reference back() {return __elems_[_Size > 0 ? _Size-1 : 0];} + _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __elems_[_Size > 0 ? _Size-1 : 0];} + + _LIBCPP_INLINE_VISIBILITY + value_type* data() _NOEXCEPT {return __elems_;} + _LIBCPP_INLINE_VISIBILITY + const value_type* data() const _NOEXCEPT {return __elems_;} +}; + +template <class _Tp, size_t _Size> +typename array<_Tp, _Size>::reference +array<_Tp, _Size>::at(size_type __n) +{ + if (__n >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("array::at"); +#else + assert(!"array::at out_of_range"); +#endif + return __elems_[__n]; +} + +template <class _Tp, size_t _Size> +typename array<_Tp, _Size>::const_reference +array<_Tp, _Size>::at(size_type __n) const +{ + if (__n >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("array::at"); +#else + assert(!"array::at out_of_range"); +#endif + return __elems_[__n]; +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return _VSTD::equal(__x.__elems_, __x.__elems_ + _Size, __y.__elems_); +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return _VSTD::lexicographical_compare(__x.__elems_, __x.__elems_ + _Size, __y.__elems_, __y.__elems_ + _Size); +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return __y < __x; +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +typename enable_if +< + __is_swappable<_Tp>::value, + void +>::type +swap(const array<_Tp, _Size>& __x, const array<_Tp, _Size>& __y) + _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) +{ + __x.swap(__y); +} + +template <class _Tp, size_t _Size> +class _LIBCPP_VISIBLE tuple_size<array<_Tp, _Size> > + : public integral_constant<size_t, _Size> {}; + +template <class _Tp, size_t _Size> +class _LIBCPP_VISIBLE tuple_size<const array<_Tp, _Size> > + : public integral_constant<size_t, _Size> {}; + +template <size_t _Ip, class _Tp, size_t _Size> +class _LIBCPP_VISIBLE tuple_element<_Ip, array<_Tp, _Size> > +{ +public: + typedef _Tp type; +}; + +template <size_t _Ip, class _Tp, size_t _Size> +class _LIBCPP_VISIBLE tuple_element<_Ip, const array<_Tp, _Size> > +{ +public: + typedef const _Tp type; +}; + +template <size_t _Ip, class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +_Tp& +get(array<_Tp, _Size>& __a) _NOEXCEPT +{ + return __a[_Ip]; +} + +template <size_t _Ip, class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +const _Tp& +get(const array<_Tp, _Size>& __a) _NOEXCEPT +{ + return __a[_Ip]; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <size_t _Ip, class _Tp, size_t _Size> +_LIBCPP_INLINE_VISIBILITY inline +_Tp&& +get(array<_Tp, _Size>&& __a) _NOEXCEPT +{ + return _VSTD::move(__a[_Ip]); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_ARRAY diff --git a/contrib/libc++/include/atomic b/contrib/libc++/include/atomic new file mode 100644 index 0000000..f2e428a --- /dev/null +++ b/contrib/libc++/include/atomic @@ -0,0 +1,1515 @@ +// -*- C++ -*- +//===--------------------------- atomic -----------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_ATOMIC +#define _LIBCPP_ATOMIC + +/* + atomic synopsis + +namespace std +{ + +// order and consistency + +typedef enum memory_order +{ + memory_order_relaxed, + memory_order_consume, // load-consume + memory_order_acquire, // load-acquire + memory_order_release, // store-release + memory_order_acq_rel, // store-release load-acquire + memory_order_seq_cst // store-release load-acquire +} memory_order; + +template <class T> T kill_dependency(T y); + +// lock-free property + +#define ATOMIC_CHAR_LOCK_FREE unspecified +#define ATOMIC_CHAR16_T_LOCK_FREE unspecified +#define ATOMIC_CHAR32_T_LOCK_FREE unspecified +#define ATOMIC_WCHAR_T_LOCK_FREE unspecified +#define ATOMIC_SHORT_LOCK_FREE unspecified +#define ATOMIC_INT_LOCK_FREE unspecified +#define ATOMIC_LONG_LOCK_FREE unspecified +#define ATOMIC_LLONG_LOCK_FREE unspecified + +// flag type and operations + +typedef struct atomic_flag +{ + bool test_and_set(memory_order m = memory_order_seq_cst) volatile; + bool test_and_set(memory_order m = memory_order_seq_cst); + void clear(memory_order m = memory_order_seq_cst) volatile; + void clear(memory_order m = memory_order_seq_cst); + atomic_flag() = default; + atomic_flag(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) volatile = delete; +} atomic_flag; + +bool + atomic_flag_test_and_set(volatile atomic_flag* obj); + +bool + atomic_flag_test_and_set(atomic_flag* obj); + +bool + atomic_flag_test_and_set_explicit(volatile atomic_flag* obj, + memory_order m); + +bool + atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m); + +void + atomic_flag_clear(volatile atomic_flag* obj); + +void + atomic_flag_clear(atomic_flag* obj); + +void + atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m); + +void + atomic_flag_clear_explicit(atomic_flag* obj, memory_order m); + +#define ATOMIC_FLAG_INIT see below +#define ATOMIC_VAR_INIT(value) see below + +template <class T> +struct atomic +{ + bool is_lock_free() const volatile; + bool is_lock_free() const; + void store(T desr, memory_order m = memory_order_seq_cst) volatile; + void store(T desr, memory_order m = memory_order_seq_cst); + T load(memory_order m = memory_order_seq_cst) const volatile; + T load(memory_order m = memory_order_seq_cst) const; + operator T() const volatile; + operator T() const; + T exchange(T desr, memory_order m = memory_order_seq_cst) volatile; + T exchange(T desr, memory_order m = memory_order_seq_cst); + bool compare_exchange_weak(T& expc, T desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f); + bool compare_exchange_strong(T& expc, T desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_strong(T& expc, T desr, + memory_order s, memory_order f); + bool compare_exchange_weak(T& expc, T desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_weak(T& expc, T desr, + memory_order m = memory_order_seq_cst); + bool compare_exchange_strong(T& expc, T desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_strong(T& expc, T desr, + memory_order m = memory_order_seq_cst); + + atomic() = default; + constexpr atomic(T desr); + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + T operator=(T) volatile; + T operator=(T); +}; + +template <> +struct atomic<integral> +{ + bool is_lock_free() const volatile; + bool is_lock_free() const; + void store(integral desr, memory_order m = memory_order_seq_cst) volatile; + void store(integral desr, memory_order m = memory_order_seq_cst); + integral load(memory_order m = memory_order_seq_cst) const volatile; + integral load(memory_order m = memory_order_seq_cst) const; + operator integral() const volatile; + operator integral() const; + integral exchange(integral desr, + memory_order m = memory_order_seq_cst) volatile; + integral exchange(integral desr, memory_order m = memory_order_seq_cst); + bool compare_exchange_weak(integral& expc, integral desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_weak(integral& expc, integral desr, + memory_order s, memory_order f); + bool compare_exchange_strong(integral& expc, integral desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_strong(integral& expc, integral desr, + memory_order s, memory_order f); + bool compare_exchange_weak(integral& expc, integral desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_weak(integral& expc, integral desr, + memory_order m = memory_order_seq_cst); + bool compare_exchange_strong(integral& expc, integral desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_strong(integral& expc, integral desr, + memory_order m = memory_order_seq_cst); + + integral + fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile; + integral fetch_add(integral op, memory_order m = memory_order_seq_cst); + integral + fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile; + integral fetch_sub(integral op, memory_order m = memory_order_seq_cst); + integral + fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile; + integral fetch_and(integral op, memory_order m = memory_order_seq_cst); + integral + fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile; + integral fetch_or(integral op, memory_order m = memory_order_seq_cst); + integral + fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile; + integral fetch_xor(integral op, memory_order m = memory_order_seq_cst); + + atomic() = default; + constexpr atomic(integral desr); + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + integral operator=(integral desr) volatile; + integral operator=(integral desr); + + integral operator++(int) volatile; + integral operator++(int); + integral operator--(int) volatile; + integral operator--(int); + integral operator++() volatile; + integral operator++(); + integral operator--() volatile; + integral operator--(); + integral operator+=(integral op) volatile; + integral operator+=(integral op); + integral operator-=(integral op) volatile; + integral operator-=(integral op); + integral operator&=(integral op) volatile; + integral operator&=(integral op); + integral operator|=(integral op) volatile; + integral operator|=(integral op); + integral operator^=(integral op) volatile; + integral operator^=(integral op); +}; + +template <class T> +struct atomic<T*> +{ + bool is_lock_free() const volatile; + bool is_lock_free() const; + void store(T* desr, memory_order m = memory_order_seq_cst) volatile; + void store(T* desr, memory_order m = memory_order_seq_cst); + T* load(memory_order m = memory_order_seq_cst) const volatile; + T* load(memory_order m = memory_order_seq_cst) const; + operator T*() const volatile; + operator T*() const; + T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile; + T* exchange(T* desr, memory_order m = memory_order_seq_cst); + bool compare_exchange_weak(T*& expc, T* desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_weak(T*& expc, T* desr, + memory_order s, memory_order f); + bool compare_exchange_strong(T*& expc, T* desr, + memory_order s, memory_order f) volatile; + bool compare_exchange_strong(T*& expc, T* desr, + memory_order s, memory_order f); + bool compare_exchange_weak(T*& expc, T* desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_weak(T*& expc, T* desr, + memory_order m = memory_order_seq_cst); + bool compare_exchange_strong(T*& expc, T* desr, + memory_order m = memory_order_seq_cst) volatile; + bool compare_exchange_strong(T*& expc, T* desr, + memory_order m = memory_order_seq_cst); + T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile; + T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst); + T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile; + T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst); + + atomic() = default; + constexpr atomic(T* desr); + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + T* operator=(T*) volatile; + T* operator=(T*); + T* operator++(int) volatile; + T* operator++(int); + T* operator--(int) volatile; + T* operator--(int); + T* operator++() volatile; + T* operator++(); + T* operator--() volatile; + T* operator--(); + T* operator+=(ptrdiff_t op) volatile; + T* operator+=(ptrdiff_t op); + T* operator-=(ptrdiff_t op) volatile; + T* operator-=(ptrdiff_t op); +}; + + +template <class T> + bool + atomic_is_lock_free(const volatile atomic<T>* obj); + +template <class T> + bool + atomic_is_lock_free(const atomic<T>* obj); + +template <class T> + void + atomic_init(volatile atomic<T>* obj, T desr); + +template <class T> + void + atomic_init(atomic<T>* obj, T desr); + +template <class T> + void + atomic_store(volatile atomic<T>* obj, T desr); + +template <class T> + void + atomic_store(atomic<T>* obj, T desr); + +template <class T> + void + atomic_store_explicit(volatile atomic<T>* obj, T desr, memory_order m); + +template <class T> + void + atomic_store_explicit(atomic<T>* obj, T desr, memory_order m); + +template <class T> + T + atomic_load(const volatile atomic<T>* obj); + +template <class T> + T + atomic_load(const atomic<T>* obj); + +template <class T> + T + atomic_load_explicit(const volatile atomic<T>* obj, memory_order m); + +template <class T> + T + atomic_load_explicit(const atomic<T>* obj, memory_order m); + +template <class T> + T + atomic_exchange(volatile atomic<T>* obj, T desr); + +template <class T> + T + atomic_exchange(atomic<T>* obj, T desr); + +template <class T> + T + atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m); + +template <class T> + T + atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m); + +template <class T> + bool + atomic_compare_exchange_weak(volatile atomic<T>* obj, T* expc, T desr); + +template <class T> + bool + atomic_compare_exchange_weak(atomic<T>* obj, T* expc, T desr); + +template <class T> + bool + atomic_compare_exchange_strong(volatile atomic<T>* obj, T* expc, T desr); + +template <class T> + bool + atomic_compare_exchange_strong(atomic<T>* obj, T* expc, T desr); + +template <class T> + bool + atomic_compare_exchange_weak_explicit(volatile atomic<T>* obj, T* expc, + T desr, + memory_order s, memory_order f); + +template <class T> + bool + atomic_compare_exchange_weak_explicit(atomic<T>* obj, T* expc, T desr, + memory_order s, memory_order f); + +template <class T> + bool + atomic_compare_exchange_strong_explicit(volatile atomic<T>* obj, + T* expc, T desr, + memory_order s, memory_order f); + +template <class T> + bool + atomic_compare_exchange_strong_explicit(atomic<T>* obj, T* expc, + T desr, + memory_order s, memory_order f); + +template <class Integral> + Integral + atomic_fetch_add(volatile atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_add(atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_add_explicit(volatile atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_add_explicit(atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_sub(volatile atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_sub(atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_sub_explicit(volatile atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_sub_explicit(atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_and(volatile atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_and(atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_and_explicit(volatile atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_and_explicit(atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_or(volatile atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_or(atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_or_explicit(volatile atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_or_explicit(atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_xor(volatile atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_xor(atomic<Integral>* obj, Integral op); + +template <class Integral> + Integral + atomic_fetch_xor_explicit(volatile atomic<Integral>* obj, Integral op, + memory_order m); +template <class Integral> + Integral + atomic_fetch_xor_explicit(atomic<Integral>* obj, Integral op, + memory_order m); + +template <class T> + T* + atomic_fetch_add(volatile atomic<T*>* obj, ptrdiff_t op); + +template <class T> + T* + atomic_fetch_add(atomic<T*>* obj, ptrdiff_t op); + +template <class T> + T* + atomic_fetch_add_explicit(volatile atomic<T*>* obj, ptrdiff_t op, + memory_order m); +template <class T> + T* + atomic_fetch_add_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m); + +template <class T> + T* + atomic_fetch_sub(volatile atomic<T*>* obj, ptrdiff_t op); + +template <class T> + T* + atomic_fetch_sub(atomic<T*>* obj, ptrdiff_t op); + +template <class T> + T* + atomic_fetch_sub_explicit(volatile atomic<T*>* obj, ptrdiff_t op, + memory_order m); +template <class T> + T* + atomic_fetch_sub_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m); + +// Atomics for standard typedef types + +typedef atomic<char> atomic_char; +typedef atomic<signed char> atomic_schar; +typedef atomic<unsigned char> atomic_uchar; +typedef atomic<short> atomic_short; +typedef atomic<unsigned short> atomic_ushort; +typedef atomic<int> atomic_int; +typedef atomic<unsigned int> atomic_uint; +typedef atomic<long> atomic_long; +typedef atomic<unsigned long> atomic_ulong; +typedef atomic<long long> atomic_llong; +typedef atomic<unsigned long long> atomic_ullong; +typedef atomic<char16_t> atomic_char16_t; +typedef atomic<char32_t> atomic_char32_t; +typedef atomic<wchar_t> atomic_wchar_t; + +typedef atomic<int_least8_t> atomic_int_least8_t; +typedef atomic<uint_least8_t> atomic_uint_least8_t; +typedef atomic<int_least16_t> atomic_int_least16_t; +typedef atomic<uint_least16_t> atomic_uint_least16_t; +typedef atomic<int_least32_t> atomic_int_least32_t; +typedef atomic<uint_least32_t> atomic_uint_least32_t; +typedef atomic<int_least64_t> atomic_int_least64_t; +typedef atomic<uint_least64_t> atomic_uint_least64_t; + +typedef atomic<int_fast8_t> atomic_int_fast8_t; +typedef atomic<uint_fast8_t> atomic_uint_fast8_t; +typedef atomic<int_fast16_t> atomic_int_fast16_t; +typedef atomic<uint_fast16_t> atomic_uint_fast16_t; +typedef atomic<int_fast32_t> atomic_int_fast32_t; +typedef atomic<uint_fast32_t> atomic_uint_fast32_t; +typedef atomic<int_fast64_t> atomic_int_fast64_t; +typedef atomic<uint_fast64_t> atomic_uint_fast64_t; + +typedef atomic<intptr_t> atomic_intptr_t; +typedef atomic<uintptr_t> atomic_uintptr_t; +typedef atomic<size_t> atomic_size_t; +typedef atomic<ptrdiff_t> atomic_ptrdiff_t; +typedef atomic<intmax_t> atomic_intmax_t; +typedef atomic<uintmax_t> atomic_uintmax_t; + +// fences + +void atomic_thread_fence(memory_order m); +void atomic_signal_fence(memory_order m); + +} // std + +*/ + +#include <__config> +#include <cstddef> +#include <cstdint> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if !__has_feature(cxx_atomic) +#error <atomic> is not implemented +#else + +typedef enum memory_order +{ + memory_order_relaxed, memory_order_consume, memory_order_acquire, + memory_order_release, memory_order_acq_rel, memory_order_seq_cst +} memory_order; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +kill_dependency(_Tp __y) +{ + return __y; +} + +// general atomic<T> + +template <class _Tp, bool = is_integral<_Tp>::value && !is_same<_Tp, bool>::value> +struct __atomic_base // false +{ + _Atomic(_Tp) __a_; + + _LIBCPP_INLINE_VISIBILITY + bool is_lock_free() const volatile + {return __atomic_is_lock_free(_Tp());} + _LIBCPP_INLINE_VISIBILITY + bool is_lock_free() const + {return __atomic_is_lock_free(_Tp());} + _LIBCPP_INLINE_VISIBILITY + void store(_Tp __d, memory_order __m = memory_order_seq_cst) volatile + {__atomic_store(&__a_, __d, __m);} + _LIBCPP_INLINE_VISIBILITY + void store(_Tp __d, memory_order __m = memory_order_seq_cst) + {__atomic_store(&__a_, __d, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp load(memory_order __m = memory_order_seq_cst) const volatile + {return __atomic_load(&__a_, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp load(memory_order __m = memory_order_seq_cst) const + {return __atomic_load(&__a_, __m);} + _LIBCPP_INLINE_VISIBILITY + operator _Tp() const volatile {return load();} + _LIBCPP_INLINE_VISIBILITY + operator _Tp() const {return load();} + _LIBCPP_INLINE_VISIBILITY + _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_exchange(&__a_, __d, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp exchange(_Tp __d, memory_order __m = memory_order_seq_cst) + {return __atomic_exchange(&__a_, __d, __m);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_weak(_Tp& __e, _Tp __d, + memory_order __s, memory_order __f) volatile + {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_weak(_Tp& __e, _Tp __d, + memory_order __s, memory_order __f) + {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __s, __f);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_strong(_Tp& __e, _Tp __d, + memory_order __s, memory_order __f) volatile + {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_strong(_Tp& __e, _Tp __d, + memory_order __s, memory_order __f) + {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __s, __f);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_weak(_Tp& __e, _Tp __d, + memory_order __m = memory_order_seq_cst) volatile + {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_weak(_Tp& __e, _Tp __d, + memory_order __m = memory_order_seq_cst) + {return __atomic_compare_exchange_weak(&__a_, &__e, __d, __m, __m);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_strong(_Tp& __e, _Tp __d, + memory_order __m = memory_order_seq_cst) volatile + {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} + _LIBCPP_INLINE_VISIBILITY + bool compare_exchange_strong(_Tp& __e, _Tp __d, + memory_order __m = memory_order_seq_cst) + {return __atomic_compare_exchange_strong(&__a_, &__e, __d, __m, __m);} + + _LIBCPP_INLINE_VISIBILITY + __atomic_base() {} // = default; + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ __atomic_base(_Tp __d) { __atomic_store(&__a_, __d, memory_order_seq_cst); } +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + __atomic_base(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) volatile = delete; +#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS +private: + __atomic_base(const __atomic_base&); + __atomic_base& operator=(const __atomic_base&); + __atomic_base& operator=(const __atomic_base&) volatile; +#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS +}; + +// atomic<Integral> + +template <class _Tp> +struct __atomic_base<_Tp, true> + : public __atomic_base<_Tp, false> +{ + typedef __atomic_base<_Tp, false> __base; + _LIBCPP_INLINE_VISIBILITY + __atomic_base() {} // = default; + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ __atomic_base(_Tp __d) : __base(__d) {} + + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_fetch_add(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_add(_Tp __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_add(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_sub(_Tp __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_fetch_and(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_and(_Tp __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_and(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_fetch_or(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_or(_Tp __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_or(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) volatile + {return __atomic_fetch_xor(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp fetch_xor(_Tp __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_xor(&this->__a_, __op, __m);} + + _LIBCPP_INLINE_VISIBILITY + _Tp operator++(int) volatile {return fetch_add(_Tp(1));} + _LIBCPP_INLINE_VISIBILITY + _Tp operator++(int) {return fetch_add(_Tp(1));} + _LIBCPP_INLINE_VISIBILITY + _Tp operator--(int) volatile {return fetch_sub(_Tp(1));} + _LIBCPP_INLINE_VISIBILITY + _Tp operator--(int) {return fetch_sub(_Tp(1));} + _LIBCPP_INLINE_VISIBILITY + _Tp operator++() volatile {return fetch_add(_Tp(1)) + _Tp(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp operator++() {return fetch_add(_Tp(1)) + _Tp(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp operator--() volatile {return fetch_sub(_Tp(1)) - _Tp(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp operator--() {return fetch_sub(_Tp(1)) - _Tp(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp operator+=(_Tp __op) volatile {return fetch_add(__op) + __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator+=(_Tp __op) {return fetch_add(__op) + __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator-=(_Tp __op) volatile {return fetch_sub(__op) - __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator-=(_Tp __op) {return fetch_sub(__op) - __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator&=(_Tp __op) volatile {return fetch_and(__op) & __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator&=(_Tp __op) {return fetch_and(__op) & __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator|=(_Tp __op) volatile {return fetch_or(__op) | __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator|=(_Tp __op) {return fetch_or(__op) | __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator^=(_Tp __op) volatile {return fetch_xor(__op) ^ __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator^=(_Tp __op) {return fetch_xor(__op) ^ __op;} +}; + +// atomic<T> + +template <class _Tp> +struct atomic + : public __atomic_base<_Tp> +{ + typedef __atomic_base<_Tp> __base; + _LIBCPP_INLINE_VISIBILITY + atomic() {} // = default; + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ atomic(_Tp __d) : __base(__d) {} + + _LIBCPP_INLINE_VISIBILITY + _Tp operator=(_Tp __d) volatile + {__base::store(__d); return __d;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator=(_Tp __d) + {__base::store(__d); return __d;} +}; + +// atomic<T*> + +template <class _Tp> +struct atomic<_Tp*> + : public __atomic_base<_Tp*> +{ + typedef __atomic_base<_Tp*> __base; + _LIBCPP_INLINE_VISIBILITY + atomic() {} // = default; + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ atomic(_Tp* __d) : __base(__d) {} + + _LIBCPP_INLINE_VISIBILITY + _Tp* operator=(_Tp* __d) volatile + {__base::store(__d); return __d;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator=(_Tp* __d) + {__base::store(__d); return __d;} + + _LIBCPP_INLINE_VISIBILITY + _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) + volatile + {return __atomic_fetch_add(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_add(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) + volatile + {return __atomic_fetch_sub(&this->__a_, __op, __m);} + _LIBCPP_INLINE_VISIBILITY + _Tp* fetch_sub(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) + {return __atomic_fetch_sub(&this->__a_, __op, __m);} + + _LIBCPP_INLINE_VISIBILITY + _Tp* operator++(int) volatile {return fetch_add(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator++(int) {return fetch_add(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator--(int) volatile {return fetch_sub(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator--(int) {return fetch_sub(1);} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator++() volatile {return fetch_add(1) + 1;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator++() {return fetch_add(1) + 1;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator--() volatile {return fetch_sub(1) - 1;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator--() {return fetch_sub(1) - 1;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator+=(ptrdiff_t __op) volatile {return fetch_add(__op) + __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator+=(ptrdiff_t __op) {return fetch_add(__op) + __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator-=(ptrdiff_t __op) volatile {return fetch_sub(__op) - __op;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator-=(ptrdiff_t __op) {return fetch_sub(__op) - __op;} +}; + +// atomic_is_lock_free + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_is_lock_free(const volatile atomic<_Tp>* __o) +{ + return __o->is_lock_free(); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_is_lock_free(const atomic<_Tp>* __o) +{ + return __o->is_lock_free(); +} + +// atomic_init + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_init(volatile atomic<_Tp>* __o, _Tp __d) +{ + __atomic_store(&__o->__a_, __d, memory_order_seq_cst); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_init(atomic<_Tp>* __o, _Tp __d) +{ + __atomic_store(&__o->__a_, __d, memory_order_seq_cst); +} + +// atomic_store + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_store(volatile atomic<_Tp>* __o, _Tp __d) +{ + __o->store(__d); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_store(atomic<_Tp>* __o, _Tp __d) +{ + __o->store(__d); +} + +// atomic_store_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_store_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) +{ + __o->store(__d, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_store_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) +{ + __o->store(__d, __m); +} + +// atomic_load + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_load(const volatile atomic<_Tp>* __o) +{ + return __o->load(); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_load(const atomic<_Tp>* __o) +{ + return __o->load(); +} + +// atomic_load_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_load_explicit(const volatile atomic<_Tp>* __o, memory_order __m) +{ + return __o->load(__m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_load_explicit(const atomic<_Tp>* __o, memory_order __m) +{ + return __o->load(__m); +} + +// atomic_exchange + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_exchange(volatile atomic<_Tp>* __o, _Tp __d) +{ + return __o->exchange(__d); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_exchange(atomic<_Tp>* __o, _Tp __d) +{ + return __o->exchange(__d); +} + +// atomic_exchange_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_exchange_explicit(volatile atomic<_Tp>* __o, _Tp __d, memory_order __m) +{ + return __o->exchange(__d, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +atomic_exchange_explicit(atomic<_Tp>* __o, _Tp __d, memory_order __m) +{ + return __o->exchange(__d, __m); +} + +// atomic_compare_exchange_weak + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_weak(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) +{ + return __o->compare_exchange_weak(*__e, __d); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_weak(atomic<_Tp>* __o, _Tp* __e, _Tp __d) +{ + return __o->compare_exchange_weak(*__e, __d); +} + +// atomic_compare_exchange_strong + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_strong(volatile atomic<_Tp>* __o, _Tp* __e, _Tp __d) +{ + return __o->compare_exchange_strong(*__e, __d); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_strong(atomic<_Tp>* __o, _Tp* __e, _Tp __d) +{ + return __o->compare_exchange_strong(*__e, __d); +} + +// atomic_compare_exchange_weak_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_weak_explicit(volatile atomic<_Tp>* __o, _Tp* __e, + _Tp __d, + memory_order __s, memory_order __f) +{ + return __o->compare_exchange_weak(*__e, __d, __s, __f); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_weak_explicit(atomic<_Tp>* __o, _Tp* __e, _Tp __d, + memory_order __s, memory_order __f) +{ + return __o->compare_exchange_weak(*__e, __d, __s, __f); +} + +// atomic_compare_exchange_strong_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_strong_explicit(volatile atomic<_Tp>* __o, + _Tp* __e, _Tp __d, + memory_order __s, memory_order __f) +{ + return __o->compare_exchange_strong(*__e, __d, __s, __f); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_compare_exchange_strong_explicit(atomic<_Tp>* __o, _Tp* __e, + _Tp __d, + memory_order __s, memory_order __f) +{ + return __o->compare_exchange_strong(*__e, __d, __s, __f); +} + +// atomic_fetch_add + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_add(volatile atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_add(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_add(atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_add(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_add(volatile atomic<_Tp*>* __o, ptrdiff_t __op) +{ + return __o->fetch_add(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_add(atomic<_Tp*>* __o, ptrdiff_t __op) +{ + return __o->fetch_add(__op); +} + +// atomic_fetch_add_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_add_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_add(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_add_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_add(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_add_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, + memory_order __m) +{ + return __o->fetch_add(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_add_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) +{ + return __o->fetch_add(__op, __m); +} + +// atomic_fetch_sub + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_sub(volatile atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_sub(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_sub(atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_sub(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_sub(volatile atomic<_Tp*>* __o, ptrdiff_t __op) +{ + return __o->fetch_sub(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_sub(atomic<_Tp*>* __o, ptrdiff_t __op) +{ + return __o->fetch_sub(__op); +} + +// atomic_fetch_sub_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_sub_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_sub(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_sub_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_sub(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_sub_explicit(volatile atomic<_Tp*>* __o, ptrdiff_t __op, + memory_order __m) +{ + return __o->fetch_sub(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +atomic_fetch_sub_explicit(atomic<_Tp*>* __o, ptrdiff_t __op, memory_order __m) +{ + return __o->fetch_sub(__op, __m); +} + +// atomic_fetch_and + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_and(volatile atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_and(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_and(atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_and(__op); +} + +// atomic_fetch_and_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_and_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_and(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_and_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_and(__op, __m); +} + +// atomic_fetch_or + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_or(volatile atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_or(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_or(atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_or(__op); +} + +// atomic_fetch_or_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_or_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_or(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_or_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_or(__op, __m); +} + +// atomic_fetch_xor + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_xor(volatile atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_xor(__op); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_xor(atomic<_Tp>* __o, _Tp __op) +{ + return __o->fetch_xor(__op); +} + +// atomic_fetch_xor_explicit + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_xor_explicit(volatile atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_xor(__op, __m); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value && !is_same<_Tp, bool>::value, + _Tp +>::type +atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) +{ + return __o->fetch_xor(__op, __m); +} + +// flag type and operations + +typedef struct atomic_flag +{ + _Atomic(bool) __a_; + + _LIBCPP_INLINE_VISIBILITY + bool test_and_set(memory_order __m = memory_order_seq_cst) volatile + {return __atomic_exchange(&__a_, true, __m);} + _LIBCPP_INLINE_VISIBILITY + bool test_and_set(memory_order __m = memory_order_seq_cst) + {return __atomic_exchange(&__a_, true, __m);} + _LIBCPP_INLINE_VISIBILITY + void clear(memory_order __m = memory_order_seq_cst) volatile + {__atomic_store(&__a_, false, __m);} + _LIBCPP_INLINE_VISIBILITY + void clear(memory_order __m = memory_order_seq_cst) + {__atomic_store(&__a_, false, __m);} + + _LIBCPP_INLINE_VISIBILITY + atomic_flag() {} // = default; + _LIBCPP_INLINE_VISIBILITY + atomic_flag(bool __b) { __atomic_store(&__a_, __b, memory_order_seq_cst); } + +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + atomic_flag(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) volatile = delete; +#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS +private: + atomic_flag(const atomic_flag&); + atomic_flag& operator=(const atomic_flag&); + atomic_flag& operator=(const atomic_flag&) volatile; +#endif // _LIBCPP_HAS_NO_DELETED_FUNCTIONS +} atomic_flag; + +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_flag_test_and_set(volatile atomic_flag* __o) +{ + return __o->test_and_set(); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_flag_test_and_set(atomic_flag* __o) +{ + return __o->test_and_set(); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) +{ + return __o->test_and_set(__m); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) +{ + return __o->test_and_set(__m); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_flag_clear(volatile atomic_flag* __o) +{ + __o->clear(); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_flag_clear(atomic_flag* __o) +{ + __o->clear(); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) +{ + __o->clear(__m); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) +{ + __o->clear(__m); +} + +// fences + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_thread_fence(memory_order __m) +{ + __atomic_thread_fence(__m); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +atomic_signal_fence(memory_order __m) +{ + __atomic_signal_fence(__m); +} + +// Atomics for standard typedef types + +typedef atomic<char> atomic_char; +typedef atomic<signed char> atomic_schar; +typedef atomic<unsigned char> atomic_uchar; +typedef atomic<short> atomic_short; +typedef atomic<unsigned short> atomic_ushort; +typedef atomic<int> atomic_int; +typedef atomic<unsigned int> atomic_uint; +typedef atomic<long> atomic_long; +typedef atomic<unsigned long> atomic_ulong; +typedef atomic<long long> atomic_llong; +typedef atomic<unsigned long long> atomic_ullong; +typedef atomic<char16_t> atomic_char16_t; +typedef atomic<char32_t> atomic_char32_t; +typedef atomic<wchar_t> atomic_wchar_t; + +typedef atomic<int_least8_t> atomic_int_least8_t; +typedef atomic<uint_least8_t> atomic_uint_least8_t; +typedef atomic<int_least16_t> atomic_int_least16_t; +typedef atomic<uint_least16_t> atomic_uint_least16_t; +typedef atomic<int_least32_t> atomic_int_least32_t; +typedef atomic<uint_least32_t> atomic_uint_least32_t; +typedef atomic<int_least64_t> atomic_int_least64_t; +typedef atomic<uint_least64_t> atomic_uint_least64_t; + +typedef atomic<int_fast8_t> atomic_int_fast8_t; +typedef atomic<uint_fast8_t> atomic_uint_fast8_t; +typedef atomic<int_fast16_t> atomic_int_fast16_t; +typedef atomic<uint_fast16_t> atomic_uint_fast16_t; +typedef atomic<int_fast32_t> atomic_int_fast32_t; +typedef atomic<uint_fast32_t> atomic_uint_fast32_t; +typedef atomic<int_fast64_t> atomic_int_fast64_t; +typedef atomic<uint_fast64_t> atomic_uint_fast64_t; + +typedef atomic<intptr_t> atomic_intptr_t; +typedef atomic<uintptr_t> atomic_uintptr_t; +typedef atomic<size_t> atomic_size_t; +typedef atomic<ptrdiff_t> atomic_ptrdiff_t; +typedef atomic<intmax_t> atomic_intmax_t; +typedef atomic<uintmax_t> atomic_uintmax_t; + +#define ATOMIC_FLAG_INIT {false} +#define ATOMIC_VAR_INIT(__v) {__v} + +// lock-free property + +#define ATOMIC_CHAR_LOCK_FREE 0 +#define ATOMIC_CHAR16_T_LOCK_FREE 0 +#define ATOMIC_CHAR32_T_LOCK_FREE 0 +#define ATOMIC_WCHAR_T_LOCK_FREE 0 +#define ATOMIC_SHORT_LOCK_FREE 0 +#define ATOMIC_INT_LOCK_FREE 0 +#define ATOMIC_LONG_LOCK_FREE 0 +#define ATOMIC_LLONG_LOCK_FREE 0 + +#endif // !__has_feature(cxx_atomic) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_ATOMIC diff --git a/contrib/libc++/include/bitset b/contrib/libc++/include/bitset new file mode 100644 index 0000000..6e12e5c --- /dev/null +++ b/contrib/libc++/include/bitset @@ -0,0 +1,1050 @@ +// -*- C++ -*- +//===---------------------------- bitset ----------------------------------===// +// +// 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_BITSET +#define _LIBCPP_BITSET + +/* + bitset synopsis + +namespace std +{ + +namespace std { + +template <size_t N> +class bitset +{ +public: + // bit reference: + class reference + { + friend class bitset; + reference() noexcept; + public: + ~reference() noexcept; + reference& operator=(bool x) noexcept; // for b[i] = x; + reference& operator=(const reference&) noexcept; // for b[i] = b[j]; + bool operator~() const noexcept; // flips the bit + operator bool() const noexcept; // for x = b[i]; + reference& flip() noexcept; // for b[i].flip(); + }; + + // 23.3.5.1 constructors: + constexpr bitset() noexcept; + constexpr bitset(unsigned long long val) noexcept; + template <class charT> + explicit bitset(const charT* str, + typename basic_string<charT>::size_type n = basic_string<charT>::npos, + charT zero = charT('0'), charT one = charT('1')); + template<class charT, class traits, class Allocator> + explicit bitset(const basic_string<charT,traits,Allocator>& str, + typename basic_string<charT,traits,Allocator>::size_type pos = 0, + typename basic_string<charT,traits,Allocator>::size_type n = + basic_string<charT,traits,Allocator>::npos, + charT zero = charT('0'), charT one = charT('1')); + + // 23.3.5.2 bitset operations: + bitset& operator&=(const bitset& rhs) noexcept; + bitset& operator|=(const bitset& rhs) noexcept; + bitset& operator^=(const bitset& rhs) noexcept; + bitset& operator<<=(size_t pos) noexcept; + bitset& operator>>=(size_t pos) noexcept; + bitset& set() noexcept; + bitset& set(size_t pos, bool val = true); + bitset& reset() noexcept; + bitset& reset(size_t pos); + bitset operator~() const noexcept; + bitset& flip() noexcept; + bitset& flip(size_t pos); + + // element access: + constexpr bool operator[](size_t pos) const; // for b[i]; + reference operator[](size_t pos); // for b[i]; + unsigned long to_ulong() const; + unsigned long long to_ullong() const; + template <class charT, class traits, class Allocator> + basic_string<charT, traits, Allocator> to_string(charT zero = charT('0'), charT one = charT('1')) const; + template <class charT, class traits> + basic_string<charT, traits, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const; + template <class charT> + basic_string<charT, char_traits<charT>, allocator<charT> > to_string(charT zero = charT('0'), charT one = charT('1')) const; + basic_string<char, char_traits<char>, allocator<char> > to_string(char zero = '0', char one = '1') const; + size_t count() const noexcept; + constexpr size_t size() const noexcept; + bool operator==(const bitset& rhs) const noexcept; + bool operator!=(const bitset& rhs) const noexcept; + bool test(size_t pos) const; + bool all() const noexcept; + bool any() const noexcept; + bool none() const noexcept; + bitset operator<<(size_t pos) const noexcept; + bitset operator>>(size_t pos) const noexcept; +}; + +// 23.3.5.3 bitset operators: +template <size_t N> +bitset<N> operator&(const bitset<N>&, const bitset<N>&) noexcept; + +template <size_t N> +bitset<N> operator|(const bitset<N>&, const bitset<N>&) noexcept; + +template <size_t N> +bitset<N> operator^(const bitset<N>&, const bitset<N>&) noexcept; + +template <class charT, class traits, size_t N> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, bitset<N>& x); + +template <class charT, class traits, size_t N> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x); + +template <size_t N> struct hash<std::bitset<N>>; + +} // std + +*/ + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#include <__config> +#include <__bit_reference> +#include <cstddef> +#include <climits> +#include <string> +#include <stdexcept> +#include <iosfwd> +#include <__functional_base> +#if defined(_LIBCPP_NO_EXCEPTIONS) + #include <cassert> +#endif + +#include <__undef_min_max> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <size_t _N_words, size_t _Size> +class __bitset; + +template <size_t _N_words, size_t _Size> +struct __has_storage_type<__bitset<_N_words, _Size> > +{ + static const bool value = true; +}; + +template <size_t _N_words, size_t _Size> +class __bitset +{ +public: + typedef ptrdiff_t difference_type; + typedef size_t size_type; +protected: + typedef __bitset __self; + typedef size_type __storage_type; + typedef __storage_type* __storage_pointer; + typedef const __storage_type* __const_storage_pointer; + static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); + + friend class __bit_reference<__bitset>; + friend class __bit_const_reference<__bitset>; + friend class __bit_iterator<__bitset, false>; + friend class __bit_iterator<__bitset, true>; + friend class __bit_array<__bitset>; + + __storage_type __first_[_N_words]; + + typedef __bit_reference<__bitset> reference; + typedef __bit_const_reference<__bitset> const_reference; + typedef __bit_iterator<__bitset, false> iterator; + typedef __bit_iterator<__bitset, true> const_iterator; + + __bitset() _NOEXCEPT; + explicit __bitset(unsigned long long __v) _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT + {return reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY const_reference __make_ref(size_t __pos) const _NOEXCEPT + {return const_reference(__first_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT + {return iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT + {return const_iterator(__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} + + void operator&=(const __bitset& __v) _NOEXCEPT; + void operator|=(const __bitset& __v) _NOEXCEPT; + void operator^=(const __bitset& __v) _NOEXCEPT; + + void flip() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const + {return to_ulong(integral_constant<bool, _Size < sizeof(unsigned long) * CHAR_BIT>());} + _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const + {return to_ullong(integral_constant<bool, _Size < sizeof(unsigned long long) * CHAR_BIT>());} + + bool all() const _NOEXCEPT; + bool any() const _NOEXCEPT; + size_t __hash_code() const _NOEXCEPT; +private: + void __init(unsigned long long __v, false_type) _NOEXCEPT; + void __init(unsigned long long __v, true_type) _NOEXCEPT; + unsigned long to_ulong(false_type) const; + unsigned long to_ulong(true_type) const; + unsigned long long to_ullong(false_type) const; + unsigned long long to_ullong(true_type) const; + unsigned long long to_ullong(true_type, false_type) const; + unsigned long long to_ullong(true_type, true_type) const; +}; + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +__bitset<_N_words, _Size>::__bitset() _NOEXCEPT +{ + _VSTD::fill_n(__first_, _N_words, __storage_type(0)); +} + +template <size_t _N_words, size_t _Size> +void +__bitset<_N_words, _Size>::__init(unsigned long long __v, false_type) _NOEXCEPT +{ + __storage_type __t[sizeof(unsigned long long) / sizeof(__storage_type)]; + for (size_t __i = 0; __i < sizeof(__t)/sizeof(__t[0]); ++__i, __v >>= __bits_per_word) + __t[__i] = static_cast<__storage_type>(__v); + _VSTD::copy(__t, __t + sizeof(__t)/sizeof(__t[0]), __first_); + _VSTD::fill(__first_ + sizeof(__t)/sizeof(__t[0]), __first_ + sizeof(__first_)/sizeof(__first_[0]), + __storage_type(0)); +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<_N_words, _Size>::__init(unsigned long long __v, true_type) _NOEXCEPT +{ + __first_[0] = __v; + _VSTD::fill(__first_ + 1, __first_ + sizeof(__first_)/sizeof(__first_[0]), __storage_type(0)); +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +__bitset<_N_words, _Size>::__bitset(unsigned long long __v) _NOEXCEPT +{ + __init(__v, integral_constant<bool, sizeof(unsigned long long) == sizeof(__storage_type)>()); +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<_N_words, _Size>::operator&=(const __bitset& __v) _NOEXCEPT +{ + for (size_type __i = 0; __i < _N_words; ++__i) + __first_[__i] &= __v.__first_[__i]; +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<_N_words, _Size>::operator|=(const __bitset& __v) _NOEXCEPT +{ + for (size_type __i = 0; __i < _N_words; ++__i) + __first_[__i] |= __v.__first_[__i]; +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<_N_words, _Size>::operator^=(const __bitset& __v) _NOEXCEPT +{ + for (size_type __i = 0; __i < _N_words; ++__i) + __first_[__i] ^= __v.__first_[__i]; +} + +template <size_t _N_words, size_t _Size> +void +__bitset<_N_words, _Size>::flip() _NOEXCEPT +{ + // do middle whole words + size_type __n = _Size; + __storage_pointer __p = __first_; + for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) + *__p = ~*__p; + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__p & __m; + *__p &= ~__m; + *__p |= ~__b & __m; + } +} + +template <size_t _N_words, size_t _Size> +unsigned long +__bitset<_N_words, _Size>::to_ulong(false_type) const +{ + const_iterator __e = __make_iter(_Size); + const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long) * CHAR_BIT), __e, true); + if (__i != __e) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw overflow_error("bitset to_ulong overflow error"); +#else + assert(!"bitset to_ulong overflow error"); +#endif + return __first_[0]; +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long +__bitset<_N_words, _Size>::to_ulong(true_type) const +{ + return __first_[0]; +} + +template <size_t _N_words, size_t _Size> +unsigned long long +__bitset<_N_words, _Size>::to_ullong(false_type) const +{ + const_iterator __e = __make_iter(_Size); + const_iterator __i = _VSTD::find(__make_iter(sizeof(unsigned long long) * CHAR_BIT), __e, true); + if (__i != __e) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw overflow_error("bitset to_ullong overflow error"); +#else + assert(!"bitset to_ullong overflow error"); +#endif + return to_ullong(true_type()); +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +__bitset<_N_words, _Size>::to_ullong(true_type) const +{ + return to_ullong(true_type(), integral_constant<bool, sizeof(__storage_type) < sizeof(unsigned long long)>()); +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +__bitset<_N_words, _Size>::to_ullong(true_type, false_type) const +{ + return __first_[0]; +} + +template <size_t _N_words, size_t _Size> +unsigned long long +__bitset<_N_words, _Size>::to_ullong(true_type, true_type) const +{ + unsigned long long __r = __first_[0]; + for (std::size_t __i = 1; __i < sizeof(unsigned long long) / sizeof(__storage_type); ++__i) + __r |= static_cast<unsigned long long>(__first_[__i]) << (sizeof(__storage_type) * CHAR_BIT); + return __r; +} + +template <size_t _N_words, size_t _Size> +bool +__bitset<_N_words, _Size>::all() const _NOEXCEPT +{ + // do middle whole words + size_type __n = _Size; + __const_storage_pointer __p = __first_; + for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) + if (~*__p) + return false; + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + if (~*__p & __m) + return false; + } + return true; +} + +template <size_t _N_words, size_t _Size> +bool +__bitset<_N_words, _Size>::any() const _NOEXCEPT +{ + // do middle whole words + size_type __n = _Size; + __const_storage_pointer __p = __first_; + for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) + if (*__p) + return true; + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + if (*__p & __m) + return true; + } + return false; +} + +template <size_t _N_words, size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +size_t +__bitset<_N_words, _Size>::__hash_code() const _NOEXCEPT +{ + size_t __h = 0; + for (size_type __i = 0; __i < _N_words; ++__i) + __h ^= __first_[__i]; + return __h; +} + +template <size_t _Size> +class __bitset<1, _Size> +{ +public: + typedef ptrdiff_t difference_type; + typedef size_t size_type; +protected: + typedef __bitset __self; + typedef size_type __storage_type; + typedef __storage_type* __storage_pointer; + typedef const __storage_type* __const_storage_pointer; + static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); + + friend class __bit_reference<__bitset>; + friend class __bit_const_reference<__bitset>; + friend class __bit_iterator<__bitset, false>; + friend class __bit_iterator<__bitset, true>; + friend class __bit_array<__bitset>; + + __storage_type __first_; + + typedef __bit_reference<__bitset> reference; + typedef __bit_const_reference<__bitset> const_reference; + typedef __bit_iterator<__bitset, false> iterator; + typedef __bit_iterator<__bitset, true> const_iterator; + + __bitset() _NOEXCEPT; + explicit __bitset(unsigned long long __v) _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t __pos) _NOEXCEPT + {return reference(&__first_, __storage_type(1) << __pos);} + _LIBCPP_INLINE_VISIBILITY const_reference __make_ref(size_t __pos) const _NOEXCEPT + {return const_reference(&__first_, __storage_type(1) << __pos);} + _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t __pos) _NOEXCEPT + {return iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) const _NOEXCEPT + {return const_iterator(&__first_ + __pos / __bits_per_word, __pos % __bits_per_word);} + + void operator&=(const __bitset& __v) _NOEXCEPT; + void operator|=(const __bitset& __v) _NOEXCEPT; + void operator^=(const __bitset& __v) _NOEXCEPT; + + void flip() _NOEXCEPT; + + unsigned long to_ulong() const; + unsigned long long to_ullong() const; + + bool all() const _NOEXCEPT; + bool any() const _NOEXCEPT; + + size_t __hash_code() const _NOEXCEPT; +}; + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +__bitset<1, _Size>::__bitset() _NOEXCEPT + : __first_(0) +{ +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +__bitset<1, _Size>::__bitset(unsigned long long __v) _NOEXCEPT + : __first_(static_cast<__storage_type>(__v)) +{ +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<1, _Size>::operator&=(const __bitset& __v) _NOEXCEPT +{ + __first_ &= __v.__first_; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<1, _Size>::operator|=(const __bitset& __v) _NOEXCEPT +{ + __first_ |= __v.__first_; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<1, _Size>::operator^=(const __bitset& __v) _NOEXCEPT +{ + __first_ ^= __v.__first_; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +void +__bitset<1, _Size>::flip() _NOEXCEPT +{ + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); + __first_ = ~__first_; + __first_ &= __m; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long +__bitset<1, _Size>::to_ulong() const +{ + return __first_; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +__bitset<1, _Size>::to_ullong() const +{ + return __first_; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +__bitset<1, _Size>::all() const _NOEXCEPT +{ + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); + return !(~__first_ & __m); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +__bitset<1, _Size>::any() const _NOEXCEPT +{ + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - _Size); + return __first_ & __m; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +size_t +__bitset<1, _Size>::__hash_code() const _NOEXCEPT +{ + return __first_; +} + +template <> +class __bitset<0, 0> +{ +public: + typedef ptrdiff_t difference_type; + typedef size_t size_type; +protected: + typedef __bitset __self; + typedef size_type __storage_type; + typedef __storage_type* __storage_pointer; + typedef const __storage_type* __const_storage_pointer; + static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); + + friend class __bit_reference<__bitset>; + friend class __bit_const_reference<__bitset>; + friend class __bit_iterator<__bitset, false>; + friend class __bit_iterator<__bitset, true>; + friend struct __bit_array<__bitset>; + + typedef __bit_reference<__bitset> reference; + typedef __bit_const_reference<__bitset> const_reference; + typedef __bit_iterator<__bitset, false> iterator; + typedef __bit_iterator<__bitset, true> const_iterator; + + __bitset() _NOEXCEPT; + explicit __bitset(unsigned long long) _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY reference __make_ref(size_t) _NOEXCEPT + {return reference(0, 1);} + _LIBCPP_INLINE_VISIBILITY const_reference __make_ref(size_t) const _NOEXCEPT + {return const_reference(0, 1);} + _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_t) _NOEXCEPT + {return iterator(0, 0);} + _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t) const _NOEXCEPT + {return const_iterator(0, 0);} + + _LIBCPP_INLINE_VISIBILITY void operator&=(const __bitset&) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY void operator|=(const __bitset&) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY void operator^=(const __bitset&) _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY unsigned long to_ulong() const {return 0;} + _LIBCPP_INLINE_VISIBILITY unsigned long long to_ullong() const {return 0;} + + _LIBCPP_INLINE_VISIBILITY bool all() const _NOEXCEPT {return true;} + _LIBCPP_INLINE_VISIBILITY bool any() const _NOEXCEPT {return false;} + + _LIBCPP_INLINE_VISIBILITY size_t __hash_code() const _NOEXCEPT {return 0;} +}; + +inline _LIBCPP_INLINE_VISIBILITY +__bitset<0, 0>::__bitset() _NOEXCEPT +{ +} + +inline _LIBCPP_INLINE_VISIBILITY +__bitset<0, 0>::__bitset(unsigned long long) _NOEXCEPT +{ +} + +template <size_t _Size> class bitset; +template <size_t _Size> struct hash<bitset<_Size> >; + +template <size_t _Size> +class _LIBCPP_VISIBLE bitset + : private __bitset<_Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size> +{ + static const unsigned __n_words = _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1; + typedef __bitset<__n_words, _Size> base; + +public: + typedef typename base::reference reference; + typedef typename base::const_reference const_reference; + + // 23.3.5.1 constructors: + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY bitset() _NOEXCEPT {} + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY bitset(unsigned long long __v) _NOEXCEPT : base(__v) {} + template<class _CharT> + explicit bitset(const _CharT* __str, + typename basic_string<_CharT>::size_type __n = basic_string<_CharT>::npos, + _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')); + template<class _CharT, class _Traits, class _Allocator> + explicit bitset(const basic_string<_CharT,_Traits,_Allocator>& __str, + typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos = 0, + typename basic_string<_CharT,_Traits,_Allocator>::size_type __n = + (basic_string<_CharT,_Traits,_Allocator>::npos), + _CharT __zero = _CharT('0'), _CharT __one = _CharT('1')); + + // 23.3.5.2 bitset operations: + bitset& operator&=(const bitset& __rhs) _NOEXCEPT; + bitset& operator|=(const bitset& __rhs) _NOEXCEPT; + bitset& operator^=(const bitset& __rhs) _NOEXCEPT; + bitset& operator<<=(size_t __pos) _NOEXCEPT; + bitset& operator>>=(size_t __pos) _NOEXCEPT; + bitset& set() _NOEXCEPT; + bitset& set(size_t __pos, bool __val = true); + bitset& reset() _NOEXCEPT; + bitset& reset(size_t __pos); + bitset operator~() const _NOEXCEPT; + bitset& flip() _NOEXCEPT; + bitset& flip(size_t __pos); + + // element access: + _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_t __p) const {return base::__make_ref(__p);} + _LIBCPP_INLINE_VISIBILITY reference operator[](size_t __p) {return base::__make_ref(__p);} + unsigned long to_ulong() const; + unsigned long long to_ullong() const; + template <class _CharT, class _Traits, class _Allocator> + basic_string<_CharT, _Traits, _Allocator> to_string(_CharT __zero = _CharT('0'), + _CharT __one = _CharT('1')) const; + template <class _CharT, class _Traits> + basic_string<_CharT, _Traits, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'), + _CharT __one = _CharT('1')) const; + template <class _CharT> + basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > to_string(_CharT __zero = _CharT('0'), + _CharT __one = _CharT('1')) const; + basic_string<char, char_traits<char>, allocator<char> > to_string(char __zero = '0', + char __one = '1') const; + size_t count() const _NOEXCEPT; + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY size_t size() const _NOEXCEPT {return _Size;} + bool operator==(const bitset& __rhs) const _NOEXCEPT; + bool operator!=(const bitset& __rhs) const _NOEXCEPT; + bool test(size_t __pos) const; + bool all() const _NOEXCEPT; + bool any() const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY bool none() const _NOEXCEPT {return !any();} + bitset operator<<(size_t __pos) const _NOEXCEPT; + bitset operator>>(size_t __pos) const _NOEXCEPT; + +private: + + _LIBCPP_INLINE_VISIBILITY + size_t __hash_code() const _NOEXCEPT {return base::__hash_code();} + + friend struct hash<bitset>; +}; + +template <size_t _Size> +template<class _CharT> +bitset<_Size>::bitset(const _CharT* __str, + typename basic_string<_CharT>::size_type __n, + _CharT __zero, _CharT __one) +{ + size_t __rlen = _VSTD::min(__n, char_traits<_CharT>::length(__str)); + for (size_t __i = 0; __i < __rlen; ++__i) + if (__str[__i] != __zero && __str[__i] != __one) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw invalid_argument("bitset string ctor has invalid argument"); +#else + assert(!"bitset string ctor has invalid argument"); +#endif + size_t _Mp = _VSTD::min(__rlen, _Size); + size_t __i = 0; + for (; __i < _Mp; ++__i) + { + _CharT __c = __str[_Mp - 1 - __i]; + if (__c == __zero) + (*this)[__i] = false; + else + (*this)[__i] = true; + } + _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false); +} + +template <size_t _Size> +template<class _CharT, class _Traits, class _Allocator> +bitset<_Size>::bitset(const basic_string<_CharT,_Traits,_Allocator>& __str, + typename basic_string<_CharT,_Traits,_Allocator>::size_type __pos, + typename basic_string<_CharT,_Traits,_Allocator>::size_type __n, + _CharT __zero, _CharT __one) +{ + if (__pos > __str.size()) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("bitset string pos out of range"); +#else + assert(!"bitset string pos out of range"); +#endif + size_t __rlen = _VSTD::min(__n, __str.size() - __pos); + for (size_t __i = __pos; __i < __pos + __rlen; ++__i) + if (!_Traits::eq(__str[__i], __zero) && !_Traits::eq(__str[__i], __one)) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw invalid_argument("bitset string ctor has invalid argument"); +#else + assert(!"bitset string ctor has invalid argument"); +#endif + size_t _Mp = _VSTD::min(__rlen, _Size); + size_t __i = 0; + for (; __i < _Mp; ++__i) + { + _CharT __c = __str[__pos + _Mp - 1 - __i]; + if (_Traits::eq(__c, __zero)) + (*this)[__i] = false; + else + (*this)[__i] = true; + } + _VSTD::fill(base::__make_iter(__i), base::__make_iter(_Size), false); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::operator&=(const bitset& __rhs) _NOEXCEPT +{ + base::operator&=(__rhs); + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::operator|=(const bitset& __rhs) _NOEXCEPT +{ + base::operator|=(__rhs); + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::operator^=(const bitset& __rhs) _NOEXCEPT +{ + base::operator^=(__rhs); + return *this; +} + +template <size_t _Size> +bitset<_Size>& +bitset<_Size>::operator<<=(size_t __pos) _NOEXCEPT +{ + __pos = _VSTD::min(__pos, _Size); + _VSTD::copy_backward(base::__make_iter(0), base::__make_iter(_Size - __pos), base::__make_iter(_Size)); + _VSTD::fill_n(base::__make_iter(0), __pos, false); + return *this; +} + +template <size_t _Size> +bitset<_Size>& +bitset<_Size>::operator>>=(size_t __pos) _NOEXCEPT +{ + __pos = _VSTD::min(__pos, _Size); + _VSTD::copy(base::__make_iter(__pos), base::__make_iter(_Size), base::__make_iter(0)); + _VSTD::fill_n(base::__make_iter(_Size - __pos), __pos, false); + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::set() _NOEXCEPT +{ + _VSTD::fill_n(base::__make_iter(0), _Size, true); + return *this; +} + +template <size_t _Size> +bitset<_Size>& +bitset<_Size>::set(size_t __pos, bool __val) +{ + if (__pos >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("bitset set argument out of range"); +#else + assert(!"bitset set argument out of range"); +#endif + (*this)[__pos] = __val; + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::reset() _NOEXCEPT +{ + _VSTD::fill_n(base::__make_iter(0), _Size, false); + return *this; +} + +template <size_t _Size> +bitset<_Size>& +bitset<_Size>::reset(size_t __pos) +{ + if (__pos >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("bitset reset argument out of range"); +#else + assert(!"bitset reset argument out of range"); +#endif + (*this)[__pos] = false; + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +bitset<_Size>::operator~() const _NOEXCEPT +{ + bitset __x(*this); + __x.flip(); + return __x; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size>& +bitset<_Size>::flip() _NOEXCEPT +{ + base::flip(); + return *this; +} + +template <size_t _Size> +bitset<_Size>& +bitset<_Size>::flip(size_t __pos) +{ + if (__pos >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("bitset flip argument out of range"); +#else + assert(!"bitset flip argument out of range"); +#endif + reference r = base::__make_ref(__pos); + r = ~r; + return *this; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long +bitset<_Size>::to_ulong() const +{ + return base::to_ulong(); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +unsigned long long +bitset<_Size>::to_ullong() const +{ + return base::to_ullong(); +} + +template <size_t _Size> +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +bitset<_Size>::to_string(_CharT __zero, _CharT __one) const +{ + basic_string<_CharT, _Traits, _Allocator> __r(_Size, __zero); + for (size_t __i = 0; __i < _Size; ++__i) + { + if ((*this)[__i]) + __r[_Size - 1 - __i] = __one; + } + return __r; +} + +template <size_t _Size> +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _Traits, allocator<_CharT> > +bitset<_Size>::to_string(_CharT __zero, _CharT __one) const +{ + return to_string<_CharT, _Traits, allocator<_CharT> >(__zero, __one); +} + +template <size_t _Size> +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > +bitset<_Size>::to_string(_CharT __zero, _CharT __one) const +{ + return to_string<_CharT, char_traits<_CharT>, allocator<_CharT> >(__zero, __one); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<char, char_traits<char>, allocator<char> > +bitset<_Size>::to_string(char __zero, char __one) const +{ + return to_string<char, char_traits<char>, allocator<char> >(__zero, __one); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +size_t +bitset<_Size>::count() const _NOEXCEPT +{ + return static_cast<size_t>(_VSTD::count(base::__make_iter(0), base::__make_iter(_Size), true)); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +bitset<_Size>::operator==(const bitset& __rhs) const _NOEXCEPT +{ + return _VSTD::equal(base::__make_iter(0), base::__make_iter(_Size), __rhs.__make_iter(0)); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +bitset<_Size>::operator!=(const bitset& __rhs) const _NOEXCEPT +{ + return !(*this == __rhs); +} + +template <size_t _Size> +bool +bitset<_Size>::test(size_t __pos) const +{ + if (__pos >= _Size) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("bitset test argument out of range"); +#else + assert(!"bitset test argument out of range"); +#endif + return (*this)[__pos]; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +bitset<_Size>::all() const _NOEXCEPT +{ + return base::all(); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bool +bitset<_Size>::any() const _NOEXCEPT +{ + return base::any(); +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +bitset<_Size>::operator<<(size_t __pos) const _NOEXCEPT +{ + bitset __r = *this; + __r <<= __pos; + return __r; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +bitset<_Size>::operator>>(size_t __pos) const _NOEXCEPT +{ + bitset __r = *this; + __r >>= __pos; + return __r; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +operator&(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT +{ + bitset<_Size> __r = __x; + __r &= __y; + return __r; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +operator|(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT +{ + bitset<_Size> __r = __x; + __r |= __y; + return __r; +} + +template <size_t _Size> +inline _LIBCPP_INLINE_VISIBILITY +bitset<_Size> +operator^(const bitset<_Size>& __x, const bitset<_Size>& __y) _NOEXCEPT +{ + bitset<_Size> __r = __x; + __r ^= __y; + return __r; +} + +template <size_t _Size> +struct _LIBCPP_VISIBLE hash<bitset<_Size> > + : public unary_function<bitset<_Size>, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const bitset<_Size>& __bs) const _NOEXCEPT + {return __bs.__hash_code();} +}; + +template <class _CharT, class _Traits, size_t _Size> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x); + +template <class _CharT, class _Traits, size_t _Size> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_BITSET diff --git a/contrib/libc++/include/cassert b/contrib/libc++/include/cassert new file mode 100644 index 0000000..3775990 --- /dev/null +++ b/contrib/libc++/include/cassert @@ -0,0 +1,25 @@ +// -*- C++ -*- +//===-------------------------- cassert -----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +/* + cassert synopsis + +Macros: + + assert + +*/ + +#include <__config> +#include <assert.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif diff --git a/contrib/libc++/include/ccomplex b/contrib/libc++/include/ccomplex new file mode 100644 index 0000000..6ed1164 --- /dev/null +++ b/contrib/libc++/include/ccomplex @@ -0,0 +1,29 @@ +// -*- C++ -*- +//===--------------------------- ccomplex ---------------------------------===// +// +// 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_CCOMPLEX +#define _LIBCPP_CCOMPLEX + +/* + ccomplex synopsis + +#include <complex> + +*/ + +#include <complex> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +// hh 080623 Created + +#endif // _LIBCPP_CCOMPLEX diff --git a/contrib/libc++/include/cctype b/contrib/libc++/include/cctype new file mode 100644 index 0000000..e33244e --- /dev/null +++ b/contrib/libc++/include/cctype @@ -0,0 +1,164 @@ +// -*- C++ -*- +//===---------------------------- cctype ----------------------------------===// +// +// 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_CCTYPE +#define _LIBCPP_CCTYPE + +/* + cctype synopsis + +namespace std +{ + +int isalnum(int c); +int isalpha(int c); +int isblank(int c); // C99 +int iscntrl(int c); +int isdigit(int c); +int isgraph(int c); +int islower(int c); +int isprint(int c); +int ispunct(int c); +int isspace(int c); +int isupper(int c); +int isxdigit(int c); +int tolower(int c); +int toupper(int c); + +} // std +*/ + +#include <__config> +#include <ctype.h> +#if defined(_MSC_VER) +#include "support/win32/support.h" +#endif // _MSC_VER + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#ifdef isalnum +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isalnum(int __c) {return isalnum(__c);} +#undef isalnum +inline _LIBCPP_INLINE_VISIBILITY int isalnum(int __c) {return __libcpp_isalnum(__c);} +#else // isalnum +using ::isalnum; +#endif // isalnum + +#ifdef isalpha +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isalpha(int __c) {return isalpha(__c);} +#undef isalpha +inline _LIBCPP_INLINE_VISIBILITY int isalpha(int __c) {return __libcpp_isalpha(__c);} +#else // isalpha +using ::isalpha; +#endif // isalpha + +#ifdef isblank +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isblank(int __c) {return isblank(__c);} +#undef isblank +inline _LIBCPP_INLINE_VISIBILITY int isblank(int __c) {return __libcpp_isblank(__c);} +#else // isblank +using ::isblank; +#endif // isblank + +#ifdef iscntrl +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iscntrl(int __c) {return iscntrl(__c);} +#undef iscntrl +inline _LIBCPP_INLINE_VISIBILITY int iscntrl(int __c) {return __libcpp_iscntrl(__c);} +#else // iscntrl +using ::iscntrl; +#endif // iscntrl + +#ifdef isdigit +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isdigit(int __c) {return isdigit(__c);} +#undef isdigit +inline _LIBCPP_INLINE_VISIBILITY int isdigit(int __c) {return __libcpp_isdigit(__c);} +#else // isdigit +using ::isdigit; +#endif // isdigit + +#ifdef isgraph +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isgraph(int __c) {return isgraph(__c);} +#undef isgraph +inline _LIBCPP_INLINE_VISIBILITY int isgraph(int __c) {return __libcpp_isgraph(__c);} +#else // isgraph +using ::isgraph; +#endif // isgraph + +#ifdef islower +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_islower(int __c) {return islower(__c);} +#undef islower +inline _LIBCPP_INLINE_VISIBILITY int islower(int __c) {return __libcpp_islower(__c);} +#else // islower +using ::islower; +#endif // islower + +#ifdef isprint +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isprint(int __c) {return isprint(__c);} +#undef isprint +inline _LIBCPP_INLINE_VISIBILITY int isprint(int __c) {return __libcpp_isprint(__c);} +#else // isprint +using ::isprint; +#endif // isprint + +#ifdef ispunct +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_ispunct(int __c) {return ispunct(__c);} +#undef ispunct +inline _LIBCPP_INLINE_VISIBILITY int ispunct(int __c) {return __libcpp_ispunct(__c);} +#else // ispunct +using ::ispunct; +#endif // ispunct + +#ifdef isspace +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isspace(int __c) {return isspace(__c);} +#undef isspace +inline _LIBCPP_INLINE_VISIBILITY int isspace(int __c) {return __libcpp_isspace(__c);} +#else // isspace +using ::isspace; +#endif // isspace + +#ifdef isupper +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isupper(int __c) {return isupper(__c);} +#undef isupper +inline _LIBCPP_INLINE_VISIBILITY int isupper(int __c) {return __libcpp_isupper(__c);} +#else // isupper +using ::isupper; +#endif // isupper + +#ifdef isxdigit +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_isxdigit(int __c) {return isxdigit(__c);} +#undef isxdigit +inline _LIBCPP_INLINE_VISIBILITY int isxdigit(int __c) {return __libcpp_isxdigit(__c);} +#else // isxdigit +using ::isxdigit; +#endif // isxdigit + +#ifdef tolower +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_tolower(int __c) {return tolower(__c);} +#undef tolower +inline _LIBCPP_INLINE_VISIBILITY int tolower(int __c) {return __libcpp_tolower(__c);} +#else // tolower +using ::tolower; +#endif // tolower + +#ifdef toupper +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_toupper(int __c) {return toupper(__c);} +#undef toupper +inline _LIBCPP_INLINE_VISIBILITY int toupper(int __c) {return __libcpp_toupper(__c);} +#else // toupper +using ::toupper; +#endif // toupper + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CCTYPE diff --git a/contrib/libc++/include/cerrno b/contrib/libc++/include/cerrno new file mode 100644 index 0000000..9804e4e --- /dev/null +++ b/contrib/libc++/include/cerrno @@ -0,0 +1,393 @@ +// -*- C++ -*- +//===-------------------------- cerrno ------------------------------------===// +// +// 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_CERRNO +#define _LIBCPP_CERRNO + +/* + cerrno synopsis + +Macros: + + EDOM + EILSEQ // C99 + ERANGE + errno + +*/ + +#include <__config> +#include <errno.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) + +#ifdef ELAST + +const int __elast1 = ELAST+1; +const int __elast2 = ELAST+2; + +#else + +const int __elast1 = 104; +const int __elast2 = 105; + +#endif + +#ifdef ENOTRECOVERABLE + +#define EOWNERDEAD __elast1 + +#ifdef ELAST +#undef ELAST +#define ELAST EOWNERDEAD +#endif + +#elif defined(EOWNERDEAD) + +#define ENOTRECOVERABLE __elast1 +#ifdef ELAST +#undef ELAST +#define ELAST ENOTRECOVERABLE +#endif + +#else // defined(EOWNERDEAD) + +#define EOWNERDEAD __elast1 +#define ENOTRECOVERABLE __elast2 +#ifdef ELAST +#undef ELAST +#define ELAST ENOTRECOVERABLE +#endif + +#endif // defined(EOWNERDEAD) + +#endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) + +// supply errno values likely to be missing, particularly on Windows + +#ifndef EAFNOSUPPORT +#define EAFNOSUPPORT 9901 +#endif + +#ifndef EADDRINUSE +#define EADDRINUSE 9902 +#endif + +#ifndef EADDRNOTAVAIL +#define EADDRNOTAVAIL 9903 +#endif + +#ifndef EISCONN +#define EISCONN 9904 +#endif + +#ifndef EBADMSG +#define EBADMSG 9905 +#endif + +#ifndef ECONNABORTED +#define ECONNABORTED 9906 +#endif + +#ifndef EALREADY +#define EALREADY 9907 +#endif + +#ifndef ECONNREFUSED +#define ECONNREFUSED 9908 +#endif + +#ifndef ECONNRESET +#define ECONNRESET 9909 +#endif + +#ifndef EDESTADDRREQ +#define EDESTADDRREQ 9910 +#endif + +#ifndef EHOSTUNREACH +#define EHOSTUNREACH 9911 +#endif + +#ifndef EIDRM +#define EIDRM 9912 +#endif + +#ifndef EMSGSIZE +#define EMSGSIZE 9913 +#endif + +#ifndef ENETDOWN +#define ENETDOWN 9914 +#endif + +#ifndef ENETRESET +#define ENETRESET 9915 +#endif + +#ifndef ENETUNREACH +#define ENETUNREACH 9916 +#endif + +#ifndef ENOBUFS +#define ENOBUFS 9917 +#endif + +#ifndef ENOLINK +#define ENOLINK 9918 +#endif + +#ifndef ENODATA +#define ENODATA 9919 +#endif + +#ifndef ENOMSG +#define ENOMSG 9920 +#endif + +#ifndef ENOPROTOOPT +#define ENOPROTOOPT 9921 +#endif + +#ifndef ENOSR +#define ENOSR 9922 +#endif + +#ifndef ENOTSOCK +#define ENOTSOCK 9923 +#endif + +#ifndef ENOSTR +#define ENOSTR 9924 +#endif + +#ifndef ENOTCONN +#define ENOTCONN 9925 +#endif + +#ifndef ENOTSUP +#define ENOTSUP 9926 +#endif + +#ifndef ECANCELED +#define ECANCELED 9927 +#endif + +#ifndef EINPROGRESS +#define EINPROGRESS 9928 +#endif + +#ifndef EOPNOTSUPP +#define EOPNOTSUPP 9929 +#endif + +#ifndef EWOULDBLOCK +#define EWOULDBLOCK 9930 +#endif + +#ifndef EOWNERDEAD +#define EOWNERDEAD 9931 +#endif + +#ifndef EPROTO +#define EPROTO 9932 +#endif + +#ifndef EPROTONOSUPPORT +#define EPROTONOSUPPORT 9933 +#endif + +#ifndef ENOTRECOVERABLE +#define ENOTRECOVERABLE 9934 +#endif + +#ifndef ETIME +#define ETIME 9935 +#endif + +#ifndef ETXTBSY +#define ETXTBSY 9936 +#endif + +#ifndef ETIMEDOUT +#define ETIMEDOUT 9938 +#endif + +#ifndef ELOOP +#define ELOOP 9939 +#endif + +#ifndef EOVERFLOW +#define EOVERFLOW 9940 +#endif + +#ifndef EPROTOTYPE +#define EPROTOTYPE 9941 +#endif + +#ifndef ENOSYS +#define ENOSYS 9942 +#endif + +#ifndef EINVAL +#define EINVAL 9943 +#endif + +#ifndef ERANGE +#define ERANGE 9944 +#endif + +#ifndef EILSEQ +#define EILSEQ 9945 +#endif + +// Windows Mobile doesn't appear to define these: + +#ifndef E2BIG +#define E2BIG 9946 +#endif + +#ifndef EDOM +#define EDOM 9947 +#endif + +#ifndef EFAULT +#define EFAULT 9948 +#endif + +#ifndef EBADF +#define EBADF 9949 +#endif + +#ifndef EPIPE +#define EPIPE 9950 +#endif + +#ifndef EXDEV +#define EXDEV 9951 +#endif + +#ifndef EBUSY +#define EBUSY 9952 +#endif + +#ifndef ENOTEMPTY +#define ENOTEMPTY 9953 +#endif + +#ifndef ENOEXEC +#define ENOEXEC 9954 +#endif + +#ifndef EEXIST +#define EEXIST 9955 +#endif + +#ifndef EFBIG +#define EFBIG 9956 +#endif + +#ifndef ENAMETOOLONG +#define ENAMETOOLONG 9957 +#endif + +#ifndef ENOTTY +#define ENOTTY 9958 +#endif + +#ifndef EINTR +#define EINTR 9959 +#endif + +#ifndef ESPIPE +#define ESPIPE 9960 +#endif + +#ifndef EIO +#define EIO 9961 +#endif + +#ifndef EISDIR +#define EISDIR 9962 +#endif + +#ifndef ECHILD +#define ECHILD 9963 +#endif + +#ifndef ENOLCK +#define ENOLCK 9964 +#endif + +#ifndef ENOSPC +#define ENOSPC 9965 +#endif + +#ifndef ENXIO +#define ENXIO 9966 +#endif + +#ifndef ENODEV +#define ENODEV 9967 +#endif + +#ifndef ENOENT +#define ENOENT 9968 +#endif + +#ifndef ESRCH +#define ESRCH 9969 +#endif + +#ifndef ENOTDIR +#define ENOTDIR 9970 +#endif + +#ifndef ENOMEM +#define ENOMEM 9971 +#endif + +#ifndef EPERM +#define EPERM 9972 +#endif + +#ifndef EACCES +#define EACCES 9973 +#endif + +#ifndef EROFS +#define EROFS 9974 +#endif + +#ifndef EDEADLK +#define EDEADLK 9975 +#endif + +#ifndef EAGAIN +#define EAGAIN 9976 +#endif + +#ifndef ENFILE +#define ENFILE 9977 +#endif + +#ifndef EMFILE +#define EMFILE 9978 +#endif + +#ifndef EMLINK +#define EMLINK 9979 +#endif + +#endif // _LIBCPP_CERRNO diff --git a/contrib/libc++/include/cfenv b/contrib/libc++/include/cfenv new file mode 100644 index 0000000..dd7db37 --- /dev/null +++ b/contrib/libc++/include/cfenv @@ -0,0 +1,82 @@ +// -*- C++ -*- +//===---------------------------- cctype ----------------------------------===// +// +// 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_CFENV +#define _LIBCPP_CFENV + +/* + cfenv synopsis + +This entire header is C99 / C++0X + +Macros: + + FE_DIVBYZERO + FE_INEXACT + FE_INVALID + FE_OVERFLOW + FE_UNDERFLOW + FE_ALL_EXCEPT + FE_DOWNWARD + FE_TONEAREST + FE_TOWARDZERO + FE_UPWARD + FE_DFL_ENV + +namespace std +{ + +Types: + + fenv_t + fexcept_t + +int feclearexcept(int excepts); +int fegetexceptflag(fexcept_t* flagp, int excepts); +int feraiseexcept(int excepts); +int fesetexceptflag(const fexcept_t* flagp, int excepts); +int fetestexcept(int excepts); +int fegetround(); +int fesetround(int round); +int fegetenv(fenv_t* envp); +int feholdexcept(fenv_t* envp); +int fesetenv(const fenv_t* envp); +int feupdateenv(const fenv_t* envp); + +} // std +*/ + +#include <__config> +#include <fenv.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::fenv_t; +using ::fexcept_t; + +using ::feclearexcept; +using ::fegetexceptflag; +using ::feraiseexcept; +using ::fesetexceptflag; +using ::fetestexcept; +using ::fegetround; +using ::fesetround; +using ::fegetenv; +using ::feholdexcept; +using ::fesetenv; +using ::feupdateenv; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CFENV diff --git a/contrib/libc++/include/cfloat b/contrib/libc++/include/cfloat new file mode 100644 index 0000000..5fa5655 --- /dev/null +++ b/contrib/libc++/include/cfloat @@ -0,0 +1,78 @@ +// -*- C++ -*- +//===--------------------------- cfloat -----------------------------------===// +// +// 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_CFLOAT +#define _LIBCPP_CFLOAT + +/* + cfloat synopsis + +Macros: + + FLT_ROUNDS + FLT_EVAL_METHOD // C99 + FLT_RADIX + + FLT_MANT_DIG + DBL_MANT_DIG + LDBL_MANT_DIG + + DECIMAL_DIG // C99 + + FLT_DIG + DBL_DIG + LDBL_DIG + + FLT_MIN_EXP + DBL_MIN_EXP + LDBL_MIN_EXP + + FLT_MIN_10_EXP + DBL_MIN_10_EXP + LDBL_MIN_10_EXP + + FLT_MAX_EXP + DBL_MAX_EXP + LDBL_MAX_EXP + + FLT_MAX_10_EXP + DBL_MAX_10_EXP + LDBL_MAX_10_EXP + + FLT_MAX + DBL_MAX + LDBL_MAX + + FLT_EPSILON + DBL_EPSILON + LDBL_EPSILON + + FLT_MIN + DBL_MIN + LDBL_MIN + +*/ + +#include <__config> +#include <float.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifndef FLT_EVAL_METHOD +#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ +#endif + +#ifndef DECIMAL_DIG +#define DECIMAL_DIG __DECIMAL_DIG__ +#endif + +#endif // _LIBCPP_CFLOAT diff --git a/contrib/libc++/include/chrono b/contrib/libc++/include/chrono new file mode 100644 index 0000000..0571f9d --- /dev/null +++ b/contrib/libc++/include/chrono @@ -0,0 +1,875 @@ +// -*- C++ -*- +//===---------------------------- chrono ----------------------------------===// +// +// 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_CHRONO +#define _LIBCPP_CHRONO + +/* + chrono synopsis + +namespace std +{ +namespace chrono +{ + +template <class ToDuration, class Rep, class Period> +ToDuration +duration_cast(const duration<Rep, Period>& fd); + +template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {}; + +template <class Rep> +struct duration_values +{ +public: + static Rep zero(); + static Rep max(); + static Rep min(); +}; + +// duration + +template <class Rep, class Period = ratio<1>> +class duration +{ + static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration"); + static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio"); + static_assert(Period::num > 0, "duration period must be positive"); +public: + typedef Rep rep; + typedef Period period; + + duration() = default; + template <class Rep2> + explicit duration(const Rep2& r, + typename enable_if + < + is_convertible<Rep2, rep>::value && + (treat_as_floating_point<rep>::value || + !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value) + >::type* = 0); + + // conversions + template <class Rep2, class Period2> + duration(const duration<Rep2, Period2>& d, + typename enable_if + < + treat_as_floating_point<rep>::value || + ratio_divide<Period2, period>::type::den == 1 + >::type* = 0); + + // observer + + rep count() const; + + // arithmetic + + duration operator+() const; + duration operator-() const; + duration& operator++(); + duration operator++(int); + duration& operator--(); + duration operator--(int); + + duration& operator+=(const duration& d); + duration& operator-=(const duration& d); + + duration& operator*=(const rep& rhs); + duration& operator/=(const rep& rhs); + + // special values + + static duration zero(); + static duration min(); + static duration max(); +}; + +typedef duration<long long, nano> nanoseconds; +typedef duration<long long, micro> microseconds; +typedef duration<long long, milli> milliseconds; +typedef duration<long long > seconds; +typedef duration< long, ratio< 60> > minutes; +typedef duration< long, ratio<3600> > hours; + +template <class Clock, class Duration = typename Clock::duration> +class time_point +{ +public: + typedef Clock clock; + typedef Duration duration; + typedef typename duration::rep rep; + typedef typename duration::period period; +private: + duration d_; // exposition only + +public: + time_point(); // has value "epoch" + explicit time_point(const duration& d); // same as time_point() + d + + // conversions + template <class Duration2> + time_point(const time_point<clock, Duration2>& t); + + // observer + + duration time_since_epoch() const; + + // arithmetic + + time_point& operator+=(const duration& d); + time_point& operator-=(const duration& d); + + // special values + + static constexpr time_point min(); + static constexpr time_point max(); +}; + +} // chrono + +// common_type traits +template <class Rep1, class Period1, class Rep2, class Period2> + struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>; + +template <class Clock, class Duration1, class Duration2> + struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>; + +namespace chrono { + +// duration arithmetic +template <class Rep1, class Period1, class Rep2, class Period2> + typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type + operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type + operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period, class Rep2> + duration<typename common_type<Rep1, Rep2>::type, Period> + operator*(const duration<Rep1, Period>& d, const Rep2& s); +template <class Rep1, class Period, class Rep2> + duration<typename common_type<Rep1, Rep2>::type, Period> + operator*(const Rep1& s, const duration<Rep2, Period>& d); +template <class Rep1, class Period, class Rep2> + duration<typename common_type<Rep1, Rep2>::type, Period> + operator/(const duration<Rep1, Period>& d, const Rep2& s); +template <class Rep1, class Period1, class Rep2, class Period2> + typename common_type<Rep1, Rep2>::type + operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); + +// duration comparisons +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Rep2, class Period2> + bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); + +// duration_cast +template <class ToDuration, class Rep, class Period> + ToDuration duration_cast(const duration<Rep, Period>& d); + +// time_point arithmetic +template <class Clock, class Duration1, class Rep2, class Period2> + time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type> + operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Rep1, class Period1, class Clock, class Duration2> + time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type> + operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Rep2, class Period2> + time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type> + operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); +template <class Clock, class Duration1, class Duration2> + typename common_type<Duration1, Duration2>::type + operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); + +// time_point comparisons +template <class Clock, class Duration1, class Duration2> + bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Duration2> + bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Duration2> + bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Duration2> + bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Duration2> + bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); +template <class Clock, class Duration1, class Duration2> + bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); + +// time_point_cast + +template <class ToDuration, class Clock, class Duration> + time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t); + +// Clocks + +class system_clock +{ +public: + typedef microseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point<system_clock> time_point; + static const bool is_steady = false; + + static time_point now() noexcept; + static time_t to_time_t (const time_point& __t) noexcept; + static time_point from_time_t(time_t __t) noexcept; +}; + +class steady_clock +{ +public: + typedef nanoseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point<steady_clock, duration> time_point; + static const bool is_steady = true; + + static time_point now() noexcept; +}; + +typedef steady_clock high_resolution_clock; + +} // chrono + +} // std +*/ + +#include <__config> +#include <ctime> +#include <type_traits> +#include <ratio> +#include <limits> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +template <class _Rep, class _Period = ratio<1> > class _LIBCPP_VISIBLE duration; + +template <class _Tp> +struct __is_duration : false_type {}; + +template <class _Rep, class _Period> +struct __is_duration<duration<_Rep, _Period> > : true_type {}; + +template <class _Rep, class _Period> +struct __is_duration<const duration<_Rep, _Period> > : true_type {}; + +template <class _Rep, class _Period> +struct __is_duration<volatile duration<_Rep, _Period> > : true_type {}; + +template <class _Rep, class _Period> +struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {}; + +} // chrono + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +struct _LIBCPP_VISIBLE common_type<chrono::duration<_Rep1, _Period1>, + chrono::duration<_Rep2, _Period2> > +{ + typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type, + typename __ratio_gcd<_Period1, _Period2>::type> type; +}; + +namespace chrono { + +// duration_cast + +template <class _FromDuration, class _ToDuration, + class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type, + bool = _Period::num == 1, + bool = _Period::den == 1> +struct __duration_cast; + +template <class _FromDuration, class _ToDuration, class _Period> +struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true> +{ + _LIBCPP_INLINE_VISIBILITY + _ToDuration operator()(const _FromDuration& __fd) const + { + return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count())); + } +}; + +template <class _FromDuration, class _ToDuration, class _Period> +struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false> +{ + _LIBCPP_INLINE_VISIBILITY + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; + return _ToDuration(static_cast<typename _ToDuration::rep>( + static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den))); + } +}; + +template <class _FromDuration, class _ToDuration, class _Period> +struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true> +{ + _LIBCPP_INLINE_VISIBILITY + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; + return _ToDuration(static_cast<typename _ToDuration::rep>( + static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num))); + } +}; + +template <class _FromDuration, class _ToDuration, class _Period> +struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false> +{ + _LIBCPP_INLINE_VISIBILITY + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; + return _ToDuration(static_cast<typename _ToDuration::rep>( + static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num) + / static_cast<_Ct>(_Period::den))); + } +}; + +template <class _ToDuration, class _Rep, class _Period> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_duration<_ToDuration>::value, + _ToDuration +>::type +duration_cast(const duration<_Rep, _Period>& __fd) +{ + return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); +} + +template <class _Rep> +struct _LIBCPP_VISIBLE treat_as_floating_point : is_floating_point<_Rep> {}; + +template <class _Rep> +struct _LIBCPP_VISIBLE duration_values +{ +public: + _LIBCPP_INLINE_VISIBILITY static _Rep zero() {return _Rep(0);} + _LIBCPP_INLINE_VISIBILITY static _Rep max() {return numeric_limits<_Rep>::max();} + _LIBCPP_INLINE_VISIBILITY static _Rep min() {return numeric_limits<_Rep>::lowest();} +}; + +// duration + +template <class _Rep, class _Period> +class _LIBCPP_VISIBLE duration +{ + static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration"); + static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio"); + static_assert(_Period::num > 0, "duration period must be positive"); +public: + typedef _Rep rep; + typedef _Period period; +private: + rep __rep_; +public: + + _LIBCPP_INLINE_VISIBILITY duration() {} // = default; + template <class _Rep2> + _LIBCPP_INLINE_VISIBILITY + explicit duration(const _Rep2& __r, + typename enable_if + < + is_convertible<_Rep2, rep>::value && + (treat_as_floating_point<rep>::value || + !treat_as_floating_point<_Rep2>::value) + >::type* = 0) + : __rep_(__r) {} + + // conversions + template <class _Rep2, class _Period2> + _LIBCPP_INLINE_VISIBILITY + duration(const duration<_Rep2, _Period2>& __d, + typename enable_if + < + treat_as_floating_point<rep>::value || + (ratio_divide<_Period2, period>::type::den == 1 && + !treat_as_floating_point<_Rep2>::value) + >::type* = 0) + : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {} + + // observer + + _LIBCPP_INLINE_VISIBILITY rep count() const {return __rep_;} + + // arithmetic + + _LIBCPP_INLINE_VISIBILITY duration operator+() const {return *this;} + _LIBCPP_INLINE_VISIBILITY duration operator-() const {return duration(-__rep_);} + _LIBCPP_INLINE_VISIBILITY duration& operator++() {++__rep_; return *this;} + _LIBCPP_INLINE_VISIBILITY duration operator++(int) {return duration(__rep_++);} + _LIBCPP_INLINE_VISIBILITY duration& operator--() {--__rep_; return *this;} + _LIBCPP_INLINE_VISIBILITY duration operator--(int) {return duration(__rep_--);} + + _LIBCPP_INLINE_VISIBILITY duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;} + _LIBCPP_INLINE_VISIBILITY duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;} + + _LIBCPP_INLINE_VISIBILITY duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;} + + // special values + + _LIBCPP_INLINE_VISIBILITY static duration zero() {return duration(duration_values<rep>::zero());} + _LIBCPP_INLINE_VISIBILITY static duration min() {return duration(duration_values<rep>::min());} + _LIBCPP_INLINE_VISIBILITY static duration max() {return duration(duration_values<rep>::max());} +}; + +typedef duration<long long, nano> nanoseconds; +typedef duration<long long, micro> microseconds; +typedef duration<long long, milli> milliseconds; +typedef duration<long long > seconds; +typedef duration< long, ratio< 60> > minutes; +typedef duration< long, ratio<3600> > hours; + +// Duration == + +template <class _LhsDuration, class _RhsDuration> +struct __duration_eq +{ + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) + { + typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; + return _Ct(__lhs).count() == _Ct(__rhs).count(); + } +}; + +template <class _LhsDuration> +struct __duration_eq<_LhsDuration, _LhsDuration> +{ + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) + {return __lhs.count() == __rhs.count();} +}; + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); +} + +// Duration != + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__lhs == __rhs); +} + +// Duration < + +template <class _LhsDuration, class _RhsDuration> +struct __duration_lt +{ + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) + { + typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; + return _Ct(__lhs).count() < _Ct(__rhs).count(); + } +}; + +template <class _LhsDuration> +struct __duration_lt<_LhsDuration, _LhsDuration> +{ + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) + {return __lhs.count() < __rhs.count();} +}; + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); +} + +// Duration > + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __rhs < __lhs; +} + +// Duration <= + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__rhs < __lhs); +} + +// Duration >= + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__lhs < __rhs); +} + +// Duration + + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type +operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type __r = __lhs; + __r += __rhs; + return __r; +} + +// Duration - + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type +operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type __r = __lhs; + __r -= __rhs; + return __r; +} + +// Duration * + +template <class _Rep1, class _Period, class _Rep2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, + duration<typename common_type<_Rep1, _Rep2>::type, _Period> +>::type +operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + duration<_Cr, _Period> __r = __d; + __r *= static_cast<_Cr>(__s); + return __r; +} + +template <class _Rep1, class _Period, class _Rep2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value, + duration<typename common_type<_Rep1, _Rep2>::type, _Period> +>::type +operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) +{ + return __d * __s; +} + +// Duration / + +template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value> +struct __duration_divide_result +{ +}; + +template <class _Duration, class _Rep2, + bool = is_convertible<_Rep2, + typename common_type<typename _Duration::rep, _Rep2>::type>::value> +struct __duration_divide_imp +{ +}; + +template <class _Rep1, class _Period, class _Rep2> +struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true> +{ + typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type; +}; + +template <class _Rep1, class _Period, class _Rep2> +struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false> + : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2> +{ +}; + +template <class _Rep1, class _Period, class _Rep2> +inline _LIBCPP_INLINE_VISIBILITY +typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type +operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + duration<_Cr, _Period> __r = __d; + __r /= static_cast<_Cr>(__s); + return __r; +} + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +typename common_type<_Rep1, _Rep2>::type +operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct; + return _Ct(__lhs).count() / _Ct(__rhs).count(); +} + +// Duration % + +template <class _Rep1, class _Period, class _Rep2> +inline _LIBCPP_INLINE_VISIBILITY +typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type +operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + duration<_Cr, _Period> __r = __d; + __r %= static_cast<_Cr>(__s); + return __r; +} + +template <class _Rep1, class _Period1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type +operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type __r = __lhs; + __r %= __rhs; + return __r; +} + +////////////////////////////////////////////////////////// +///////////////////// time_point ///////////////////////// +////////////////////////////////////////////////////////// + +template <class _Clock, class _Duration = typename _Clock::duration> +class _LIBCPP_VISIBLE time_point +{ + static_assert(__is_duration<_Duration>::value, + "Second template parameter of time_point must be a std::chrono::duration"); +public: + typedef _Clock clock; + typedef _Duration duration; + typedef typename duration::rep rep; + typedef typename duration::period period; +private: + duration __d_; + +public: + _LIBCPP_INLINE_VISIBILITY time_point() : __d_(duration::zero()) {} + _LIBCPP_INLINE_VISIBILITY explicit time_point(const duration& __d) : __d_(__d) {} + + // conversions + template <class _Duration2> + _LIBCPP_INLINE_VISIBILITY + time_point(const time_point<clock, _Duration2>& t, + typename enable_if + < + is_convertible<_Duration2, duration>::value + >::type* = 0) + : __d_(t.time_since_epoch()) {} + + // observer + + _LIBCPP_INLINE_VISIBILITY duration time_since_epoch() const {return __d_;} + + // arithmetic + + _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d;} + _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d;} + + // special values + + _LIBCPP_INLINE_VISIBILITY static time_point min() {return time_point(duration::min());} + _LIBCPP_INLINE_VISIBILITY static time_point max() {return time_point(duration::max());} +}; + +} // chrono + +template <class _Clock, class _Duration1, class _Duration2> +struct _LIBCPP_VISIBLE common_type<chrono::time_point<_Clock, _Duration1>, + chrono::time_point<_Clock, _Duration2> > +{ + typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type; +}; + +namespace chrono { + +template <class _ToDuration, class _Clock, class _Duration> +inline _LIBCPP_INLINE_VISIBILITY +time_point<_Clock, _ToDuration> +time_point_cast(const time_point<_Clock, _Duration>& __t) +{ + return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); +} + +// time_point == + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() == __rhs.time_since_epoch(); +} + +// time_point != + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__lhs == __rhs); +} + +// time_point < + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() < __rhs.time_since_epoch(); +} + +// time_point > + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __rhs < __lhs; +} + +// time_point <= + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__rhs < __lhs); +} + +// time_point >= + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__lhs < __rhs); +} + +// time_point operator+(time_point x, duration y); + +template <class _Clock, class _Duration1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> +operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr; + _Tr __r(__lhs.time_since_epoch()); + __r += __rhs; + return __r; +} + +// time_point operator+(duration x, time_point y); + +template <class _Rep1, class _Period1, class _Clock, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type> +operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __rhs + __lhs; +} + +// time_point operator-(time_point x, duration y); + +template <class _Clock, class _Duration1, class _Rep2, class _Period2> +inline _LIBCPP_INLINE_VISIBILITY +time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> +operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __lhs + (-__rhs); +} + +// duration operator-(time_point x, time_point y); + +template <class _Clock, class _Duration1, class _Duration2> +inline _LIBCPP_INLINE_VISIBILITY +typename common_type<_Duration1, _Duration2>::type +operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() - __rhs.time_since_epoch(); +} + +////////////////////////////////////////////////////////// +/////////////////////// clocks /////////////////////////// +////////////////////////////////////////////////////////// + +class _LIBCPP_VISIBLE system_clock +{ +public: + typedef microseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point<system_clock> time_point; + static const bool is_steady = false; + + static time_point now() _NOEXCEPT; + static time_t to_time_t (const time_point& __t) _NOEXCEPT; + static time_point from_time_t(time_t __t) _NOEXCEPT; +}; + +class _LIBCPP_VISIBLE steady_clock +{ +public: + typedef nanoseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point<steady_clock, duration> time_point; + static const bool is_steady = true; + + static time_point now() _NOEXCEPT; +}; + +typedef steady_clock high_resolution_clock; + +} // chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CHRONO diff --git a/contrib/libc++/include/cinttypes b/contrib/libc++/include/cinttypes new file mode 100644 index 0000000..786692b --- /dev/null +++ b/contrib/libc++/include/cinttypes @@ -0,0 +1,259 @@ +// -*- C++ -*- +//===--------------------------- cinttypes --------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_CINTTYPES +#define _LIBCPP_CINTTYPES + +/* + cinttypes synopsis + +This entire header is C99 / C++0X + +#include <cstdint> // <cinttypes> includes <cstdint> + +Macros: + + PRId8 + PRId16 + PRId32 + PRId64 + + PRIdLEAST8 + PRIdLEAST16 + PRIdLEAST32 + PRIdLEAST64 + + PRIdFAST8 + PRIdFAST16 + PRIdFAST32 + PRIdFAST64 + + PRIdMAX + PRIdPTR + + PRIi8 + PRIi16 + PRIi32 + PRIi64 + + PRIiLEAST8 + PRIiLEAST16 + PRIiLEAST32 + PRIiLEAST64 + + PRIiFAST8 + PRIiFAST16 + PRIiFAST32 + PRIiFAST64 + + PRIiMAX + PRIiPTR + + PRIo8 + PRIo16 + PRIo32 + PRIo64 + + PRIoLEAST8 + PRIoLEAST16 + PRIoLEAST32 + PRIoLEAST64 + + PRIoFAST8 + PRIoFAST16 + PRIoFAST32 + PRIoFAST64 + + PRIoMAX + PRIoPTR + + PRIu8 + PRIu16 + PRIu32 + PRIu64 + + PRIuLEAST8 + PRIuLEAST16 + PRIuLEAST32 + PRIuLEAST64 + + PRIuFAST8 + PRIuFAST16 + PRIuFAST32 + PRIuFAST64 + + PRIuMAX + PRIuPTR + + PRIx8 + PRIx16 + PRIx32 + PRIx64 + + PRIxLEAST8 + PRIxLEAST16 + PRIxLEAST32 + PRIxLEAST64 + + PRIxFAST8 + PRIxFAST16 + PRIxFAST32 + PRIxFAST64 + + PRIxMAX + PRIxPTR + + PRIX8 + PRIX16 + PRIX32 + PRIX64 + + PRIXLEAST8 + PRIXLEAST16 + PRIXLEAST32 + PRIXLEAST64 + + PRIXFAST8 + PRIXFAST16 + PRIXFAST32 + PRIXFAST64 + + PRIXMAX + PRIXPTR + + SCNd8 + SCNd16 + SCNd32 + SCNd64 + + SCNdLEAST8 + SCNdLEAST16 + SCNdLEAST32 + SCNdLEAST64 + + SCNdFAST8 + SCNdFAST16 + SCNdFAST32 + SCNdFAST64 + + SCNdMAX + SCNdPTR + + SCNi8 + SCNi16 + SCNi32 + SCNi64 + + SCNiLEAST8 + SCNiLEAST16 + SCNiLEAST32 + SCNiLEAST64 + + SCNiFAST8 + SCNiFAST16 + SCNiFAST32 + SCNiFAST64 + + SCNiMAX + SCNiPTR + + SCNo8 + SCNo16 + SCNo32 + SCNo64 + + SCNoLEAST8 + SCNoLEAST16 + SCNoLEAST32 + SCNoLEAST64 + + SCNoFAST8 + SCNoFAST16 + SCNoFAST32 + SCNoFAST64 + + SCNoMAX + SCNoPTR + + SCNu8 + SCNu16 + SCNu32 + SCNu64 + + SCNuLEAST8 + SCNuLEAST16 + SCNuLEAST32 + SCNuLEAST64 + + SCNuFAST8 + SCNuFAST16 + SCNuFAST32 + SCNuFAST64 + + SCNuMAX + SCNuPTR + + SCNx8 + SCNx16 + SCNx32 + SCNx64 + + SCNxLEAST8 + SCNxLEAST16 + SCNxLEAST32 + SCNxLEAST64 + + SCNxFAST8 + SCNxFAST16 + SCNxFAST32 + SCNxFAST64 + + SCNxMAX + SCNxPTR + +namespace std +{ + +Types: + + imaxdiv_t + +intmax_t imaxabs(intmax_t j); +imaxdiv_t imaxdiv(intmax_t numer, intmax_t denom); +intmax_t strtoimax(const char* restrict nptr, char** restrict endptr, int base); +uintmax_t strtoumax(const char* restrict nptr, char** restrict endptr, int base); +intmax_t wcstoimax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); +uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); + +} // std +*/ + +#include <__config> +#include <cstdint> +#include <inttypes.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using::imaxdiv_t; + +using::imaxabs; +using::imaxdiv; +using::strtoimax; +using::strtoumax; +using::wcstoimax; +using::wcstoumax; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CINTTYPES diff --git a/contrib/libc++/include/ciso646 b/contrib/libc++/include/ciso646 new file mode 100644 index 0000000..b2efc72 --- /dev/null +++ b/contrib/libc++/include/ciso646 @@ -0,0 +1,25 @@ +// -*- C++ -*- +//===--------------------------- ciso646 ----------------------------------===// +// +// 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_CISO646 +#define _LIBCPP_CISO646 + +/* + ciso646 synopsis + +*/ + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#endif // _LIBCPP_CISO646 diff --git a/contrib/libc++/include/climits b/contrib/libc++/include/climits new file mode 100644 index 0000000..81ffecd --- /dev/null +++ b/contrib/libc++/include/climits @@ -0,0 +1,48 @@ +// -*- C++ -*- +//===--------------------------- climits ----------------------------------===// +// +// 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_CLIMITS +#define _LIBCPP_CLIMITS + +/* + climits synopsis + +Macros: + + CHAR_BIT + SCHAR_MIN + SCHAR_MAX + UCHAR_MAX + CHAR_MIN + CHAR_MAX + MB_LEN_MAX + SHRT_MIN + SHRT_MAX + USHRT_MAX + INT_MIN + INT_MAX + UINT_MAX + LONG_MIN + LONG_MAX + ULONG_MAX + LLONG_MIN // C99 + LLONG_MAX // C99 + ULLONG_MAX // C99 + +*/ + +#include <__config> +#include <limits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#endif // _LIBCPP_CLIMITS diff --git a/contrib/libc++/include/clocale b/contrib/libc++/include/clocale new file mode 100644 index 0000000..f8b8f0d --- /dev/null +++ b/contrib/libc++/include/clocale @@ -0,0 +1,53 @@ +// -*- C++ -*- +//===--------------------------- clocale ----------------------------------===// +// +// 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_CLOCALE +#define _LIBCPP_CLOCALE + +/* + clocale synopsis + +Macros: + + LC_ALL + LC_COLLATE + LC_CTYPE + LC_MONETARY + LC_NUMERIC + LC_TIME + NULL + +namespace std +{ + +struct lconv; +char* setlocale(int category, const char* locale); +lconv* localeconv(); + +} // std + +*/ + +#include <__config> +#include <locale.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::lconv; +using ::setlocale; +using ::localeconv; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CLOCALE diff --git a/contrib/libc++/include/cmath b/contrib/libc++/include/cmath new file mode 100644 index 0000000..026889f --- /dev/null +++ b/contrib/libc++/include/cmath @@ -0,0 +1,1668 @@ +// -*- C++ -*- +//===---------------------------- cmath -----------------------------------===// +// +// 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_CMATH +#define _LIBCPP_CMATH + +/* + cmath synopsis + +Macros: + + HUGE_VAL + HUGE_VALF // C99 + HUGE_VALL // C99 + INFINITY // C99 + NAN // C99 + FP_INFINITE // C99 + FP_NAN // C99 + FP_NORMAL // C99 + FP_SUBNORMAL // C99 + FP_ZERO // C99 + FP_FAST_FMA // C99 + FP_FAST_FMAF // C99 + FP_FAST_FMAL // C99 + FP_ILOGB0 // C99 + FP_ILOGBNAN // C99 + MATH_ERRNO // C99 + MATH_ERREXCEPT // C99 + math_errhandling // C99 + +namespace std +{ + +Types: + + float_t // C99 + double_t // C99 + +// C90 + +floating_point abs(floating_point x); + +floating_point acos (arithmetic x); +float acosf(float x); +long double acosl(long double x); + +floating_point asin (arithmetic x); +float asinf(float x); +long double asinl(long double x); + +floating_point atan (arithmetic x); +float atanf(float x); +long double atanl(long double x); + +floating_point atan2 (arithmetic y, arithmetic x); +float atan2f(float y, float x); +long double atan2l(long double y, long double x); + +floating_point ceil (arithmetic x); +float ceilf(float x); +long double ceill(long double x); + +floating_point cos (arithmetic x); +float cosf(float x); +long double cosl(long double x); + +floating_point cosh (arithmetic x); +float coshf(float x); +long double coshl(long double x); + +floating_point exp (arithmetic x); +float expf(float x); +long double expl(long double x); + +floating_point fabs (arithmetic x); +float fabsf(float x); +long double fabsl(long double x); + +floating_point floor (arithmetic x); +float floorf(float x); +long double floorl(long double x); + +floating_point fmod (arithmetic x, arithmetic y); +float fmodf(float x, float y); +long double fmodl(long double x, long double y); + +floating_point frexp (arithmetic value, int* exp); +float frexpf(float value, int* exp); +long double frexpl(long double value, int* exp); + +floating_point ldexp (arithmetic value, int exp); +float ldexpf(float value, int exp); +long double ldexpl(long double value, int exp); + +floating_point log (arithmetic x); +float logf(float x); +long double logl(long double x); + +floating_point log10 (arithmetic x); +float log10f(float x); +long double log10l(long double x); + +floating_point modf (floating_point value, floating_point* iptr); +float modff(float value, float* iptr); +long double modfl(long double value, long double* iptr); + +floating_point pow (arithmetic x, arithmetic y); +float powf(float x, float y); +long double powl(long double x, long double y); + +floating_point sin (arithmetic x); +float sinf(float x); +long double sinl(long double x); + +floating_point sinh (arithmetic x); +float sinhf(float x); +long double sinhl(long double x); + +floating_point sqrt (arithmetic x); +float sqrtf(float x); +long double sqrtl(long double x); + +floating_point tan (arithmetic x); +float tanf(float x); +long double tanl(long double x); + +floating_point tanh (arithmetic x); +float tanhf(float x); +long double tanhl(long double x); + +// C99 + +bool signbit(floating_point x); + +int fpclassify(floating_point x); + +bool isfinite(floating_point x); +bool isinf(floating_point x); +bool isnan(floating_point x); +bool isnormal(floating_point x); + +bool isgreater(floating_point x, floating_point y); +bool isgreaterequal(floating_point x, floating_point y); +bool isless(floating_point x, floating_point y); +bool islessequal(floating_point x, floating_point y); +bool islessgreater(floating_point x, floating_point y); +bool isunordered(floating_point x, floating_point y); + +floating_point acosh (arithmetic x); +float acoshf(float x); +long double acoshl(long double x); + +floating_point asinh (arithmetic x); +float asinhf(float x); +long double asinhl(long double x); + +floating_point atanh (arithmetic x); +float atanhf(float x); +long double atanhl(long double x); + +floating_point cbrt (arithmetic x); +float cbrtf(float x); +long double cbrtl(long double x); + +floating_point copysign (arithmetic x, arithmetic y); +float copysignf(float x, float y); +long double copysignl(long double x, long double y); + +floating_point erf (arithmetic x); +float erff(float x); +long double erfl(long double x); + +floating_point erfc (arithmetic x); +float erfcf(float x); +long double erfcl(long double x); + +floating_point exp2 (arithmetic x); +float exp2f(float x); +long double exp2l(long double x); + +floating_point expm1 (arithmetic x); +float expm1f(float x); +long double expm1l(long double x); + +floating_point fdim (arithmetic x, arithmetic y); +float fdimf(float x, float y); +long double fdiml(long double x, long double y); + +floating_point fma (arithmetic x, arithmetic y, arithmetic z); +float fmaf(float x, float y, float z); +long double fmal(long double x, long double y, long double z); + +floating_point fmax (arithmetic x, arithmetic y); +float fmaxf(float x, float y); +long double fmaxl(long double x, long double y); + +floating_point fmin (arithmetic x, arithmetic y); +float fminf(float x, float y); +long double fminl(long double x, long double y); + +floating_point hypot (arithmetic x, arithmetic y); +float hypotf(float x, float y); +long double hypotl(long double x, long double y); + +int ilogb (arithmetic x); +int ilogbf(float x); +int ilogbl(long double x); + +floating_point lgamma (arithmetic x); +float lgammaf(float x); +long double lgammal(long double x); + +long long llrint (arithmetic x); +long long llrintf(float x); +long long llrintl(long double x); + +long long llround (arithmetic x); +long long llroundf(float x); +long long llroundl(long double x); + +floating_point log1p (arithmetic x); +float log1pf(float x); +long double log1pl(long double x); + +floating_point log2 (arithmetic x); +float log2f(float x); +long double log2l(long double x); + +floating_point logb (arithmetic x); +float logbf(float x); +long double logbl(long double x); + +long lrint (arithmetic x); +long lrintf(float x); +long lrintl(long double x); + +long lround (arithmetic x); +long lroundf(float x); +long lroundl(long double x); + +double nan (const char* str); +float nanf(const char* str); +long double nanl(const char* str); + +floating_point nearbyint (arithmetic x); +float nearbyintf(float x); +long double nearbyintl(long double x); + +floating_point nextafter (arithmetic x, arithmetic y); +float nextafterf(float x, float y); +long double nextafterl(long double x, long double y); + +floating_point nexttoward (arithmetic x, long double y); +float nexttowardf(float x, long double y); +long double nexttowardl(long double x, long double y); + +floating_point remainder (arithmetic x, arithmetic y); +float remainderf(float x, float y); +long double remainderl(long double x, long double y); + +floating_point remquo (arithmetic x, arithmetic y, int* pquo); +float remquof(float x, float y, int* pquo); +long double remquol(long double x, long double y, int* pquo); + +floating_point rint (arithmetic x); +float rintf(float x); +long double rintl(long double x); + +floating_point round (arithmetic x); +float roundf(float x); +long double roundl(long double x); + +floating_point scalbln (arithmetic x, long ex); +float scalblnf(float x, long ex); +long double scalblnl(long double x, long ex); + +floating_point scalbn (arithmetic x, int ex); +float scalbnf(float x, int ex); +long double scalbnl(long double x, int ex); + +floating_point tgamma (arithmetic x); +float tgammaf(float x); +long double tgammal(long double x); + +floating_point trunc (arithmetic x); +float truncf(float x); +long double truncl(long double x); + +} // std + +*/ + +#include <__config> +#include <math.h> +#include <type_traits> + +#ifdef _MSC_VER +#include "support/win32/math_win32.h" +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +// signbit + +#ifdef signbit + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_signbit(_A1 __x) +{ + return signbit(__x); +} + +#undef signbit + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type +signbit(_A1 __x) +{ + return __libcpp_signbit(__x); +} + +#endif // signbit + +// fpclassify + +#ifdef fpclassify + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +int +__libcpp_fpclassify(_A1 __x) +{ + return fpclassify(__x); +} + +#undef fpclassify + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, int>::type +fpclassify(_A1 __x) +{ + return __libcpp_fpclassify(__x); +} + +#endif // fpclassify + +// isfinite + +#ifdef isfinite + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isfinite(_A1 __x) +{ + return isfinite(__x); +} + +#undef isfinite + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type +isfinite(_A1 __x) +{ + return __libcpp_isfinite(__x); +} + +#endif // isfinite + +// isinf + +#ifdef isinf + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isinf(_A1 __x) +{ + return isinf(__x); +} + +#undef isinf + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type +isinf(_A1 __x) +{ + return __libcpp_isinf(__x); +} + +#endif // isinf + +// isnan + +#ifdef isnan + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isnan(_A1 __x) +{ + return isnan(__x); +} + +#undef isnan + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type +isnan(_A1 __x) +{ + return __libcpp_isnan(__x); +} + +#endif // isnan + +// isnormal + +#ifdef isnormal + +template <class _A1> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isnormal(_A1 __x) +{ + return isnormal(__x); +} + +#undef isnormal + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if<std::is_floating_point<_A1>::value, bool>::type +isnormal(_A1 __x) +{ + return __libcpp_isnormal(__x); +} + +#endif // isnormal + +// isgreater + +#ifdef isgreater + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isgreater(_A1 __x, _A2 __y) +{ + return isgreater(__x, __y); +} + +#undef isgreater + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +isgreater(_A1 __x, _A2 __y) +{ + return __libcpp_isgreater(__x, __y); +} + +#endif // isgreater + +// isgreaterequal + +#ifdef isgreaterequal + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isgreaterequal(_A1 __x, _A2 __y) +{ + return isgreaterequal(__x, __y); +} + +#undef isgreaterequal + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +isgreaterequal(_A1 __x, _A2 __y) +{ + return __libcpp_isgreaterequal(__x, __y); +} + +#endif // isgreaterequal + +// isless + +#ifdef isless + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isless(_A1 __x, _A2 __y) +{ + return isless(__x, __y); +} + +#undef isless + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +isless(_A1 __x, _A2 __y) +{ + return __libcpp_isless(__x, __y); +} + +#endif // isless + +// islessequal + +#ifdef islessequal + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_islessequal(_A1 __x, _A2 __y) +{ + return islessequal(__x, __y); +} + +#undef islessequal + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +islessequal(_A1 __x, _A2 __y) +{ + return __libcpp_islessequal(__x, __y); +} + +#endif // islessequal + +// islessgreater + +#ifdef islessgreater + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_islessgreater(_A1 __x, _A2 __y) +{ + return islessgreater(__x, __y); +} + +#undef islessgreater + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +islessgreater(_A1 __x, _A2 __y) +{ + return __libcpp_islessgreater(__x, __y); +} + +#endif // islessgreater + +// isunordered + +#ifdef isunordered + +template <class _A1, class _A2> +_LIBCPP_ALWAYS_INLINE +bool +__libcpp_isunordered(_A1 __x, _A2 __y) +{ + return isunordered(__x, __y); +} + +#undef isunordered + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename std::enable_if +< + std::is_floating_point<_A1>::value && + std::is_floating_point<_A2>::value, + bool +>::type +isunordered(_A1 __x, _A2 __y) +{ + return __libcpp_isunordered(__x, __y); +} + +#endif // isunordered + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::signbit; +using ::fpclassify; +using ::isfinite; +using ::isinf; +using ::isnan; +using ::isnormal; +using ::isgreater; +using ::isgreaterequal; +using ::isless; +using ::islessequal; +using ::islessgreater; +using ::isunordered; +using ::isunordered; + +using ::float_t; +using ::double_t; + +// abs + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_floating_point<_A1>::value, _A1>::type +abs(_A1 __x) {return fabs(__x);} + +#ifndef __sun__ + +// acos + +using ::acos; +using ::acosf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float acos(float __x) {return acosf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __x) {return acosl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +acos(_A1 __x) {return acos((double)__x);} + +// asin + +using ::asin; +using ::asinf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float asin(float __x) {return asinf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double asin(long double __x) {return asinl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +asin(_A1 __x) {return asin((double)__x);} + +// atan + +using ::atan; +using ::atanf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float atan(float __x) {return atanf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double atan(long double __x) {return atanl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +atan(_A1 __x) {return atan((double)__x);} + +// atan2 + +using ::atan2; +using ::atan2f; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float atan2(float __y, float __x) {return atan2f(__y, __x);} +inline _LIBCPP_INLINE_VISIBILITY long double atan2(long double __y, long double __x) {return atan2l(__y, __x);} +#endif + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +atan2(_A1 __y, _A2 __x) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return atan2((__result_type)__y, (__result_type)__x); +} + +// ceil + +using ::ceil; +using ::ceilf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float ceil(float __x) {return ceilf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double ceil(long double __x) {return ceill(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +ceil(_A1 __x) {return ceil((double)__x);} + +// cos + +using ::cos; +using ::cosf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float cos(float __x) {return cosf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double cos(long double __x) {return cosl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +cos(_A1 __x) {return cos((double)__x);} + +// cosh + +using ::cosh; +using ::coshf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float cosh(float __x) {return coshf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double cosh(long double __x) {return coshl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +cosh(_A1 __x) {return cosh((double)__x);} + +#endif // __sun__ +// exp + +using ::exp; +using ::expf; + +#ifndef __sun__ + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float exp(float __x) {return expf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double exp(long double __x) {return expl(__x);} +#endif + + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +exp(_A1 __x) {return exp((double)__x);} + +// fabs + +using ::fabs; +using ::fabsf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float fabs(float __x) {return fabsf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double fabs(long double __x) {return fabsl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +fabs(_A1 __x) {return fabs((double)__x);} + +// floor + +using ::floor; +using ::floorf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float floor(float __x) {return floorf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double floor(long double __x) {return floorl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +floor(_A1 __x) {return floor((double)__x);} + +// fmod + +#endif //__sun__ +using ::fmod; +using ::fmodf; +#ifndef __sun__ + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float fmod(float __x, float __y) {return fmodf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double fmod(long double __x, long double __y) {return fmodl(__x, __y);} +#endif + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +fmod(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return fmod((__result_type)__x, (__result_type)__y); +} + + +// frexp + +using ::frexp; +using ::frexpf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float frexp(float __x, int* __e) {return frexpf(__x, __e);} +inline _LIBCPP_INLINE_VISIBILITY long double frexp(long double __x, int* __e) {return frexpl(__x, __e);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +frexp(_A1 __x, int* __e) {return frexp((double)__x, __e);} + +// ldexp + +using ::ldexp; +using ::ldexpf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float ldexp(float __x, int __e) {return ldexpf(__x, __e);} +inline _LIBCPP_INLINE_VISIBILITY long double ldexp(long double __x, int __e) {return ldexpl(__x, __e);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +ldexp(_A1 __x, int __e) {return ldexp((double)__x, __e);} + +// log + +#endif // __sun__ +using ::log; +using ::logf; +#ifndef __sun__ + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float log(float __x) {return logf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double log(long double __x) {return logl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +log(_A1 __x) {return log((double)__x);} + + +// log10 + +using ::log10; +using ::log10f; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float log10(float __x) {return log10f(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double log10(long double __x) {return log10l(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +log10(_A1 __x) {return log10((double)__x);} + +// modf + +using ::modf; +using ::modff; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float modf(float __x, float* __y) {return modff(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double modf(long double __x, long double* __y) {return modfl(__x, __y);} +#endif + +// pow + +#endif // __sun__ +using ::pow; +using ::powf; + +#ifndef __sun__ + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float pow(float __x, float __y) {return powf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double pow(long double __x, long double __y) {return powl(__x, __y);} +#endif + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +pow(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return pow((__result_type)__x, (__result_type)__y); +} + + +// sin + +using ::sin; +using ::sinf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float sin(float __x) {return sinf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double sin(long double __x) {return sinl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +sin(_A1 __x) {return sin((double)__x);} + +// sinh + +using ::sinh; +using ::sinhf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float sinh(float __x) {return sinhf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double sinh(long double __x) {return sinhl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +sinh(_A1 __x) {return sinh((double)__x);} + +// sqrt + +#endif // __sun__ +using ::sqrt; +using ::sqrtf; + + +#if !(defined(_MSC_VER) || defined(__sun__)) +inline _LIBCPP_INLINE_VISIBILITY float sqrt(float __x) {return sqrtf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double sqrt(long double __x) {return sqrtl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +sqrt(_A1 __x) {return sqrt((double)__x);} + +// tan + +using ::tan; +using ::tanf; +#ifndef __sun__ + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float tan(float __x) {return tanf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double tan(long double __x) {return tanl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +tan(_A1 __x) {return tan((double)__x);} + +// tanh + +using ::tanh; +using ::tanhf; + +#ifndef _MSC_VER +inline _LIBCPP_INLINE_VISIBILITY float tanh(float __x) {return tanhf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double tanh(long double __x) {return tanhl(__x);} +#endif + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +tanh(_A1 __x) {return tanh((double)__x);} + +// acosh + +#ifndef _MSC_VER +using ::acosh; +using ::acoshf; + +inline _LIBCPP_INLINE_VISIBILITY float acosh(float __x) {return acoshf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double acosh(long double __x) {return acoshl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +acosh(_A1 __x) {return acosh((double)__x);} +#endif + +// asinh + +#ifndef _MSC_VER +using ::asinh; +using ::asinhf; + +inline _LIBCPP_INLINE_VISIBILITY float asinh(float __x) {return asinhf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double asinh(long double __x) {return asinhl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +asinh(_A1 __x) {return asinh((double)__x);} +#endif + +// atanh + +#ifndef _MSC_VER +using ::atanh; +using ::atanhf; + +inline _LIBCPP_INLINE_VISIBILITY float atanh(float __x) {return atanhf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double atanh(long double __x) {return atanhl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +atanh(_A1 __x) {return atanh((double)__x);} +#endif + +// cbrt + +#ifndef _MSC_VER +using ::cbrt; +using ::cbrtf; + +inline _LIBCPP_INLINE_VISIBILITY float cbrt(float __x) {return cbrtf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double cbrt(long double __x) {return cbrtl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +cbrt(_A1 __x) {return cbrt((double)__x);} +#endif + +// copysign + +using ::copysign; +using ::copysignf; + +inline _LIBCPP_INLINE_VISIBILITY float copysign(float __x, float __y) {return copysignf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double copysign(long double __x, long double __y) {return copysignl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +copysign(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return copysign((__result_type)__x, (__result_type)__y); +} + +#ifndef _MSC_VER + +// erf + +using ::erf; +using ::erff; + +inline _LIBCPP_INLINE_VISIBILITY float erf(float __x) {return erff(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double erf(long double __x) {return erfl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +erf(_A1 __x) {return erf((double)__x);} + +// erfc + +using ::erfc; +using ::erfcf; + +inline _LIBCPP_INLINE_VISIBILITY float erfc(float __x) {return erfcf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double erfc(long double __x) {return erfcl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +erfc(_A1 __x) {return erfc((double)__x);} + +// exp2 + +using ::exp2; +using ::exp2f; + +inline _LIBCPP_INLINE_VISIBILITY float exp2(float __x) {return exp2f(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double exp2(long double __x) {return exp2l(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +exp2(_A1 __x) {return exp2((double)__x);} + +// expm1 + +using ::expm1; +using ::expm1f; + +inline _LIBCPP_INLINE_VISIBILITY float expm1(float __x) {return expm1f(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double expm1(long double __x) {return expm1l(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +expm1(_A1 __x) {return expm1((double)__x);} + +// fdim + +using ::fdim; +using ::fdimf; + +inline _LIBCPP_INLINE_VISIBILITY float fdim(float __x, float __y) {return fdimf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double fdim(long double __x, long double __y) {return fdiml(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +fdim(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return fdim((__result_type)__x, (__result_type)__y); +} + +// fma + +inline _LIBCPP_INLINE_VISIBILITY float fmaf(float __x, float __y, float __z) {return (float)((double)__x*__y + __z);} +#define FP_FAST_FMAF + +using ::fma; + +inline _LIBCPP_INLINE_VISIBILITY float fma(float __x, float __y, float __z) {return fmaf(__x, __y, __z);} +inline _LIBCPP_INLINE_VISIBILITY long double fma(long double __x, long double __y, long double __z) {return fmal(__x, __y, __z);} + +template <class _A1, class _A2, class _A3> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value && + is_arithmetic<_A3>::value, + typename __promote<_A1, _A2, _A3>::type +>::type +fma(_A1 __x, _A2 __y, _A3 __z) +{ + typedef typename __promote<_A1, _A2, _A3>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value && + is_same<_A3, __result_type>::value)), ""); + return fma((__result_type)__x, (__result_type)__y, (__result_type)__z); +} + +// fmax + +using ::fmax; +using ::fmaxf; + +inline _LIBCPP_INLINE_VISIBILITY float fmax(float __x, float __y) {return fmaxf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double fmax(long double __x, long double __y) {return fmaxl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +fmax(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return fmax((__result_type)__x, (__result_type)__y); +} + +// fmin + +using ::fmin; +using ::fminf; + +inline _LIBCPP_INLINE_VISIBILITY float fmin(float __x, float __y) {return fminf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double fmin(long double __x, long double __y) {return fminl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +fmin(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return fmin((__result_type)__x, (__result_type)__y); +} + +// hypot + +using ::hypot; +using ::hypotf; + +inline _LIBCPP_INLINE_VISIBILITY float hypot(float __x, float __y) {return hypotf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double hypot(long double __x, long double __y) {return hypotl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +hypot(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return hypot((__result_type)__x, (__result_type)__y); +} + +// ilogb + +using ::ilogb; +using ::ilogbf; + +inline _LIBCPP_INLINE_VISIBILITY int ilogb(float __x) {return ilogbf(__x);} +inline _LIBCPP_INLINE_VISIBILITY int ilogb(long double __x) {return ilogbl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, int>::type +ilogb(_A1 __x) {return ilogb((double)__x);} + +// lgamma + +using ::lgamma; +using ::lgammaf; + +inline _LIBCPP_INLINE_VISIBILITY float lgamma(float __x) {return lgammaf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double lgamma(long double __x) {return lgammal(__x);} + + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +lgamma(_A1 __x) {return lgamma((double)__x);} + + +// llrint + +using ::llrint; +using ::llrintf; + +inline _LIBCPP_INLINE_VISIBILITY long long llrint(float __x) {return llrintf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long long llrint(long double __x) {return llrintl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, long long>::type +llrint(_A1 __x) {return llrint((double)__x);} + +// llround + +using ::llround; +using ::llroundf; + +inline _LIBCPP_INLINE_VISIBILITY long long llround(float __x) {return llroundf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long long llround(long double __x) {return llroundl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, long long>::type +llround(_A1 __x) {return llround((double)__x);} + +// log1p + +using ::log1p; +using ::log1pf; + +inline _LIBCPP_INLINE_VISIBILITY float log1p(float __x) {return log1pf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double log1p(long double __x) {return log1pl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +log1p(_A1 __x) {return log1p((double)__x);} + +// log2 + +using ::log2; +using ::log2f; + +inline _LIBCPP_INLINE_VISIBILITY float log2(float __x) {return log2f(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double log2(long double __x) {return log2l(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +log2(_A1 __x) {return log2((double)__x);} + +// logb + +using ::logb; +using ::logbf; + +inline _LIBCPP_INLINE_VISIBILITY float logb(float __x) {return logbf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double logb(long double __x) {return logbl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +logb(_A1 __x) {return logb((double)__x);} + +// lrint + +using ::lrint; +using ::lrintf; + +inline _LIBCPP_INLINE_VISIBILITY long lrint(float __x) {return lrintf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long lrint(long double __x) {return lrintl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, long>::type +lrint(_A1 __x) {return lrint((double)__x);} + +// lround + +using ::lround; +using ::lroundf; + +inline _LIBCPP_INLINE_VISIBILITY long lround(float __x) {return lroundf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long lround(long double __x) {return lroundl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, long>::type +lround(_A1 __x) {return lround((double)__x);} + +// nan +#endif // _MSC_VER +#endif // __sun__ +using ::nan; +using ::nanf; +#ifndef __sun__ +#ifndef _MSC_VER + +// nearbyint + +using ::nearbyint; +using ::nearbyintf; + +inline _LIBCPP_INLINE_VISIBILITY float nearbyint(float __x) {return nearbyintf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double nearbyint(long double __x) {return nearbyintl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +nearbyint(_A1 __x) {return nearbyint((double)__x);} + +// nextafter + +using ::nextafter; +using ::nextafterf; + +inline _LIBCPP_INLINE_VISIBILITY float nextafter(float __x, float __y) {return nextafterf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double nextafter(long double __x, long double __y) {return nextafterl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +nextafter(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return nextafter((__result_type)__x, (__result_type)__y); +} + +// nexttoward + +using ::nexttoward; +using ::nexttowardf; + +inline _LIBCPP_INLINE_VISIBILITY float nexttoward(float __x, long double __y) {return nexttowardf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double nexttoward(long double __x, long double __y) {return nexttowardl(__x, __y);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +nexttoward(_A1 __x, long double __y) {return nexttoward((double)__x, __y);} + +// remainder + +using ::remainder; +using ::remainderf; + +inline _LIBCPP_INLINE_VISIBILITY float remainder(float __x, float __y) {return remainderf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double remainder(long double __x, long double __y) {return remainderl(__x, __y);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +remainder(_A1 __x, _A2 __y) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return remainder((__result_type)__x, (__result_type)__y); +} + +// remquo + +using ::remquo; +using ::remquof; + +inline _LIBCPP_INLINE_VISIBILITY float remquo(float __x, float __y, int* __z) {return remquof(__x, __y, __z);} +inline _LIBCPP_INLINE_VISIBILITY long double remquo(long double __x, long double __y, int* __z) {return remquol(__x, __y, __z);} + +template <class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_A1>::value && + is_arithmetic<_A2>::value, + typename __promote<_A1, _A2>::type +>::type +remquo(_A1 __x, _A2 __y, int* __z) +{ + typedef typename __promote<_A1, _A2>::type __result_type; + static_assert((!(is_same<_A1, __result_type>::value && + is_same<_A2, __result_type>::value)), ""); + return remquo((__result_type)__x, (__result_type)__y, __z); +} + +// rint + +using ::rint; +using ::rintf; + +inline _LIBCPP_INLINE_VISIBILITY float rint(float __x) {return rintf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double rint(long double __x) {return rintl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +rint(_A1 __x) {return rint((double)__x);} + +// round + +using ::round; +using ::roundf; + +inline _LIBCPP_INLINE_VISIBILITY float round(float __x) {return roundf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double round(long double __x) {return roundl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +round(_A1 __x) {return round((double)__x);} + +// scalbln + +using ::scalbln; +using ::scalblnf; + +inline _LIBCPP_INLINE_VISIBILITY float scalbln(float __x, long __y) {return scalblnf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double scalbln(long double __x, long __y) {return scalblnl(__x, __y);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +scalbln(_A1 __x, long __y) {return scalbln((double)__x, __y);} + +// scalbn + +using ::scalbn; +using ::scalbnf; + +inline _LIBCPP_INLINE_VISIBILITY float scalbn(float __x, int __y) {return scalbnf(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY long double scalbn(long double __x, int __y) {return scalbnl(__x, __y);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +scalbn(_A1 __x, int __y) {return scalbn((double)__x, __y);} + +// tgamma + +using ::tgamma; +using ::tgammaf; + +inline _LIBCPP_INLINE_VISIBILITY float tgamma(float __x) {return tgammaf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double tgamma(long double __x) {return tgammal(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +tgamma(_A1 __x) {return tgamma((double)__x);} + +// trunc + +using ::trunc; +using ::truncf; + +inline _LIBCPP_INLINE_VISIBILITY float trunc(float __x) {return truncf(__x);} +inline _LIBCPP_INLINE_VISIBILITY long double trunc(long double __x) {return truncl(__x);} + +template <class _A1> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if<is_integral<_A1>::value, double>::type +trunc(_A1 __x) {return trunc((double)__x);} + +#endif // !_MSC_VER + +using ::acosl; +using ::asinl; +using ::atanl; +using ::atan2l; +using ::ceill; +using ::cosl; +using ::coshl; +using ::expl; +using ::fabsl; +using ::floorl; +using ::fmodl; +using ::frexpl; +using ::ldexpl; +using ::logl; +using ::log10l; +using ::modfl; +using ::powl; +using ::sinl; +using ::sinhl; +using ::sqrtl; +using ::tanl; +#ifndef _MSC_VER +using ::tanhl; +using ::acoshl; +using ::asinhl; +using ::atanhl; +using ::cbrtl; +#endif // !_MSC_VER +using ::copysignl; +#ifndef _MSC_VER +using ::erfl; +using ::erfcl; +using ::exp2l; +using ::expm1l; +using ::fdiml; +using ::fmal; +using ::fmaxl; +using ::fminl; +using ::hypotl; +using ::ilogbl; +using ::lgammal; +using ::llrintl; +using ::llroundl; +using ::log1pl; +using ::log2l; +using ::logbl; +using ::lrintl; +using ::lroundl; +using ::nanl; +using ::nearbyintl; +using ::nextafterl; +using ::nexttowardl; +using ::remainderl; +using ::remquol; +using ::rintl; +using ::roundl; +using ::scalblnl; +using ::scalbnl; +using ::tgammal; +using ::truncl; +#endif // !_MSC_VER + +#else +using ::lgamma; +using ::lgammaf; +#endif // __sun__ +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CMATH diff --git a/contrib/libc++/include/codecvt b/contrib/libc++/include/codecvt new file mode 100644 index 0000000..6c44e34 --- /dev/null +++ b/contrib/libc++/include/codecvt @@ -0,0 +1,547 @@ +// -*- C++ -*- +//===-------------------------- codecvt -----------------------------------===// +// +// 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_CODECVT +#define _LIBCPP_CODECVT + +/* + codecvt synopsis + +namespace std +{ + +enum codecvt_mode +{ + consume_header = 4, + generate_header = 2, + little_endian = 1 +}; + +template <class Elem, unsigned long Maxcode = 0x10ffff, + codecvt_mode Mode = (codecvt_mode)0> +class codecvt_utf8 + : public codecvt<Elem, char, mbstate_t> +{ + // unspecified +}; + +template <class Elem, unsigned long Maxcode = 0x10ffff, + codecvt_mode Mode = (codecvt_mode)0> +class codecvt_utf16 + : public codecvt<Elem, char, mbstate_t> +{ + // unspecified +}; + +template <class Elem, unsigned long Maxcode = 0x10ffff, + codecvt_mode Mode = (codecvt_mode)0> +class codecvt_utf8_utf16 + : public codecvt<Elem, char, mbstate_t> +{ + // unspecified +}; + +} // std + +*/ + +#include <__config> +#include <__locale> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +enum codecvt_mode +{ + consume_header = 4, + generate_header = 2, + little_endian = 1 +}; + +// codecvt_utf8 + +template <class _Elem> class __codecvt_utf8; + +template <> +class __codecvt_utf8<wchar_t> + : public codecvt<wchar_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef wchar_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf8<char16_t> + : public codecvt<char16_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char16_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf8<char32_t> + : public codecvt<char32_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char32_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <class _Elem, unsigned long _Maxcode = 0x10ffff, + codecvt_mode _Mode = (codecvt_mode)0> +class _LIBCPP_VISIBLE codecvt_utf8 + : public __codecvt_utf8<_Elem> +{ +public: + _LIBCPP_ALWAYS_INLINE + explicit codecvt_utf8(size_t __refs = 0) + : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {} + + _LIBCPP_ALWAYS_INLINE + ~codecvt_utf8() {} +}; + +// codecvt_utf16 + +template <class _Elem, bool _LittleEndian> class __codecvt_utf16; + +template <> +class __codecvt_utf16<wchar_t, false> + : public codecvt<wchar_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef wchar_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf16<wchar_t, true> + : public codecvt<wchar_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef wchar_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf16<char16_t, false> + : public codecvt<char16_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char16_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf16<char16_t, true> + : public codecvt<char16_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char16_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf16<char32_t, false> + : public codecvt<char32_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char32_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf16<char32_t, true> + : public codecvt<char32_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char32_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <class _Elem, unsigned long _Maxcode = 0x10ffff, + codecvt_mode _Mode = (codecvt_mode)0> +class _LIBCPP_VISIBLE codecvt_utf16 + : public __codecvt_utf16<_Elem, _Mode & little_endian> +{ +public: + _LIBCPP_ALWAYS_INLINE + explicit codecvt_utf16(size_t __refs = 0) + : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {} + + _LIBCPP_ALWAYS_INLINE + ~codecvt_utf16() {} +}; + +// codecvt_utf8_utf16 + +template <class _Elem> class __codecvt_utf8_utf16; + +template <> +class __codecvt_utf8_utf16<wchar_t> + : public codecvt<wchar_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef wchar_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf8_utf16<char32_t> + : public codecvt<char32_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char32_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <> +class __codecvt_utf8_utf16<char16_t> + : public codecvt<char16_t, char, mbstate_t> +{ + unsigned long _Maxcode_; + codecvt_mode _Mode_; +public: + typedef char16_t intern_type; + typedef char extern_type; + typedef mbstate_t state_type; + + _LIBCPP_ALWAYS_INLINE + explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode, + codecvt_mode _Mode) + : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode), + _Mode_(_Mode) {} +protected: + virtual result + do_out(state_type& __st, + const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual result + do_in(state_type& __st, + const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt, + intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const; + virtual result + do_unshift(state_type& __st, + extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const; + virtual int do_encoding() const throw(); + virtual bool do_always_noconv() const throw(); + virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, + size_t __mx) const; + virtual int do_max_length() const throw(); +}; + +template <class _Elem, unsigned long _Maxcode = 0x10ffff, + codecvt_mode _Mode = (codecvt_mode)0> +class _LIBCPP_VISIBLE codecvt_utf8_utf16 + : public __codecvt_utf8_utf16<_Elem> +{ +public: + _LIBCPP_ALWAYS_INLINE + explicit codecvt_utf8_utf16(size_t __refs = 0) + : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {} + + _LIBCPP_ALWAYS_INLINE + ~codecvt_utf8_utf16() {} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CODECVT diff --git a/contrib/libc++/include/complex b/contrib/libc++/include/complex new file mode 100644 index 0000000..3b660a3 --- /dev/null +++ b/contrib/libc++/include/complex @@ -0,0 +1,1520 @@ +// -*- C++ -*- +//===--------------------------- complex ----------------------------------===// +// +// 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_COMPLEX +#define _LIBCPP_COMPLEX + +/* + complex synopsis + +namespace std +{ + +template<class T> +class complex +{ +public: + typedef T value_type; + + complex(const T& re = T(), const T& im = T()); + complex(const complex&); + template<class X> complex(const complex<X>&); + + T real() const; + T imag() const; + + void real(T); + void imag(T); + + complex<T>& operator= (const T&); + complex<T>& operator+=(const T&); + complex<T>& operator-=(const T&); + complex<T>& operator*=(const T&); + complex<T>& operator/=(const T&); + + complex& operator=(const complex&); + template<class X> complex<T>& operator= (const complex<X>&); + template<class X> complex<T>& operator+=(const complex<X>&); + template<class X> complex<T>& operator-=(const complex<X>&); + template<class X> complex<T>& operator*=(const complex<X>&); + template<class X> complex<T>& operator/=(const complex<X>&); +}; + +template<> +class complex<float> +{ +public: + typedef float value_type; + + constexpr complex(float re = 0.0f, float im = 0.0f); + explicit constexpr complex(const complex<double>&); + explicit constexpr complex(const complex<long double>&); + + constexpr float real() const; + void real(float); + constexpr float imag() const; + void imag(float); + + complex<float>& operator= (float); + complex<float>& operator+=(float); + complex<float>& operator-=(float); + complex<float>& operator*=(float); + complex<float>& operator/=(float); + + complex<float>& operator=(const complex<float>&); + template<class X> complex<float>& operator= (const complex<X>&); + template<class X> complex<float>& operator+=(const complex<X>&); + template<class X> complex<float>& operator-=(const complex<X>&); + template<class X> complex<float>& operator*=(const complex<X>&); + template<class X> complex<float>& operator/=(const complex<X>&); +}; + +template<> +class complex<double> +{ +public: + typedef double value_type; + + constexpr complex(double re = 0.0, double im = 0.0); + constexpr complex(const complex<float>&); + explicit constexpr complex(const complex<long double>&); + + constexpr double real() const; + void real(double); + constexpr double imag() const; + void imag(double); + + complex<double>& operator= (double); + complex<double>& operator+=(double); + complex<double>& operator-=(double); + complex<double>& operator*=(double); + complex<double>& operator/=(double); + complex<double>& operator=(const complex<double>&); + + template<class X> complex<double>& operator= (const complex<X>&); + template<class X> complex<double>& operator+=(const complex<X>&); + template<class X> complex<double>& operator-=(const complex<X>&); + template<class X> complex<double>& operator*=(const complex<X>&); + template<class X> complex<double>& operator/=(const complex<X>&); +}; + +template<> +class complex<long double> +{ +public: + typedef long double value_type; + + constexpr complex(long double re = 0.0L, long double im = 0.0L); + constexpr complex(const complex<float>&); + constexpr complex(const complex<double>&); + + constexpr long double real() const; + void real(long double); + constexpr long double imag() const; + void imag(long double); + + complex<long double>& operator=(const complex<long double>&); + complex<long double>& operator= (long double); + complex<long double>& operator+=(long double); + complex<long double>& operator-=(long double); + complex<long double>& operator*=(long double); + complex<long double>& operator/=(long double); + + template<class X> complex<long double>& operator= (const complex<X>&); + template<class X> complex<long double>& operator+=(const complex<X>&); + template<class X> complex<long double>& operator-=(const complex<X>&); + template<class X> complex<long double>& operator*=(const complex<X>&); + template<class X> complex<long double>& operator/=(const complex<X>&); +}; + +// 26.3.6 operators: +template<class T> complex<T> operator+(const complex<T>&, const complex<T>&); +template<class T> complex<T> operator+(const complex<T>&, const T&); +template<class T> complex<T> operator+(const T&, const complex<T>&); +template<class T> complex<T> operator-(const complex<T>&, const complex<T>&); +template<class T> complex<T> operator-(const complex<T>&, const T&); +template<class T> complex<T> operator-(const T&, const complex<T>&); +template<class T> complex<T> operator*(const complex<T>&, const complex<T>&); +template<class T> complex<T> operator*(const complex<T>&, const T&); +template<class T> complex<T> operator*(const T&, const complex<T>&); +template<class T> complex<T> operator/(const complex<T>&, const complex<T>&); +template<class T> complex<T> operator/(const complex<T>&, const T&); +template<class T> complex<T> operator/(const T&, const complex<T>&); +template<class T> complex<T> operator+(const complex<T>&); +template<class T> complex<T> operator-(const complex<T>&); +template<class T> bool operator==(const complex<T>&, const complex<T>&); +template<class T> bool operator==(const complex<T>&, const T&); +template<class T> bool operator==(const T&, const complex<T>&); +template<class T> bool operator!=(const complex<T>&, const complex<T>&); +template<class T> bool operator!=(const complex<T>&, const T&); +template<class T> bool operator!=(const T&, const complex<T>&); + +template<class T, class charT, class traits> + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>&, complex<T>&); +template<class T, class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>&, const complex<T>&); + +// 26.3.7 values: + +template<class T> T real(const complex<T>&); + long double real(long double); + double real(double); +template<Integral T> double real(T); + float real(float); + +template<class T> T imag(const complex<T>&); + long double imag(long double); + double imag(double); +template<Integral T> double imag(T); + float imag(float); + +template<class T> T abs(const complex<T>&); + +template<class T> T arg(const complex<T>&); + long double arg(long double); + double arg(double); +template<Integral T> double arg(T); + float arg(float); + +template<class T> T norm(const complex<T>&); + long double norm(long double); + double norm(double); +template<Integral T> double norm(T); + float norm(float); + +template<class T> complex<T> conj(const complex<T>&); + complex<long double> conj(long double); + complex<double> conj(double); +template<Integral T> complex<double> conj(T); + complex<float> conj(float); + +template<class T> complex<T> proj(const complex<T>&); + complex<long double> proj(long double); + complex<double> proj(double); +template<Integral T> complex<double> proj(T); + complex<float> proj(float); + +template<class T> complex<T> polar(const T&, const T& = 0); + +// 26.3.8 transcendentals: +template<class T> complex<T> acos(const complex<T>&); +template<class T> complex<T> asin(const complex<T>&); +template<class T> complex<T> atan(const complex<T>&); +template<class T> complex<T> acosh(const complex<T>&); +template<class T> complex<T> asinh(const complex<T>&); +template<class T> complex<T> atanh(const complex<T>&); +template<class T> complex<T> cos (const complex<T>&); +template<class T> complex<T> cosh (const complex<T>&); +template<class T> complex<T> exp (const complex<T>&); +template<class T> complex<T> log (const complex<T>&); +template<class T> complex<T> log10(const complex<T>&); + +template<class T> complex<T> pow(const complex<T>&, const T&); +template<class T> complex<T> pow(const complex<T>&, const complex<T>&); +template<class T> complex<T> pow(const T&, const complex<T>&); + +template<class T> complex<T> sin (const complex<T>&); +template<class T> complex<T> sinh (const complex<T>&); +template<class T> complex<T> sqrt (const complex<T>&); +template<class T> complex<T> tan (const complex<T>&); +template<class T> complex<T> tanh (const complex<T>&); + +template<class T, class charT, class traits> + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, complex<T>& x); + +template<class T, class charT, class traits> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& o, const complex<T>& x); + +} // std + +*/ + +#include <__config> +#include <type_traits> +#include <stdexcept> +#include <cmath> +#include <sstream> +#if defined(_LIBCPP_NO_EXCEPTIONS) + #include <cassert> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _Tp> class _LIBCPP_VISIBLE complex; + +template<class _Tp> complex<_Tp> operator*(const complex<_Tp>& __z, const complex<_Tp>& __w); +template<class _Tp> complex<_Tp> operator/(const complex<_Tp>& __x, const complex<_Tp>& __y); + +template<class _Tp> +class _LIBCPP_VISIBLE complex +{ +public: + typedef _Tp value_type; +private: + value_type __re_; + value_type __im_; +public: + _LIBCPP_INLINE_VISIBILITY + complex(const value_type& __re = value_type(), const value_type& __im = value_type()) + : __re_(__re), __im_(__im) {} + template<class _Xp> _LIBCPP_INLINE_VISIBILITY + complex(const complex<_Xp>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + + _LIBCPP_INLINE_VISIBILITY value_type real() const {return __re_;} + _LIBCPP_INLINE_VISIBILITY value_type imag() const {return __im_;} + + _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} + _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} + + _LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) + {__re_ = __re; __im_ = value_type(); return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} + + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) + { + __re_ = __c.real(); + __im_ = __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) + { + __re_ += __c.real(); + __im_ += __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) + { + __re_ -= __c.real(); + __im_ -= __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) + { + *this = *this * __c; + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) + { + *this = *this / __c; + return *this; + } +}; + +template<> class _LIBCPP_VISIBLE complex<double>; +template<> class _LIBCPP_VISIBLE complex<long double>; + +template<> +class _LIBCPP_VISIBLE complex<float> +{ + float __re_; + float __im_; +public: + typedef float value_type; + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(float __re = 0.0f, float __im = 0.0f) + : __re_(__re), __im_(__im) {} + explicit /*constexpr*/ complex(const complex<double>& __c); + explicit /*constexpr*/ complex(const complex<long double>& __c); + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY float real() const {return __re_;} + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY float imag() const {return __im_;} + + _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} + _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} + + _LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) + {__re_ = __re; __im_ = value_type(); return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;} + + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) + { + __re_ = __c.real(); + __im_ = __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) + { + __re_ += __c.real(); + __im_ += __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) + { + __re_ -= __c.real(); + __im_ -= __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) + { + *this = *this * __c; + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) + { + *this = *this / __c; + return *this; + } +}; + +template<> +class _LIBCPP_VISIBLE complex<double> +{ + double __re_; + double __im_; +public: + typedef double value_type; + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(double __re = 0.0, double __im = 0.0) + : __re_(__re), __im_(__im) {} + /*constexpr*/ complex(const complex<float>& __c); + explicit /*constexpr*/ complex(const complex<long double>& __c); + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY double real() const {return __re_;} + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY double imag() const {return __im_;} + + _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} + _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} + + _LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) + {__re_ = __re; __im_ = value_type(); return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} + + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) + { + __re_ = __c.real(); + __im_ = __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) + { + __re_ += __c.real(); + __im_ += __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) + { + __re_ -= __c.real(); + __im_ -= __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) + { + *this = *this * __c; + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) + { + *this = *this / __c; + return *this; + } +}; + +template<> +class _LIBCPP_VISIBLE complex<long double> +{ + long double __re_; + long double __im_; +public: + typedef long double value_type; + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY complex(long double __re = 0.0L, long double __im = 0.0L) + : __re_(__re), __im_(__im) {} + /*constexpr*/ complex(const complex<float>& __c); + /*constexpr*/ complex(const complex<double>& __c); + + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY long double real() const {return __re_;} + /*constexpr*/ _LIBCPP_INLINE_VISIBILITY long double imag() const {return __im_;} + + _LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} + _LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} + + _LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) + {__re_ = __re; __im_ = value_type(); return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;} + _LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;} + + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) + { + __re_ = __c.real(); + __im_ = __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) + { + __re_ += __c.real(); + __im_ += __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) + { + __re_ -= __c.real(); + __im_ -= __c.imag(); + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) + { + *this = *this * __c; + return *this; + } + template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) + { + *this = *this / __c; + return *this; + } +}; + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<float>::complex(const complex<double>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<float>::complex(const complex<long double>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<double>::complex(const complex<float>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<double>::complex(const complex<long double>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<long double>::complex(const complex<float>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +//constexpr +inline _LIBCPP_INLINE_VISIBILITY +complex<long double>::complex(const complex<double>& __c) + : __re_(__c.real()), __im_(__c.imag()) {} + +// 26.3.6 operators: + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator+(const complex<_Tp>& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(__x); + __t += __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator+(const complex<_Tp>& __x, const _Tp& __y) +{ + complex<_Tp> __t(__x); + __t += __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator+(const _Tp& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(__y); + __t += __x; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator-(const complex<_Tp>& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(__x); + __t -= __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator-(const complex<_Tp>& __x, const _Tp& __y) +{ + complex<_Tp> __t(__x); + __t -= __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator-(const _Tp& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(-__y); + __t += __x; + return __t; +} + +template<class _Tp> +complex<_Tp> +operator*(const complex<_Tp>& __z, const complex<_Tp>& __w) +{ + _Tp __a = __z.real(); + _Tp __b = __z.imag(); + _Tp __c = __w.real(); + _Tp __d = __w.imag(); + _Tp __ac = __a * __c; + _Tp __bd = __b * __d; + _Tp __ad = __a * __d; + _Tp __bc = __b * __c; + _Tp __x = __ac - __bd; + _Tp __y = __ad + __bc; + if (isnan(__x) && isnan(__y)) + { + bool __recalc = false; + if (isinf(__a) || isinf(__b)) + { + __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a); + __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b); + if (isnan(__c)) + __c = copysign(_Tp(0), __c); + if (isnan(__d)) + __d = copysign(_Tp(0), __d); + __recalc = true; + } + if (isinf(__c) || isinf(__d)) + { + __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c); + __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d); + if (isnan(__a)) + __a = copysign(_Tp(0), __a); + if (isnan(__b)) + __b = copysign(_Tp(0), __b); + __recalc = true; + } + if (!__recalc && (isinf(__ac) || isinf(__bd) || + isinf(__ad) || isinf(__bc))) + { + if (isnan(__a)) + __a = copysign(_Tp(0), __a); + if (isnan(__b)) + __b = copysign(_Tp(0), __b); + if (isnan(__c)) + __c = copysign(_Tp(0), __c); + if (isnan(__d)) + __d = copysign(_Tp(0), __d); + __recalc = true; + } + if (__recalc) + { + __x = _Tp(INFINITY) * (__a * __c - __b * __d); + __y = _Tp(INFINITY) * (__a * __d + __b * __c); + } + } + return complex<_Tp>(__x, __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator*(const complex<_Tp>& __x, const _Tp& __y) +{ + complex<_Tp> __t(__x); + __t *= __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator*(const _Tp& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(__y); + __t *= __x; + return __t; +} + +template<class _Tp> +complex<_Tp> +operator/(const complex<_Tp>& __z, const complex<_Tp>& __w) +{ + int __ilogbw = 0; + _Tp __a = __z.real(); + _Tp __b = __z.imag(); + _Tp __c = __w.real(); + _Tp __d = __w.imag(); + _Tp __logbw = logb(fmax(fabs(__c), fabs(__d))); + if (isfinite(__logbw)) + { + __ilogbw = static_cast<int>(__logbw); + __c = scalbn(__c, -__ilogbw); + __d = scalbn(__d, -__ilogbw); + } + _Tp __denom = __c * __c + __d * __d; + _Tp __x = scalbn((__a * __c + __b * __d) / __denom, -__ilogbw); + _Tp __y = scalbn((__b * __c - __a * __d) / __denom, -__ilogbw); + if (isnan(__x) && isnan(__y)) + { + if ((__denom == _Tp(0)) && (!isnan(__a) || !isnan(__b))) + { + __x = copysign(_Tp(INFINITY), __c) * __a; + __y = copysign(_Tp(INFINITY), __c) * __b; + } + else if ((isinf(__a) || isinf(__b)) && isfinite(__c) && isfinite(__d)) + { + __a = copysign(isinf(__a) ? _Tp(1) : _Tp(0), __a); + __b = copysign(isinf(__b) ? _Tp(1) : _Tp(0), __b); + __x = _Tp(INFINITY) * (__a * __c + __b * __d); + __y = _Tp(INFINITY) * (__b * __c - __a * __d); + } + else if (isinf(__logbw) && __logbw > _Tp(0) && isfinite(__a) && isfinite(__b)) + { + __c = copysign(isinf(__c) ? _Tp(1) : _Tp(0), __c); + __d = copysign(isinf(__d) ? _Tp(1) : _Tp(0), __d); + __x = _Tp(0) * (__a * __c + __b * __d); + __y = _Tp(0) * (__b * __c - __a * __d); + } + } + return complex<_Tp>(__x, __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator/(const complex<_Tp>& __x, const _Tp& __y) +{ + return complex<_Tp>(__x.real() / __y, __x.imag() / __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator/(const _Tp& __x, const complex<_Tp>& __y) +{ + complex<_Tp> __t(__x); + __t /= __y; + return __t; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator+(const complex<_Tp>& __x) +{ + return __x; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +operator-(const complex<_Tp>& __x) +{ + return complex<_Tp>(-__x.real(), -__x.imag()); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const complex<_Tp>& __x, const complex<_Tp>& __y) +{ + return __x.real() == __y.real() && __x.imag() == __y.imag(); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const complex<_Tp>& __x, const _Tp& __y) +{ + return __x.real() == __y && __x.imag() == 0; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const _Tp& __x, const complex<_Tp>& __y) +{ + return __x == __y.real() && 0 == __y.imag(); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) +{ + return !(__x == __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const complex<_Tp>& __x, const _Tp& __y) +{ + return !(__x == __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const _Tp& __x, const complex<_Tp>& __y) +{ + return !(__x == __y); +} + +// 26.3.7 values: + +// real + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +real(const complex<_Tp>& __c) +{ + return __c.real(); +} + +inline _LIBCPP_INLINE_VISIBILITY +long double +real(long double __re) +{ + return __re; +} + +inline _LIBCPP_INLINE_VISIBILITY +double +real(double __re) +{ + return __re; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + double +>::type +real(_Tp __re) +{ + return __re; +} + +inline _LIBCPP_INLINE_VISIBILITY +float +real(float __re) +{ + return __re; +} + +// imag + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +imag(const complex<_Tp>& __c) +{ + return __c.imag(); +} + +inline _LIBCPP_INLINE_VISIBILITY +long double +imag(long double __re) +{ + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +double +imag(double __re) +{ + return 0; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + double +>::type +imag(_Tp __re) +{ + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +float +imag(float __re) +{ + return 0; +} + +// abs + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +abs(const complex<_Tp>& __c) +{ + return hypot(__c.real(), __c.imag()); +} + +// arg + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +arg(const complex<_Tp>& __c) +{ + return atan2(__c.imag(), __c.real()); +} + +inline _LIBCPP_INLINE_VISIBILITY +long double +arg(long double __re) +{ + return atan2l(0.L, __re); +} + +inline _LIBCPP_INLINE_VISIBILITY +double +arg(double __re) +{ + return atan2(0., __re); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + double +>::type +arg(_Tp __re) +{ + return atan2(0., __re); +} + +inline _LIBCPP_INLINE_VISIBILITY +float +arg(float __re) +{ + return atan2f(0.F, __re); +} + +// norm + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +norm(const complex<_Tp>& __c) +{ + if (isinf(__c.real())) + return abs(__c.real()); + if (isinf(__c.imag())) + return abs(__c.imag()); + return __c.real() * __c.real() + __c.imag() * __c.imag(); +} + +inline _LIBCPP_INLINE_VISIBILITY +long double +norm(long double __re) +{ + return __re * __re; +} + +inline _LIBCPP_INLINE_VISIBILITY +double +norm(double __re) +{ + return __re * __re; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + double +>::type +norm(_Tp __re) +{ + return (double)__re * __re; +} + +inline _LIBCPP_INLINE_VISIBILITY +float +norm(float __re) +{ + return __re * __re; +} + +// conj + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +conj(const complex<_Tp>& __c) +{ + return complex<_Tp>(__c.real(), -__c.imag()); +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<long double> +conj(long double __re) +{ + return complex<long double>(__re); +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<double> +conj(double __re) +{ + return complex<double>(__re); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + complex<double> +>::type +conj(_Tp __re) +{ + return complex<double>(__re); +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<float> +conj(float __re) +{ + return complex<float>(__re); +} + +// proj + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +proj(const complex<_Tp>& __c) +{ + std::complex<_Tp> __r = __c; + if (isinf(__c.real()) || isinf(__c.imag())) + __r = complex<_Tp>(INFINITY, copysign(_Tp(0), __c.imag())); + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<long double> +proj(long double __re) +{ + if (isinf(__re)) + __re = abs(__re); + return complex<long double>(__re); +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<double> +proj(double __re) +{ + if (isinf(__re)) + __re = abs(__re); + return complex<double>(__re); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_integral<_Tp>::value, + complex<double> +>::type +proj(_Tp __re) +{ + return complex<double>(__re); +} + +inline _LIBCPP_INLINE_VISIBILITY +complex<float> +proj(float __re) +{ + if (isinf(__re)) + __re = abs(__re); + return complex<float>(__re); +} + +// polar + +template<class _Tp> +complex<_Tp> +polar(const _Tp& __rho, const _Tp& __theta = _Tp(0)) +{ + if (isnan(__rho) || signbit(__rho)) + return complex<_Tp>(_Tp(NAN), _Tp(NAN)); + if (isnan(__theta)) + { + if (isinf(__rho)) + return complex<_Tp>(__rho, __theta); + return complex<_Tp>(__theta, __theta); + } + if (isinf(__theta)) + { + if (isinf(__rho)) + return complex<_Tp>(__rho, _Tp(NAN)); + return complex<_Tp>(_Tp(NAN), _Tp(NAN)); + } + _Tp __x = __rho * cos(__theta); + if (isnan(__x)) + __x = 0; + _Tp __y = __rho * sin(__theta); + if (isnan(__y)) + __y = 0; + return complex<_Tp>(__x, __y); +} + +// log + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +log(const complex<_Tp>& __x) +{ + return complex<_Tp>(log(abs(__x)), arg(__x)); +} + +// log10 + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +log10(const complex<_Tp>& __x) +{ + return log(__x) / log(_Tp(10)); +} + +// sqrt + +template<class _Tp> +complex<_Tp> +sqrt(const complex<_Tp>& __x) +{ + if (isinf(__x.imag())) + return complex<_Tp>(_Tp(INFINITY), __x.imag()); + if (isinf(__x.real())) + { + if (__x.real() > _Tp(0)) + return complex<_Tp>(__x.real(), isnan(__x.imag()) ? __x.imag() : copysign(_Tp(0), __x.imag())); + return complex<_Tp>(isnan(__x.imag()) ? __x.imag() : _Tp(0), copysign(__x.real(), __x.imag())); + } + return polar(sqrt(abs(__x)), arg(__x) / _Tp(2)); +} + +// exp + +template<class _Tp> +complex<_Tp> +exp(const complex<_Tp>& __x) +{ + _Tp __i = __x.imag(); + if (isinf(__x.real())) + { + if (__x.real() < _Tp(0)) + { + if (!isfinite(__i)) + __i = _Tp(1); + } + else if (__i == 0 || !isfinite(__i)) + { + if (isinf(__i)) + __i = _Tp(NAN); + return complex<_Tp>(__x.real(), __i); + } + } + else if (isnan(__x.real()) && __x.imag() == 0) + return __x; + _Tp __e = exp(__x.real()); + return complex<_Tp>(__e * cos(__i), __e * sin(__i)); +} + +// pow + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +pow(const complex<_Tp>& __x, const complex<_Tp>& __y) +{ + return exp(__y * log(__x)); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +complex<typename __promote<_Tp, _Up>::type> +pow(const complex<_Tp>& __x, const complex<_Up>& __y) +{ + typedef complex<typename __promote<_Tp, _Up>::type> result_type; + return _VSTD::pow(result_type(__x), result_type(__y)); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_Up>::value, + complex<typename __promote<_Tp, _Up>::type> +>::type +pow(const complex<_Tp>& __x, const _Up& __y) +{ + typedef complex<typename __promote<_Tp, _Up>::type> result_type; + return _VSTD::pow(result_type(__x), result_type(__y)); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_arithmetic<_Tp>::value, + complex<typename __promote<_Tp, _Up>::type> +>::type +pow(const _Tp& __x, const complex<_Up>& __y) +{ + typedef complex<typename __promote<_Tp, _Up>::type> result_type; + return _VSTD::pow(result_type(__x), result_type(__y)); +} + +// asinh + +template<class _Tp> +complex<_Tp> +asinh(const complex<_Tp>& __x) +{ + const _Tp __pi(atan2(+0., -0.)); + if (isinf(__x.real())) + { + if (isnan(__x.imag())) + return __x; + if (isinf(__x.imag())) + return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); + return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); + } + if (isnan(__x.real())) + { + if (isinf(__x.imag())) + return complex<_Tp>(__x.imag(), __x.real()); + if (__x.imag() == 0) + return __x; + return complex<_Tp>(__x.real(), __x.real()); + } + if (isinf(__x.imag())) + return complex<_Tp>(copysign(__x.imag(), __x.real()), copysign(__pi/_Tp(2), __x.imag())); + complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) + _Tp(1))); + return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); +} + +// acosh + +template<class _Tp> +complex<_Tp> +acosh(const complex<_Tp>& __x) +{ + const _Tp __pi(atan2(+0., -0.)); + if (isinf(__x.real())) + { + if (isnan(__x.imag())) + return complex<_Tp>(abs(__x.real()), __x.imag()); + if (isinf(__x.imag())) + if (__x.real() > 0) + return complex<_Tp>(__x.real(), copysign(__pi * _Tp(0.25), __x.imag())); + else + return complex<_Tp>(-__x.real(), copysign(__pi * _Tp(0.75), __x.imag())); + if (__x.real() < 0) + return complex<_Tp>(-__x.real(), copysign(__pi, __x.imag())); + return complex<_Tp>(__x.real(), copysign(_Tp(0), __x.imag())); + } + if (isnan(__x.real())) + { + if (isinf(__x.imag())) + return complex<_Tp>(abs(__x.imag()), __x.real()); + return complex<_Tp>(__x.real(), __x.real()); + } + if (isinf(__x.imag())) + return complex<_Tp>(abs(__x.imag()), copysign(__pi/_Tp(2), __x.imag())); + complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1))); + return complex<_Tp>(copysign(__z.real(), _Tp(0)), copysign(__z.imag(), __x.imag())); +} + +// atanh + +template<class _Tp> +complex<_Tp> +atanh(const complex<_Tp>& __x) +{ + const _Tp __pi(atan2(+0., -0.)); + if (isinf(__x.imag())) + { + return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); + } + if (isnan(__x.imag())) + { + if (isinf(__x.real()) || __x.real() == 0) + return complex<_Tp>(copysign(_Tp(0), __x.real()), __x.imag()); + return complex<_Tp>(__x.imag(), __x.imag()); + } + if (isnan(__x.real())) + { + return complex<_Tp>(__x.real(), __x.real()); + } + if (isinf(__x.real())) + { + return complex<_Tp>(copysign(_Tp(0), __x.real()), copysign(__pi/_Tp(2), __x.imag())); + } + if (abs(__x.real()) == _Tp(1) && __x.imag() == _Tp(0)) + { + return complex<_Tp>(copysign(_Tp(INFINITY), __x.real()), copysign(_Tp(0), __x.imag())); + } + complex<_Tp> __z = log((_Tp(1) + __x) / (_Tp(1) - __x)) / _Tp(2); + return complex<_Tp>(copysign(__z.real(), __x.real()), copysign(__z.imag(), __x.imag())); +} + +// sinh + +template<class _Tp> +complex<_Tp> +sinh(const complex<_Tp>& __x) +{ + if (isinf(__x.real()) && !isfinite(__x.imag())) + return complex<_Tp>(__x.real(), _Tp(NAN)); + if (__x.real() == 0 && !isfinite(__x.imag())) + return complex<_Tp>(__x.real(), _Tp(NAN)); + if (__x.imag() == 0 && !isfinite(__x.real())) + return __x; + return complex<_Tp>(sinh(__x.real()) * cos(__x.imag()), cosh(__x.real()) * sin(__x.imag())); +} + +// cosh + +template<class _Tp> +complex<_Tp> +cosh(const complex<_Tp>& __x) +{ + if (isinf(__x.real()) && !isfinite(__x.imag())) + return complex<_Tp>(abs(__x.real()), _Tp(NAN)); + if (__x.real() == 0 && !isfinite(__x.imag())) + return complex<_Tp>(_Tp(NAN), __x.real()); + if (__x.real() == 0 && __x.imag() == 0) + return complex<_Tp>(_Tp(1), __x.imag()); + if (__x.imag() == 0 && !isfinite(__x.real())) + return complex<_Tp>(abs(__x.real()), __x.imag()); + return complex<_Tp>(cosh(__x.real()) * cos(__x.imag()), sinh(__x.real()) * sin(__x.imag())); +} + +// tanh + +template<class _Tp> +complex<_Tp> +tanh(const complex<_Tp>& __x) +{ + if (isinf(__x.real())) + { + if (!isfinite(__x.imag())) + return complex<_Tp>(_Tp(1), _Tp(0)); + return complex<_Tp>(_Tp(1), copysign(_Tp(0), sin(_Tp(2) * __x.imag()))); + } + if (isnan(__x.real()) && __x.imag() == 0) + return __x; + _Tp __2r(_Tp(2) * __x.real()); + _Tp __2i(_Tp(2) * __x.imag()); + _Tp __d(cosh(__2r) + cos(__2i)); + return complex<_Tp>(sinh(__2r)/__d, sin(__2i)/__d); +} + +// asin + +template<class _Tp> +complex<_Tp> +asin(const complex<_Tp>& __x) +{ + complex<_Tp> __z = asinh(complex<_Tp>(-__x.imag(), __x.real())); + return complex<_Tp>(__z.imag(), -__z.real()); +} + +// acos + +template<class _Tp> +complex<_Tp> +acos(const complex<_Tp>& __x) +{ + const _Tp __pi(atan2(+0., -0.)); + if (isinf(__x.real())) + { + if (isnan(__x.imag())) + return complex<_Tp>(__x.imag(), __x.real()); + if (isinf(__x.imag())) + { + if (__x.real() < _Tp(0)) + return complex<_Tp>(_Tp(0.75) * __pi, -__x.imag()); + return complex<_Tp>(_Tp(0.25) * __pi, -__x.imag()); + } + if (__x.real() < _Tp(0)) + return complex<_Tp>(__pi, signbit(__x.imag()) ? -__x.real() : __x.real()); + return complex<_Tp>(_Tp(0), signbit(__x.imag()) ? __x.real() : -__x.real()); + } + if (isnan(__x.real())) + { + if (isinf(__x.imag())) + return complex<_Tp>(__x.real(), -__x.imag()); + return complex<_Tp>(__x.real(), __x.real()); + } + if (isinf(__x.imag())) + return complex<_Tp>(__pi/_Tp(2), -__x.imag()); + if (__x.real() == 0) + return complex<_Tp>(__pi/_Tp(2), -__x.imag()); + complex<_Tp> __z = log(__x + sqrt(pow(__x, _Tp(2)) - _Tp(1))); + if (signbit(__x.imag())) + return complex<_Tp>(abs(__z.imag()), abs(__z.real())); + return complex<_Tp>(abs(__z.imag()), -abs(__z.real())); +} + +// atan + +template<class _Tp> +complex<_Tp> +atan(const complex<_Tp>& __x) +{ + complex<_Tp> __z = atanh(complex<_Tp>(-__x.imag(), __x.real())); + return complex<_Tp>(__z.imag(), -__z.real()); +} + +// sin + +template<class _Tp> +complex<_Tp> +sin(const complex<_Tp>& __x) +{ + complex<_Tp> __z = sinh(complex<_Tp>(-__x.imag(), __x.real())); + return complex<_Tp>(__z.imag(), -__z.real()); +} + +// cos + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +complex<_Tp> +cos(const complex<_Tp>& __x) +{ + return cosh(complex<_Tp>(-__x.imag(), __x.real())); +} + +// tan + +template<class _Tp> +complex<_Tp> +tan(const complex<_Tp>& __x) +{ + complex<_Tp> __z = tanh(complex<_Tp>(-__x.imag(), __x.real())); + return complex<_Tp>(__z.imag(), -__z.real()); +} + +template<class _Tp, class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x) +{ + if (__is.good()) + { + ws(__is); + if (__is.peek() == _CharT('(')) + { + __is.get(); + _Tp __r; + __is >> __r; + if (!__is.fail()) + { + ws(__is); + _CharT __c = __is.peek(); + if (__c == _CharT(',')) + { + __is.get(); + _Tp __i; + __is >> __i; + if (!__is.fail()) + { + ws(__is); + __c = __is.peek(); + if (__c == _CharT(')')) + { + __is.get(); + __x = complex<_Tp>(__r, __i); + } + else + __is.setstate(ios_base::failbit); + } + else + __is.setstate(ios_base::failbit); + } + else if (__c == _CharT(')')) + { + __is.get(); + __x = complex<_Tp>(__r, _Tp(0)); + } + else + __is.setstate(ios_base::failbit); + } + else + __is.setstate(ios_base::failbit); + } + else + { + _Tp __r; + __is >> __r; + if (!__is.fail()) + __x = complex<_Tp>(__r, _Tp(0)); + else + __is.setstate(ios_base::failbit); + } + } + else + __is.setstate(ios_base::failbit); + return __is; +} + +template<class _Tp, class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) +{ + basic_ostringstream<_CharT, _Traits> __s; + __s.flags(__os.flags()); + __s.imbue(__os.getloc()); + __s.precision(__os.precision()); + __s << '(' << __x.real() << ',' << __x.imag() << ')'; + return __os << __s.str(); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_COMPLEX diff --git a/contrib/libc++/include/complex.h b/contrib/libc++/include/complex.h new file mode 100644 index 0000000..7003d31 --- /dev/null +++ b/contrib/libc++/include/complex.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===--------------------------- complex.h --------------------------------===// +// +// 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_COMPLEX_H +#define _LIBCPP_COMPLEX_H + +/* + complex.h synopsis + +#include <ccomplex> + +*/ + +#ifdef __cplusplus + +#include <ccomplex> + +#else // __cplusplus + +#include_next <complex.h> + +#endif // __cplusplus + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#endif // _LIBCPP_COMPLEX_H diff --git a/contrib/libc++/include/condition_variable b/contrib/libc++/include/condition_variable new file mode 100644 index 0000000..b4da556 --- /dev/null +++ b/contrib/libc++/include/condition_variable @@ -0,0 +1,256 @@ +// -*- C++ -*- +//===---------------------- condition_variable ----------------------------===// +// +// 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_CONDITION_VARIABLE +#define _LIBCPP_CONDITION_VARIABLE + +/* + condition_variable synopsis + +namespace std +{ + +enum class cv_status { no_timeout, timeout }; + +class condition_variable +{ +public: + condition_variable(); + ~condition_variable(); + + condition_variable(const condition_variable&) = delete; + condition_variable& operator=(const condition_variable&) = delete; + + void notify_one(); + void notify_all(); + + void wait(unique_lock<mutex>& lock); + template <class Predicate> + void wait(unique_lock<mutex>& lock, Predicate pred); + + template <class Clock, class Duration> + cv_status + wait_until(unique_lock<mutex>& lock, + const chrono::time_point<Clock, Duration>& abs_time); + + template <class Clock, class Duration, class Predicate> + bool + wait_until(unique_lock<mutex>& lock, + const chrono::time_point<Clock, Duration>& abs_time, + Predicate pred); + + template <class Rep, class Period> + cv_status + wait_for(unique_lock<mutex>& lock, + const chrono::duration<Rep, Period>& rel_time); + + template <class Rep, class Period, class Predicate> + bool + wait_for(unique_lock<mutex>& lock, + const chrono::duration<Rep, Period>& rel_time, + Predicate pred); + + typedef pthread_cond_t* native_handle_type; + native_handle_type native_handle(); +}; + +void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk); + +class condition_variable_any +{ +public: + condition_variable_any(); + ~condition_variable_any(); + + condition_variable_any(const condition_variable_any&) = delete; + condition_variable_any& operator=(const condition_variable_any&) = delete; + + void notify_one(); + void notify_all(); + + template <class Lock> + void wait(Lock& lock); + template <class Lock, class Predicate> + void wait(Lock& lock, Predicate pred); + + template <class Lock, class Clock, class Duration> + cv_status + wait_until(Lock& lock, + const chrono::time_point<Clock, Duration>& abs_time); + + template <class Lock, class Clock, class Duration, class Predicate> + bool + wait_until(Lock& lock, + const chrono::time_point<Clock, Duration>& abs_time, + Predicate pred); + + template <class Lock, class Rep, class Period> + cv_status + wait_for(Lock& lock, + const chrono::duration<Rep, Period>& rel_time); + + template <class Lock, class Rep, class Period, class Predicate> + bool + wait_for(Lock& lock, + const chrono::duration<Rep, Period>& rel_time, + Predicate pred); +}; + +} // std + +*/ + +#include <__config> +#include <__mutex_base> +#include <memory> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_VISIBLE condition_variable_any +{ + condition_variable __cv_; + shared_ptr<mutex> __mut_; +public: + condition_variable_any(); + + void notify_one(); + void notify_all(); + + template <class _Lock> + void wait(_Lock& __lock); + template <class _Lock, class _Predicate> + void wait(_Lock& __lock, _Predicate __pred); + + template <class _Lock, class _Clock, class _Duration> + cv_status + wait_until(_Lock& __lock, + const chrono::time_point<_Clock, _Duration>& __t); + + template <class _Lock, class _Clock, class _Duration, class _Predicate> + bool + wait_until(_Lock& __lock, + const chrono::time_point<_Clock, _Duration>& __t, + _Predicate __pred); + + template <class _Lock, class _Rep, class _Period> + cv_status + wait_for(_Lock& __lock, + const chrono::duration<_Rep, _Period>& __d); + + template <class _Lock, class _Rep, class _Period, class _Predicate> + bool + wait_for(_Lock& __lock, + const chrono::duration<_Rep, _Period>& __d, + _Predicate __pred); +}; + +inline _LIBCPP_INLINE_VISIBILITY +condition_variable_any::condition_variable_any() + : __mut_(make_shared<mutex>()) {} + +inline _LIBCPP_INLINE_VISIBILITY +void +condition_variable_any::notify_one() +{ + {lock_guard<mutex> _(*__mut_);} + __cv_.notify_one(); +} + +inline _LIBCPP_INLINE_VISIBILITY +void +condition_variable_any::notify_all() +{ + {lock_guard<mutex> _(*__mut_);} + __cv_.notify_all(); +} + +struct __lock_external +{ + template <class _Lock> + void operator()(_Lock* __m) {__m->lock();} +}; + +template <class _Lock> +void +condition_variable_any::wait(_Lock& __lock) +{ + shared_ptr<mutex> __mut = __mut_; + unique_lock<mutex> __lk(*__mut); + __lock.unlock(); + unique_ptr<_Lock, __lock_external> __(&__lock); + lock_guard<unique_lock<mutex> > _(__lk, adopt_lock); + __cv_.wait(__lk); +} // __mut_.unlock(), __lock.lock() + +template <class _Lock, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +void +condition_variable_any::wait(_Lock& __lock, _Predicate __pred) +{ + while (!__pred()) + wait(__lock); +} + +template <class _Lock, class _Clock, class _Duration> +cv_status +condition_variable_any::wait_until(_Lock& __lock, + const chrono::time_point<_Clock, _Duration>& __t) +{ + shared_ptr<mutex> __mut = __mut_; + unique_lock<mutex> __lk(*__mut); + __lock.unlock(); + unique_ptr<_Lock, __lock_external> __(&__lock); + lock_guard<unique_lock<mutex> > _(__lk, adopt_lock); + return __cv_.wait_until(__lk, __t); +} // __mut_.unlock(), __lock.lock() + +template <class _Lock, class _Clock, class _Duration, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +condition_variable_any::wait_until(_Lock& __lock, + const chrono::time_point<_Clock, _Duration>& __t, + _Predicate __pred) +{ + while (!__pred()) + if (wait_until(__lock, __t) == cv_status::timeout) + return __pred(); + return true; +} + +template <class _Lock, class _Rep, class _Period> +inline _LIBCPP_INLINE_VISIBILITY +cv_status +condition_variable_any::wait_for(_Lock& __lock, + const chrono::duration<_Rep, _Period>& __d) +{ + return wait_until(__lock, chrono::steady_clock::now() + __d); +} + +template <class _Lock, class _Rep, class _Period, class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +bool +condition_variable_any::wait_for(_Lock& __lock, + const chrono::duration<_Rep, _Period>& __d, + _Predicate __pred) +{ + return wait_until(__lock, chrono::steady_clock::now() + __d, + _VSTD::move(__pred)); +} + +_LIBCPP_VISIBLE +void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CONDITION_VARIABLE diff --git a/contrib/libc++/include/csetjmp b/contrib/libc++/include/csetjmp new file mode 100644 index 0000000..d0b2c07 --- /dev/null +++ b/contrib/libc++/include/csetjmp @@ -0,0 +1,52 @@ +// -*- C++ -*- +//===--------------------------- csetjmp ----------------------------------===// +// +// 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_CSETJMP +#define _LIBCPP_CSETJMP + +/* + csetjmp synopsis + +Macros: + + setjmp + +namespace std +{ + +Types: + + jmp_buf + +void longjmp(jmp_buf env, int val); + +} // std + +*/ + +#include <__config> +#include <setjmp.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifndef setjmp +#define setjmp(env) setjmp(env) +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::jmp_buf; +using ::longjmp; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSETJMP diff --git a/contrib/libc++/include/csignal b/contrib/libc++/include/csignal new file mode 100644 index 0000000..9728266 --- /dev/null +++ b/contrib/libc++/include/csignal @@ -0,0 +1,58 @@ +// -*- C++ -*- +//===--------------------------- csignal ----------------------------------===// +// +// 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_CSIGNAL +#define _LIBCPP_CSIGNAL + +/* + csignal synopsis + +Macros: + + SIG_DFL + SIG_ERR + SIG_IGN + SIGABRT + SIGFPE + SIGILL + SIGINT + SIGSEGV + SIGTERM + +namespace std +{ + +Types: + + sig_atomic_t + +void (*signal(int sig, void (*func)(int)))(int); +int raise(int sig); + +} // std + +*/ + +#include <__config> +#include <signal.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::sig_atomic_t; +using ::signal; +using ::raise; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSIGNAL diff --git a/contrib/libc++/include/cstdarg b/contrib/libc++/include/cstdarg new file mode 100644 index 0000000..c8b6999 --- /dev/null +++ b/contrib/libc++/include/cstdarg @@ -0,0 +1,48 @@ +// -*- C++ -*- +//===--------------------------- cstdarg ----------------------------------===// +// +// 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_CSTDARG +#define _LIBCPP_CSTDARG + +/* + cstdarg synopsis + +Macros: + + type va_arg(va_list ap, type); + void va_copy(va_list dest, va_list src); // C99 + void va_end(va_list ap); + void va_start(va_list ap, parmN); + +namespace std +{ + +Types: + + va_list + +} // std + +*/ + +#include <__config> +#include <stdarg.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::va_list; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSTDARG diff --git a/contrib/libc++/include/cstdbool b/contrib/libc++/include/cstdbool new file mode 100644 index 0000000..2c764a6 --- /dev/null +++ b/contrib/libc++/include/cstdbool @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===--------------------------- cstdbool ---------------------------------===// +// +// 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_CSTDBOOL +#define _LIBCPP_CSTDBOOL + +/* + cstdbool synopsis + +Macros: + + __bool_true_false_are_defined + +*/ + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#undef __bool_true_false_are_defined +#define __bool_true_false_are_defined 1 + +#endif // _LIBCPP_CSTDBOOL diff --git a/contrib/libc++/include/cstddef b/contrib/libc++/include/cstddef new file mode 100644 index 0000000..4a6b16e --- /dev/null +++ b/contrib/libc++/include/cstddef @@ -0,0 +1,103 @@ +// -*- C++ -*- +//===--------------------------- cstddef ----------------------------------===// +// +// 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_CSTDDEF +#define _LIBCPP_CSTDDEF + +/* + cstddef synopsis + +Macros: + + offsetof(type,member-designator) + NULL + +namespace std +{ + +Types: + + ptrdiff_t + size_t + max_align_t + nullptr_t + +} // std + +*/ + +#include <__config> + +#ifdef __GLIBC__ +#define __need_NULL +#define __need_ptrdiff_t +#define __need_size_t +#endif // __GLIBC__ + +#include <stddef.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::ptrdiff_t; +using ::size_t; + +typedef long double max_align_t; + +#ifdef _LIBCPP_HAS_NO_NULLPTR + +struct _LIBCPP_VISIBLE nullptr_t +{ + void* _; + + struct __nat {int __for_bool_;}; + + _LIBCPP_ALWAYS_INLINE nullptr_t() {} + _LIBCPP_ALWAYS_INLINE nullptr_t(int __nat::*) {} + + _LIBCPP_ALWAYS_INLINE operator int __nat::*() const {return 0;} + + template <class _Tp> + _LIBCPP_ALWAYS_INLINE + operator _Tp* () const {return 0;} + + template <class _Tp, class _Up> + _LIBCPP_ALWAYS_INLINE + operator _Tp _Up::* () const {return 0;} + + friend _LIBCPP_ALWAYS_INLINE bool operator==(nullptr_t, nullptr_t) {return true;} + friend _LIBCPP_ALWAYS_INLINE bool operator!=(nullptr_t, nullptr_t) {return false;} + friend _LIBCPP_ALWAYS_INLINE bool operator<(nullptr_t, nullptr_t) {return false;} + friend _LIBCPP_ALWAYS_INLINE bool operator<=(nullptr_t, nullptr_t) {return true;} + friend _LIBCPP_ALWAYS_INLINE bool operator>(nullptr_t, nullptr_t) {return false;} + friend _LIBCPP_ALWAYS_INLINE bool operator>=(nullptr_t, nullptr_t) {return true;} +}; + +inline _LIBCPP_ALWAYS_INLINE nullptr_t __get_nullptr_t() {return nullptr_t(0);} + +#define nullptr _VSTD::__get_nullptr_t() + +#endif // _LIBCPP_HAS_NO_NULLPTR + +_LIBCPP_END_NAMESPACE_STD + +#ifndef _LIBCPP_HAS_NO_NULLPTR + +namespace std +{ + typedef decltype(nullptr) nullptr_t; +} + +#endif // _LIBCPP_HAS_NO_NULLPTR + +#endif // _LIBCPP_CSTDDEF diff --git a/contrib/libc++/include/cstdint b/contrib/libc++/include/cstdint new file mode 100644 index 0000000..7a187d3 --- /dev/null +++ b/contrib/libc++/include/cstdint @@ -0,0 +1,191 @@ +// -*- C++ -*- +//===--------------------------- cstdint ----------------------------------===// +// +// 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_CSTDINT +#define _LIBCPP_CSTDINT + +/* + cstdint synopsis + +Macros: + + INT8_MIN + INT16_MIN + INT32_MIN + INT64_MIN + + INT8_MAX + INT16_MAX + INT32_MAX + INT64_MAX + + UINT8_MAX + UINT16_MAX + UINT32_MAX + UINT64_MAX + + INT_LEAST8_MIN + INT_LEAST16_MIN + INT_LEAST32_MIN + INT_LEAST64_MIN + + INT_LEAST8_MAX + INT_LEAST16_MAX + INT_LEAST32_MAX + INT_LEAST64_MAX + + UINT_LEAST8_MAX + UINT_LEAST16_MAX + UINT_LEAST32_MAX + UINT_LEAST64_MAX + + INT_FAST8_MIN + INT_FAST16_MIN + INT_FAST32_MIN + INT_FAST64_MIN + + INT_FAST8_MAX + INT_FAST16_MAX + INT_FAST32_MAX + INT_FAST64_MAX + + UINT_FAST8_MAX + UINT_FAST16_MAX + UINT_FAST32_MAX + UINT_FAST64_MAX + + INTPTR_MIN + INTPTR_MAX + UINTPTR_MAX + + INTMAX_MIN + INTMAX_MAX + + UINTMAX_MAX + + PTRDIFF_MIN + PTRDIFF_MAX + + SIG_ATOMIC_MIN + SIG_ATOMIC_MAX + + SIZE_MAX + + WCHAR_MIN + WCHAR_MAX + + WINT_MIN + WINT_MAX + + INT8_C(value) + INT16_C(value) + INT32_C(value) + INT64_C(value) + + UINT8_C(value) + UINT16_C(value) + UINT32_C(value) + UINT64_C(value) + + INTMAX_C(value) + UINTMAX_C(value) + +namespace std +{ + +Types: + + int8_t + int16_t + int32_t + int64_t + + uint8_t + uint16_t + uint32_t + uint64_t + + int_least8_t + int_least16_t + int_least32_t + int_least64_t + + uint_least8_t + uint_least16_t + uint_least32_t + uint_least64_t + + int_fast8_t + int_fast16_t + int_fast32_t + int_fast64_t + + uint_fast8_t + uint_fast16_t + uint_fast32_t + uint_fast64_t + + intptr_t + uintptr_t + + intmax_t + uintmax_t + +} // std +*/ + +#include <__config> +#include <stdint.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using::int8_t; +using::int16_t; +using::int32_t; +using::int64_t; + +using::uint8_t; +using::uint16_t; +using::uint32_t; +using::uint64_t; + +using::int_least8_t; +using::int_least16_t; +using::int_least32_t; +using::int_least64_t; + +using::uint_least8_t; +using::uint_least16_t; +using::uint_least32_t; +using::uint_least64_t; + +using::int_fast8_t; +using::int_fast16_t; +using::int_fast32_t; +using::int_fast64_t; + +using::uint_fast8_t; +using::uint_fast16_t; +using::uint_fast32_t; +using::uint_fast64_t; + +using::intptr_t; +using::uintptr_t; + +using::intmax_t; +using::uintmax_t; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSTDINT diff --git a/contrib/libc++/include/cstdio b/contrib/libc++/include/cstdio new file mode 100644 index 0000000..2a6ec76 --- /dev/null +++ b/contrib/libc++/include/cstdio @@ -0,0 +1,163 @@ +// -*- C++ -*- +//===---------------------------- cstdio ----------------------------------===// +// +// 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_CSTDIO +#define _LIBCPP_CSTDIO + +/* + cstdio synopsis + +Macros: + + BUFSIZ + EOF + FILENAME_MAX + FOPEN_MAX + L_tmpnam + NULL + SEEK_CUR + SEEK_END + SEEK_SET + TMP_MAX + _IOFBF + _IOLBF + _IONBF + stderr + stdin + stdout + +namespace std +{ + +Types: + +FILE +fpos_t +size_t + +int remove(const char* filename); +int rename(const char* old, const char* new); +FILE* tmpfile(void); +char* tmpnam(char* s); +int fclose(FILE* stream); +int fflush(FILE* stream); +FILE* fopen(const char* restrict filename, const char* restrict mode); +FILE* freopen(const char* restrict filename, const char * restrict mode, + FILE * restrict stream); +void setbuf(FILE* restrict stream, char* restrict buf); +int setvbuf(FILE* restrict stream, char* restrict buf, int mode, size_t size); +int fprintf(FILE* restrict stream, const char* restrict format, ...); +int fscanf(FILE* restrict stream, const char * restrict format, ...); +int printf(const char* restrict format, ...); +int scanf(const char* restrict format, ...); +int snprintf(char* restrict s, size_t n, const char* restrict format, ...); // C99 +int sprintf(char* restrict s, const char* restrict format, ...); +int sscanf(const char* restrict s, const char* restrict format, ...); +int vfprintf(FILE* restrict stream, const char* restrict format, va_list arg); +int vfscanf(FILE* restrict stream, const char* restrict format, va_list arg); // C99 +int vprintf(const char* restrict format, va_list arg); +int vscanf(const char* restrict format, va_list arg); // C99 +int vsnprintf(char* restrict s, size_t n, const char* restrict format, // C99 + va_list arg); +int vsprintf(char* restrict s, const char* restrict format, va_list arg); +int vsscanf(const char* restrict s, const char* restrict format, va_list arg); // C99 +int fgetc(FILE* stream); +char* fgets(char* restrict s, int n, FILE* restrict stream); +int fputc(int c, FILE* stream); +int fputs(const char* restrict s, FILE* restrict stream); +int getc(FILE* stream); +int getchar(void); +char* gets(char* s); +int putc(int c, FILE* stream); +int putchar(int c); +int puts(const char* s); +int ungetc(int c, FILE* stream); +size_t fread(void* restrict ptr, size_t size, size_t nmemb, + FILE* restrict stream); +size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, + FILE* restrict stream); +int fgetpos(FILE* restrict stream, fpos_t* restrict pos); +int fseek(FILE* stream, long offset, int whence); +int fsetpos(FILE*stream, const fpos_t* pos); +long ftell(FILE* stream); +void rewind(FILE* stream); +void clearerr(FILE* stream); +int feof(FILE* stream); +int ferror(FILE* stream); +void perror(const char* s); + +} // std +*/ + +#include <__config> +#include <stdio.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::FILE; +using ::fpos_t; +using ::size_t; + +using ::remove; +using ::rename; +using ::tmpfile; +using ::tmpnam; +using ::fclose; +using ::fflush; +using ::fopen; +using ::freopen; +using ::setbuf; +using ::setvbuf; +using ::fprintf; +using ::fscanf; +using ::printf; +using ::scanf; +using ::snprintf; +using ::sprintf; +using ::sscanf; +#ifndef _MSC_VER +using ::vfprintf; +using ::vfscanf; +using ::vscanf; +using ::vsscanf; +#endif // _MSC_VER +using ::vprintf; +using ::vsnprintf; +using ::vsprintf; +using ::fgetc; +using ::fgets; +using ::fputc; +using ::fputs; +using ::getc; +using ::getchar; +using ::gets; +using ::putc; +using ::putchar; +using ::puts; +using ::ungetc; +using ::fread; +using ::fwrite; +using ::fgetpos; +using ::fseek; +using ::fsetpos; +using ::ftell; +using ::rewind; +using ::clearerr; +using ::feof; +using ::ferror; +using ::perror; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSTDIO diff --git a/contrib/libc++/include/cstdlib b/contrib/libc++/include/cstdlib new file mode 100644 index 0000000..1158db2 --- /dev/null +++ b/contrib/libc++/include/cstdlib @@ -0,0 +1,146 @@ +// -*- C++ -*- +//===--------------------------- cstdlib ----------------------------------===// +// +// 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_CSTDLIB +#define _LIBCPP_CSTDLIB + +/* + cstdlib synopsis + +Macros: + + EXIT_FAILURE + EXIT_SUCCESS + MB_CUR_MAX + NULL + RAND_MAX + +namespace std +{ + +Types: + + size_t + div_t + ldiv_t + lldiv_t // C99 + +double atof (const char* nptr); +int atoi (const char* nptr); +long atol (const char* nptr); +long long atoll(const char* nptr); // C99 +double strtod (const char* restrict nptr, char** restrict endptr); +float strtof (const char* restrict nptr, char** restrict endptr); // C99 +long double strtold (const char* restrict nptr, char** restrict endptr); // C99 +long strtol (const char* restrict nptr, char** restrict endptr, int base); +long long strtoll (const char* restrict nptr, char** restrict endptr, int base); // C99 +unsigned long strtoul (const char* restrict nptr, char** restrict endptr, int base); +unsigned long long strtoull(const char* restrict nptr, char** restrict endptr, int base); // C99 +int rand(void); +void srand(unsigned int seed); +void* calloc(size_t nmemb, size_t size); +void free(void* ptr); +void* malloc(size_t size); +void* realloc(void* ptr, size_t size); +void abort(void); +int atexit(void (*func)(void)); +void exit(int status); +void _Exit(int status); +char* getenv(const char* name); +int system(const char* string); +void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)); +void qsort(void* base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *)); +int abs( int j); +long abs( long j); +long long abs(long long j); // C++0X +long labs( long j); +long long llabs(long long j); // C99 +div_t div( int numer, int denom); +ldiv_t div( long numer, long denom); +lldiv_t div(long long numer, long long denom); // C++0X +ldiv_t ldiv( long numer, long denom); +lldiv_t lldiv(long long numer, long long denom); // C99 +int mblen(const char* s, size_t n); +int mbtowc(wchar_t* restrict pwc, const char* restrict s, size_t n); +int wctomb(char* s, wchar_t wchar); +size_t mbstowcs(wchar_t* restrict pwcs, const char* restrict s, size_t n); +size_t wcstombs(char* restrict s, const wchar_t* restrict pwcs, size_t n); + +} // std + +*/ + +#include <__config> +#include <stdlib.h> +#ifdef _MSC_VER +#include "support/win32/locale_win32.h" +#endif // _MSC_VER + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::size_t; +using ::div_t; +using ::ldiv_t; +using ::lldiv_t; +using ::atof; +using ::atoi; +using ::atol; +using ::atoll; +using ::strtod; +using ::strtof; +using ::strtold; +using ::strtol; +using ::strtoll; +using ::strtoul; +using ::strtoull; +using ::rand; +using ::srand; +using ::calloc; +using ::free; +using ::malloc; +using ::realloc; +using ::abort; +using ::atexit; +using ::exit; +using ::_Exit; +using ::getenv; +using ::system; +using ::bsearch; +using ::qsort; +using ::abs; +using ::labs; +using ::llabs; +using ::div; +using ::ldiv; +using ::lldiv; +using ::mblen; +using ::mbtowc; +using ::wctomb; +using ::mbstowcs; +using ::wcstombs; + +// MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus +#if !defined(_MSC_VER) && !defined(__sun__) +inline _LIBCPP_INLINE_VISIBILITY long abs( long __x) {return labs(__x);} +inline _LIBCPP_INLINE_VISIBILITY long long abs(long long __x) {return llabs(__x);} + +inline _LIBCPP_INLINE_VISIBILITY ldiv_t div( long __x, long __y) {return ldiv(__x, __y);} +inline _LIBCPP_INLINE_VISIBILITY lldiv_t div(long long __x, long long __y) {return lldiv(__x, __y);} +#endif // _MSC_VER + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSTDLIB diff --git a/contrib/libc++/include/cstring b/contrib/libc++/include/cstring new file mode 100644 index 0000000..13bb118 --- /dev/null +++ b/contrib/libc++/include/cstring @@ -0,0 +1,112 @@ +// -*- C++ -*- +//===--------------------------- cstring ----------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_CSTRING +#define _LIBCPP_CSTRING + +/* + cstring synopsis + +Macros: + + NULL + +namespace std +{ + +Types: + + size_t + +void* memcpy(void* restrict s1, const void* restrict s2, size_t n); +void* memmove(void* s1, const void* s2, size_t n); +char* strcpy (char* restrict s1, const char* restrict s2); +char* strncpy(char* restrict s1, const char* restrict s2, size_t n); +char* strcat (char* restrict s1, const char* restrict s2); +char* strncat(char* restrict s1, const char* restrict s2, size_t n); +int memcmp(const void* s1, const void* s2, size_t n); +int strcmp (const char* s1, const char* s2); +int strncmp(const char* s1, const char* s2, size_t n); +int strcoll(const char* s1, const char* s2); +size_t strxfrm(char* restrict s1, const char* restrict s2, size_t n); +const void* memchr(const void* s, int c, size_t n); + void* memchr( void* s, int c, size_t n); +const char* strchr(const char* s, int c); + char* strchr( char* s, int c); +size_t strcspn(const char* s1, const char* s2); +const char* strpbrk(const char* s1, const char* s2); + char* strpbrk( char* s1, const char* s2); +const char* strrchr(const char* s, int c); + char* strrchr( char* s, int c); +size_t strspn(const char* s1, const char* s2); +const char* strstr(const char* s1, const char* s2); + char* strstr( char* s1, const char* s2); +char* strtok(char* restrict s1, const char* restrict s2); +void* memset(void* s, int c, size_t n); +char* strerror(int errnum); +size_t strlen(const char* s); + +} // std + +*/ + +#include <__config> +#include <string.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::size_t; +using ::memcpy; +using ::memmove; +using ::strcpy; +using ::strncpy; +using ::strcat; +using ::strncat; +using ::memcmp; +using ::strcmp; +using ::strncmp; +using ::strcoll; +using ::strxfrm; + +using ::memchr; + +using ::strchr; + +using ::strcspn; + +using ::strpbrk; + +using ::strrchr; + +using ::strspn; + +using ::strstr; + +// MSVC, GNU libc and its derivates already have the correct prototype in <string.h> #ifdef __cplusplus +#if !defined(__GLIBC__) && !defined(_MSC_VER) && !defined(__sun__) +inline _LIBCPP_INLINE_VISIBILITY char* strchr( char* __s, int __c) {return ::strchr(__s, __c);} +inline _LIBCPP_INLINE_VISIBILITY char* strpbrk( char* __s1, const char* __s2) {return ::strpbrk(__s1, __s2);} +inline _LIBCPP_INLINE_VISIBILITY char* strrchr( char* __s, int __c) {return ::strrchr(__s, __c);} +inline _LIBCPP_INLINE_VISIBILITY void* memchr( void* __s, int __c, size_t __n) {return ::memchr(__s, __c, __n);} +inline _LIBCPP_INLINE_VISIBILITY char* strstr( char* __s1, const char* __s2) {return ::strstr(__s1, __s2);} +#endif + +using ::strtok; +using ::memset; +using ::strerror; +using ::strlen; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CSTRING diff --git a/contrib/libc++/include/ctgmath b/contrib/libc++/include/ctgmath new file mode 100644 index 0000000..535eb7d --- /dev/null +++ b/contrib/libc++/include/ctgmath @@ -0,0 +1,29 @@ +// -*- C++ -*- +//===-------------------------- ctgmath -----------------------------------===// +// +// 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_CTGMATH +#define _LIBCPP_CTGMATH + +/* + ctgmath synopsis + +#include <ccomplex> +#include <cmath> + +*/ + +#include <ccomplex> +#include <cmath> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#endif // _LIBCPP_CTGMATH diff --git a/contrib/libc++/include/ctime b/contrib/libc++/include/ctime new file mode 100644 index 0000000..fc4eb26 --- /dev/null +++ b/contrib/libc++/include/ctime @@ -0,0 +1,72 @@ +// -*- C++ -*- +//===---------------------------- ctime -----------------------------------===// +// +// 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_CTIME +#define _LIBCPP_CTIME + +/* + ctime synopsis + +Macros: + + NULL + CLOCKS_PER_SEC + +namespace std +{ + +Types: + + clock_t + size_t + time_t + tm + +clock_t clock(); +double difftime(time_t time1, time_t time0); +time_t mktime(tm* timeptr); +time_t time(time_t* timer); +char* asctime(const tm* timeptr); +char* ctime(const time_t* timer); +tm* gmtime(const time_t* timer); +tm* localtime(const time_t* timer); +size_t strftime(char* restrict s, size_t maxsize, const char* restrict format, + const tm* restrict timeptr); + +} // std + +*/ + +#include <__config> +#include <time.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::clock_t; +using ::size_t; +using ::time_t; +using ::tm; +using ::clock; +using ::difftime; +using ::mktime; +using ::time; +using ::asctime; +using ::ctime; +using ::gmtime; +using ::localtime; +using ::strftime; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CTIME diff --git a/contrib/libc++/include/cwchar b/contrib/libc++/include/cwchar new file mode 100644 index 0000000..8e788fc --- /dev/null +++ b/contrib/libc++/include/cwchar @@ -0,0 +1,204 @@ +// -*- C++ -*- +//===--------------------------- cwchar -----------------------------------===// +// +// 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_CWCHAR +#define _LIBCPP_CWCHAR + +/* + cwchar synopsis + +Macros: + + NULL + WCHAR_MAX + WCHAR_MIN + WEOF + +namespace std +{ + +Types: + + mbstate_t + size_t + tm + wint_t + +int fwprintf(FILE* restrict stream, const wchar_t* restrict format, ...); +int fwscanf(FILE* restrict stream, const wchar_t* restrict format, ...); +int swprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, ...); +int swscanf(const wchar_t* restrict s, const wchar_t* restrict format, ...); +int vfwprintf(FILE* restrict stream, const wchar_t* restrict format, va_list arg); +int vfwscanf(FILE* restrict stream, const wchar_t* restrict format, va_list arg); // C99 +int vswprintf(wchar_t* restrict s, size_t n, const wchar_t* restrict format, va_list arg); +int vswscanf(const wchar_t* restrict s, const wchar_t* restrict format, va_list arg); // C99 +int vwprintf(const wchar_t* restrict format, va_list arg); +int vwscanf(const wchar_t* restrict format, va_list arg); // C99 +int wprintf(const wchar_t* restrict format, ...); +int wscanf(const wchar_t* restrict format, ...); +wint_t fgetwc(FILE* stream); +wchar_t* fgetws(wchar_t* restrict s, int n, FILE* restrict stream); +wint_t fputwc(wchar_t c, FILE* stream); +int fputws(const wchar_t* restrict s, FILE* restrict stream); +int fwide(FILE* stream, int mode); +wint_t getwc(FILE* stream); +wint_t getwchar(); +wint_t putwc(wchar_t c, FILE* stream); +wint_t putwchar(wchar_t c); +wint_t ungetwc(wint_t c, FILE* stream); +double wcstod(const wchar_t* restrict nptr, wchar_t** restrict endptr); +float wcstof(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99 +long double wcstold(const wchar_t* restrict nptr, wchar_t** restrict endptr); // C99 +long wcstol(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); +long long wcstoll(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99 +unsigned long wcstoul(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); +unsigned long long wcstoull(const wchar_t* restrict nptr, wchar_t** restrict endptr, int base); // C99 +wchar_t* wcscpy(wchar_t* restrict s1, const wchar_t* restrict s2); +wchar_t* wcsncpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n); +wchar_t* wcscat(wchar_t* restrict s1, const wchar_t* restrict s2); +wchar_t* wcsncat(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n); +int wcscmp(const wchar_t* s1, const wchar_t* s2); +int wcscoll(const wchar_t* s1, const wchar_t* s2); +int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n); +size_t wcsxfrm(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n); +const wchar_t* wcschr(const wchar_t* s, wchar_t c); + wchar_t* wcschr( wchar_t* s, wchar_t c); +size_t wcscspn(const wchar_t* s1, const wchar_t* s2); +size_t wcslen(const wchar_t* s); +const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2); + wchar_t* wcspbrk( wchar_t* s1, const wchar_t* s2); +const wchar_t* wcsrchr(const wchar_t* s, wchar_t c); + wchar_t* wcsrchr( wchar_t* s, wchar_t c); +size_t wcsspn(const wchar_t* s1, const wchar_t* s2); +const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2); + wchar_t* wcsstr( wchar_t* s1, const wchar_t* s2); +wchar_t* wcstok(wchar_t* restrict s1, const wchar_t* restrict s2, wchar_t** restrict ptr); +const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n); + wchar_t* wmemchr( wchar_t* s, wchar_t c, size_t n); +int wmemcmp(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n); +wchar_t* wmemcpy(wchar_t* restrict s1, const wchar_t* restrict s2, size_t n); +wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n); +wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n); +size_t wcsftime(wchar_t* restrict s, size_t maxsize, const wchar_t* restrict format, + const tm* restrict timeptr); +wint_t btowc(int c); +int wctob(wint_t c); +int mbsinit(const mbstate_t* ps); +size_t mbrlen(const char* restrict s, size_t n, mbstate_t* restrict ps); +size_t mbrtowc(wchar_t* restrict pwc, const char* restrict s, size_t n, mbstate_t* restrict ps); +size_t wcrtomb(char* restrict s, wchar_t wc, mbstate_t* restrict ps); +size_t mbsrtowcs(wchar_t* restrict dst, const char** restrict src, size_t len, + mbstate_t* restrict ps); +size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len, + mbstate_t* restrict ps); + +} // std + +*/ + +#include <__config> +#include <cwctype> +#include <wchar.h> +#if _WIN32 +#include <support/win32/support.h> // pull in *swprintf defines +#endif // _WIN32 + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::mbstate_t; +using ::size_t; +using ::tm; +using ::wint_t; +using ::FILE; +using ::fwprintf; +using ::fwscanf; +using ::swprintf; +using ::vfwprintf; +using ::vswprintf; +using ::vwprintf; +#ifndef _MSC_VER +using ::swscanf; +using ::vfwscanf; +using ::vswscanf; +using ::vwscanf; +#endif // _MSC_VER +using ::wprintf; +using ::wscanf; +using ::fgetwc; +using ::fgetws; +using ::fputwc; +using ::fputws; +using ::fwide; +using ::getwc; +using ::getwchar; +using ::putwc; +using ::putwchar; +using ::ungetwc; +using ::wcstod; +#ifndef _MSC_VER +using ::wcstof; +using ::wcstold; +#endif // _MSC_VER +using ::wcstol; +using ::wcstoll; +using ::wcstoul; +using ::wcstoull; +using ::wcscpy; +using ::wcsncpy; +using ::wcscat; +using ::wcsncat; +using ::wcscmp; +using ::wcscoll; +using ::wcsncmp; +using ::wcsxfrm; + +inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcschr(const wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);} +inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcschr( wchar_t* __s, wchar_t __c) {return ::wcschr(__s, __c);} + +using ::wcscspn; +using ::wcslen; + +inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcspbrk(const wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);} +inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcspbrk( wchar_t* __s1, const wchar_t* __s2) {return ::wcspbrk(__s1, __s2);} + +inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsrchr(const wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);} +inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsrchr( wchar_t* __s, wchar_t __c) {return ::wcsrchr(__s, __c);} + +using ::wcsspn; + +inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wcsstr(const wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);} +inline _LIBCPP_INLINE_VISIBILITY wchar_t* wcsstr( wchar_t* __s1, const wchar_t* __s2) {return ::wcsstr(__s1, __s2);} + +using ::wcstok; + +inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wmemchr(const wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);} +inline _LIBCPP_INLINE_VISIBILITY wchar_t* wmemchr( wchar_t* __s, wchar_t __c, size_t __n) {return ::wmemchr(__s, __c, __n);} + +using ::wmemcmp; +using ::wmemcpy; +using ::wmemmove; +using ::wmemset; +using ::wcsftime; +using ::btowc; +using ::wctob; +using ::mbsinit; +using ::mbrlen; +using ::mbrtowc; +using ::wcrtomb; +using ::mbsrtowcs; +using ::wcsrtombs; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CWCHAR diff --git a/contrib/libc++/include/cwctype b/contrib/libc++/include/cwctype new file mode 100644 index 0000000..4f89b52 --- /dev/null +++ b/contrib/libc++/include/cwctype @@ -0,0 +1,213 @@ +// -*- C++ -*- +//===--------------------------- cwctype ----------------------------------===// +// +// 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_CWCTYPE +#define _LIBCPP_CWCTYPE + +/* + cwctype synopsis + +Macros: + + WEOF + +namespace std +{ + +Types: + + wint_t + wctrans_t + wctype_t + +int iswalnum(wint_t wc); +int iswalpha(wint_t wc); +int iswblank(wint_t wc); // C99 +int iswcntrl(wint_t wc); +int iswdigit(wint_t wc); +int iswgraph(wint_t wc); +int iswlower(wint_t wc); +int iswprint(wint_t wc); +int iswpunct(wint_t wc); +int iswspace(wint_t wc); +int iswupper(wint_t wc); +int iswxdigit(wint_t wc); +int iswctype(wint_t wc, wctype_t desc); +wctype_t wctype(const char* property); +wint_t towlower(wint_t wc); +wint_t towupper(wint_t wc); +wint_t towctrans(wint_t wc, wctrans_t desc); +wctrans_t wctrans(const char* property); + +} // std + +*/ + +#include <__config> +#include <cctype> +#include <wctype.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +using ::wint_t; +using ::wctrans_t; +using ::wctype_t; + +#ifdef iswalnum +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswalnum(wint_t __wc) {return iswalnum(__wc);} +#undef iswalnum +inline _LIBCPP_INLINE_VISIBILITY int iswalnum(wint_t __wc) {return __libcpp_iswalnum(__wc);} +#else // iswalnum +using ::iswalnum; +#endif + +#ifdef iswalpha +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswalpha(wint_t __wc) {return iswalpha(__wc);} +#undef iswalpha +inline _LIBCPP_INLINE_VISIBILITY int iswalpha(wint_t __wc) {return __libcpp_iswalpha(__wc);} +#else // iswalpha +using ::iswalpha; +#endif + +#ifdef iswblank +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswblank(wint_t __wc) {return iswblank(__wc);} +#undef iswblank +inline _LIBCPP_INLINE_VISIBILITY int iswblank(wint_t __wc) {return __libcpp_iswblank(__wc);} +#else // iswblank +using ::iswblank; +#endif + +#ifdef iswcntrl +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswcntrl(wint_t __wc) {return iswcntrl(__wc);} +#undef iswcntrl +inline _LIBCPP_INLINE_VISIBILITY int iswcntrl(wint_t __wc) {return __libcpp_iswcntrl(__wc);} +#else // iswcntrl +using ::iswcntrl; +#endif + +#ifdef iswdigit +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswdigit(wint_t __wc) {return iswdigit(__wc);} +#undef iswdigit +inline _LIBCPP_INLINE_VISIBILITY int iswdigit(wint_t __wc) {return __libcpp_iswdigit(__wc);} +#else // iswdigit +using ::iswdigit; +#endif + +#ifdef iswgraph +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswgraph(wint_t __wc) {return iswgraph(__wc);} +#undef iswgraph +inline _LIBCPP_INLINE_VISIBILITY int iswgraph(wint_t __wc) {return __libcpp_iswgraph(__wc);} +#else // iswgraph +using ::iswgraph; +#endif + +#ifdef iswlower +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswlower(wint_t __wc) {return iswlower(__wc);} +#undef iswlower +inline _LIBCPP_INLINE_VISIBILITY int iswlower(wint_t __wc) {return __libcpp_iswlower(__wc);} +#else // iswlower +using ::iswlower; +#endif + +#ifdef iswprint +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswprint(wint_t __wc) {return iswprint(__wc);} +#undef iswprint +inline _LIBCPP_INLINE_VISIBILITY int iswprint(wint_t __wc) {return __libcpp_iswprint(__wc);} +#else // iswprint +using ::iswprint; +#endif + +#ifdef iswpunct +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswpunct(wint_t __wc) {return iswpunct(__wc);} +#undef iswpunct +inline _LIBCPP_INLINE_VISIBILITY int iswpunct(wint_t __wc) {return __libcpp_iswpunct(__wc);} +#else // iswpunct +using ::iswpunct; +#endif + +#ifdef iswspace +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswspace(wint_t __wc) {return iswspace(__wc);} +#undef iswspace +inline _LIBCPP_INLINE_VISIBILITY int iswspace(wint_t __wc) {return __libcpp_iswspace(__wc);} +#else // iswspace +using ::iswspace; +#endif + +#ifdef iswupper +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswupper(wint_t __wc) {return iswupper(__wc);} +#undef iswupper +inline _LIBCPP_INLINE_VISIBILITY int iswupper(wint_t __wc) {return __libcpp_iswupper(__wc);} +#else // iswupper +using ::iswupper; +#endif + +#ifdef iswxdigit +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswxdigit(wint_t __wc) {return iswxdigit(__wc);} +#undef iswxdigit +inline _LIBCPP_INLINE_VISIBILITY int iswxdigit(wint_t __wc) {return __libcpp_iswxdigit(__wc);} +#else // iswxdigit +using ::iswxdigit; +#endif + +#ifdef iswctype +inline _LIBCPP_INLINE_VISIBILITY int __libcpp_iswctype(wint_t __w, wctype_t __d) {return iswctype(__w, __d);} +#undef iswctype +inline _LIBCPP_INLINE_VISIBILITY int iswctype(wint_t __w, wctype_t __d) {return __libcpp_iswctype(__w, __d);} +#else // iswctype +using ::iswctype; +#endif + +#ifdef wctype +inline _LIBCPP_INLINE_VISIBILITY wctype_t __libcpp_wctype(const char* __p) {return wctype(__p);} +#undef wctype +inline _LIBCPP_INLINE_VISIBILITY wctype_t wctype(const char* __p) {return __libcpp_wctype(__p);} +#else // wctype +using ::wctype; +#endif + +#ifdef towlower +inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towlower(wint_t __wc) {return towlower(__wc);} +#undef towlower +inline _LIBCPP_INLINE_VISIBILITY wint_t towlower(wint_t __wc) {return __libcpp_towlower(__wc);} +#else // towlower +using ::towlower; +#endif + +#ifdef towupper +inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towupper(wint_t __wc) {return towupper(__wc);} +#undef towupper +inline _LIBCPP_INLINE_VISIBILITY wint_t towupper(wint_t __wc) {return __libcpp_towupper(__wc);} +#else // towupper +using ::towupper; +#endif + +#ifdef towctrans +inline _LIBCPP_INLINE_VISIBILITY wint_t __libcpp_towctrans(wint_t __wc, wctype_t __d) {return towctrans(__wc, __d);} +#undef towctrans +inline _LIBCPP_INLINE_VISIBILITY wint_t towctrans(wint_t __wc, wctype_t __d) {return __libcpp_towctrans(__wc, __d);} +#else // towctrans +using ::towctrans; +#endif + +#ifdef wctrans +inline _LIBCPP_INLINE_VISIBILITY wctrans_t __libcpp_wctrans(const char* __p) {return wctrans(__p);} +#undef wctrans +inline _LIBCPP_INLINE_VISIBILITY wctrans_t wctrans(const char* __p) {return __libcpp_wctrans(__p);} +#else // wctrans +using ::wctrans; +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CWCTYPE diff --git a/contrib/libc++/include/deque b/contrib/libc++/include/deque new file mode 100644 index 0000000..e65acfc --- /dev/null +++ b/contrib/libc++/include/deque @@ -0,0 +1,2844 @@ +// -*- C++ -*- +//===---------------------------- deque -----------------------------------===// +// +// 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_DEQUE +#define _LIBCPP_DEQUE + +/* + deque synopsis + +namespace std +{ + +template <class T, class Allocator = allocator<T> > +class deque +{ +public: + // types: + 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; + + // construct/copy/destroy: + deque() noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit deque(const allocator_type& a); + explicit deque(size_type n); + deque(size_type n, const value_type& v); + deque(size_type n, const value_type& v, const allocator_type& a); + template <class InputIterator> + deque(InputIterator f, InputIterator l); + template <class InputIterator> + deque(InputIterator f, InputIterator l, const allocator_type& a); + deque(const deque& c); + deque(deque&& c) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + deque(initializer_list<value_type> il, const Allocator& a = allocator_type()); + deque(const deque& c, const allocator_type& a); + deque(deque&& c, const allocator_type& a); + ~deque(); + + deque& operator=(const deque& c); + deque& operator=(deque&& c) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + deque& operator=(initializer_list<value_type> il); + + template <class InputIterator> + void assign(InputIterator f, InputIterator l); + void assign(size_type n, const value_type& v); + void assign(initializer_list<value_type> il); + + allocator_type get_allocator() const noexcept; + + // iterators: + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + size_type size() const noexcept; + size_type max_size() const noexcept; + void resize(size_type n); + void resize(size_type n, const value_type& v); + void shrink_to_fit(); + bool empty() const noexcept; + + // element access: + reference operator[](size_type i); + const_reference operator[](size_type i) const; + reference at(size_type i); + const_reference at(size_type i) const; + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + // modifiers: + void push_front(const value_type& v); + void push_front(value_type&& v); + void push_back(const value_type& v); + void push_back(value_type&& v); + template <class... Args> void emplace_front(Args&&... args); + template <class... Args> void emplace_back(Args&&... args); + template <class... Args> iterator emplace(const_iterator p, Args&&... args); + iterator insert(const_iterator p, const value_type& v); + iterator insert(const_iterator p, value_type&& v); + iterator insert(const_iterator p, size_type n, const value_type& v); + template <class InputIterator> + iterator insert (const_iterator p, InputIterator f, InputIterator l); + iterator insert(const_iterator p, initializer_list<value_type> il); + void pop_front(); + void pop_back(); + iterator erase(const_iterator p); + iterator erase(const_iterator f, const_iterator l); + void swap(deque& c) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + void clear() noexcept; +}; + +template <class T, class Allocator> + bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y); +template <class T, class Allocator> + bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y); +template <class T, class Allocator> + bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); +template <class T, class Allocator> + bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y); +template <class T, class Allocator> + bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); +template <class T, class Allocator> + bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); + +// specialized algorithms: +template <class T, class Allocator> + void swap(deque<T,Allocator>& x, deque<T,Allocator>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#include <__config> +#include <__split_buffer> +#include <type_traits> +#include <initializer_list> +#include <iterator> +#include <algorithm> +#include <stdexcept> + +#include <__undef_min_max> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _Allocator> class __deque_base; + +template <class _ValueType, class _Pointer, class _Reference, class _MapPointer, + class _DiffType, _DiffType _BlockSize> +class _LIBCPP_VISIBLE __deque_iterator; + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + +template <class _ValueType, class _Pointer, class _Reference, class _MapPointer, + class _DiffType, _DiffType _BlockSize> +class _LIBCPP_VISIBLE __deque_iterator +{ + typedef _MapPointer __map_iterator; +public: + typedef _Pointer pointer; + typedef _DiffType difference_type; +private: + __map_iterator __m_iter_; + pointer __ptr_; + + static const difference_type __block_size = _BlockSize; +public: + typedef _ValueType value_type; + typedef random_access_iterator_tag iterator_category; + typedef _Reference reference; + + _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT {} + + template <class _Pp, class _Rp, class _MP> + _LIBCPP_INLINE_VISIBILITY + __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, __block_size>& __it, + typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT + : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;} + + _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++() + { + if (++__ptr_ - *__m_iter_ == __block_size) + { + ++__m_iter_; + __ptr_ = *__m_iter_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int) + { + __deque_iterator __tmp = *this; + ++(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--() + { + if (__ptr_ == *__m_iter_) + { + --__m_iter_; + __ptr_ = *__m_iter_ + __block_size; + } + --__ptr_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int) + { + __deque_iterator __tmp = *this; + --(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n) + { + if (__n != 0) + { + __n += __ptr_ - *__m_iter_; + if (__n > 0) + { + __m_iter_ += __n / __block_size; + __ptr_ = *__m_iter_ + __n % __block_size; + } + else // (__n < 0) + { + difference_type __z = __block_size - 1 - __n; + __m_iter_ -= __z / __block_size; + __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size); + } + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n) + { + return *this += -__n; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const + { + __deque_iterator __t(*this); + __t += __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const + { + __deque_iterator __t(*this); + __t -= __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it) + {return __it + __n;} + + _LIBCPP_INLINE_VISIBILITY + friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y) + { + if (__x != __y) + return (__x.__m_iter_ - __y.__m_iter_) * __block_size + + (__x.__ptr_ - *__x.__m_iter_) + - (__y.__ptr_ - *__y.__m_iter_); + return 0; + } + + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + {return *(*this + __n);} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator==(const __deque_iterator& __x, const __deque_iterator& __y) + {return __x.__ptr_ == __y.__ptr_;} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y) + {return !(__x == __y);} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator<(const __deque_iterator& __x, const __deque_iterator& __y) + {return __x.__m_iter_ < __y.__m_iter_ || + (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator>(const __deque_iterator& __x, const __deque_iterator& __y) + {return __y < __x;} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y) + {return !(__y < __x);} + + _LIBCPP_INLINE_VISIBILITY friend + bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y) + {return !(__x < __y);} + +private: + _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT + : __m_iter_(__m), __ptr_(__p) {} + + template <class _Tp, class _Ap> friend class __deque_base; + template <class _Tp, class _Ap> friend class _LIBCPP_VISIBLE deque; + template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp> + friend class _LIBCPP_VISIBLE __deque_iterator; + + template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + copy(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> + friend + _OutputIterator + copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + + template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + copy_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> + friend + _OutputIterator + copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + + template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + move(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> + friend + _OutputIterator + move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); + + template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + move_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> + friend + _OutputIterator + move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r); + + template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> + friend + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> + move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); +}; + +// copy + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) +{ + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; + while (__f != __l) + { + pointer __rb = __r.__ptr_; + pointer __re = *__r.__m_iter_ + _B2; + difference_type __bs = __re - __rb; + difference_type __n = __l - __f; + _RAIter __m = __l; + if (__n > __bs) + { + __n = __bs; + __m = __f + __n; + } + _VSTD::copy(__f, __m, __rb); + __f = __m; + __r += __n; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + _B1; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + __r = _VSTD::copy(__fb, __fe, __r); + __n -= __bs; + __f += __bs; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + _B1; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + __r = _VSTD::copy(__fb, __fe, __r); + __n -= __bs; + __f += __bs; + } + return __r; +} + +// copy_backward + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) +{ + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; + while (__f != __l) + { + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r); + pointer __rb = *__rp.__m_iter_; + pointer __re = __rp.__ptr_ + 1; + difference_type __bs = __re - __rb; + difference_type __n = __l - __f; + _RAIter __m = __f; + if (__n > __bs) + { + __n = __bs; + __m = __l - __n; + } + _VSTD::copy_backward(__m, __l, __re); + __l = __m; + __r -= __n; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + __r = _VSTD::copy_backward(__lb, __le, __r); + __n -= __bs; + __l -= __bs - 1; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + __r = _VSTD::copy_backward(__lb, __le, __r); + __n -= __bs; + __l -= __bs - 1; + } + return __r; +} + +// move + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) +{ + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; + while (__f != __l) + { + pointer __rb = __r.__ptr_; + pointer __re = *__r.__m_iter_ + _B2; + difference_type __bs = __re - __rb; + difference_type __n = __l - __f; + _RAIter __m = __l; + if (__n > __bs) + { + __n = __bs; + __m = __f + __n; + } + _VSTD::move(__f, __m, __rb); + __f = __m; + __r += __n; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + _B1; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + __r = _VSTD::move(__fb, __fe, __r); + __n -= __bs; + __f += __bs; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + _B1; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + __r = _VSTD::move(__fb, __fe, __r); + __n -= __bs; + __f += __bs; + } + return __r; +} + +// move_backward + +template <class _RAIter, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move_backward(_RAIter __f, + _RAIter __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) +{ + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; + typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; + while (__f != __l) + { + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r); + pointer __rb = *__rp.__m_iter_; + pointer __re = __rp.__ptr_ + 1; + difference_type __bs = __re - __rb; + difference_type __n = __l - __f; + _RAIter __m = __f; + if (__n > __bs) + { + __n = __bs; + __m = __l - __n; + } + _VSTD::move_backward(__m, __l, __re); + __l = __m; + __r -= __n; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _OutputIterator> +_OutputIterator +move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + _OutputIterator __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + __r = _VSTD::move_backward(__lb, __le, __r); + __n -= __bs; + __l -= __bs - 1; + } + return __r; +} + +template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, + class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> +__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> +move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, + __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, + __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) +{ + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; + typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + __r = _VSTD::move_backward(__lb, __le, __r); + __n -= __bs; + __l -= __bs - 1; + } + return __r; +} + +template <bool> +class __deque_base_common +{ +protected: + void __throw_length_error() const; + void __throw_out_of_range() const; +}; + +template <bool __b> +void +__deque_base_common<__b>::__throw_length_error() const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw length_error("deque"); +#endif +} + +template <bool __b> +void +__deque_base_common<__b>::__throw_out_of_range() const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("deque"); +#endif +} + +template <class _Tp, class _Allocator> +class __deque_base + : protected __deque_base_common<true> +{ + __deque_base(const __deque_base& __c); + __deque_base& operator=(const __deque_base& __c); +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; + + static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16; + + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<pointer> +#else + rebind_alloc<pointer>::other +#endif + __pointer_allocator; + typedef allocator_traits<__pointer_allocator> __map_traits; + typedef typename __map_traits::pointer __map_pointer; + typedef typename __map_traits::const_pointer __map_const_pointer; + typedef __split_buffer<pointer, __pointer_allocator> __map; + + typedef __deque_iterator<value_type, pointer, reference, __map_pointer, + difference_type, __block_size> iterator; + typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer, + difference_type, __block_size> const_iterator; + + __map __map_; + size_type __start_; + __compressed_pair<size_type, allocator_type> __size_; + + iterator begin() _NOEXCEPT; + const_iterator begin() const _NOEXCEPT; + iterator end() _NOEXCEPT; + const_iterator end() const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY size_type& size() {return __size_.first();} + _LIBCPP_INLINE_VISIBILITY + const size_type& size() const _NOEXCEPT {return __size_.first();} + _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __size_.second();} + _LIBCPP_INLINE_VISIBILITY + const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();} + + __deque_base() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); + explicit __deque_base(const allocator_type& __a); +public: + ~__deque_base(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + __deque_base(__deque_base&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); + __deque_base(__deque_base&& __c, const allocator_type& __a); + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void swap(__deque_base& __c) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); +protected: + void clear() _NOEXCEPT; + + bool __invariants() const; + + _LIBCPP_INLINE_VISIBILITY + void __move_assign(__deque_base& __c) + _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) + { + __map_ = _VSTD::move(__c.__map_); + __start_ = __c.__start_; + size() = __c.size(); + __move_assign_alloc(__c); + __c.__start_ = __c.size() = 0; + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__deque_base& __c) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<allocator_type>::value) + {__move_assign_alloc(__c, integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>());} + +private: + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__deque_base& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type& __x, allocator_type& __y) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __alloc_traits::propagate_on_container_swap::value>());} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type&, allocator_type&, false_type) + _NOEXCEPT + {} +}; + +template <class _Tp, class _Allocator> +bool +__deque_base<_Tp, _Allocator>::__invariants() const +{ + if (!__map_.__invariants()) + return false; + if (__map_.size() >= size_type(-1) / __block_size) + return false; + for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end(); + __i != __e; ++__i) + if (*__i == nullptr) + return false; + if (__map_.size() != 0) + { + if (size() >= __map_.size() * __block_size) + return false; + if (__start_ >= __map_.size() * __block_size - size()) + return false; + } + else + { + if (size() != 0) + return false; + if (__start_ != 0) + return false; + } + return true; +} + +template <class _Tp, class _Allocator> +typename __deque_base<_Tp, _Allocator>::iterator +__deque_base<_Tp, _Allocator>::begin() _NOEXCEPT +{ + __map_pointer __mp = __map_.begin() + __start_ / __block_size; + return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); +} + +template <class _Tp, class _Allocator> +typename __deque_base<_Tp, _Allocator>::const_iterator +__deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT +{ + __map_const_pointer __mp = __map_.begin() + __start_ / __block_size; + return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); +} + +template <class _Tp, class _Allocator> +typename __deque_base<_Tp, _Allocator>::iterator +__deque_base<_Tp, _Allocator>::end() _NOEXCEPT +{ + size_type __p = size() + __start_; + __map_pointer __mp = __map_.begin() + __p / __block_size; + return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); +} + +template <class _Tp, class _Allocator> +typename __deque_base<_Tp, _Allocator>::const_iterator +__deque_base<_Tp, _Allocator>::end() const _NOEXCEPT +{ + size_type __p = size() + __start_; + __map_const_pointer __mp = __map_.begin() + __p / __block_size; + return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +__deque_base<_Tp, _Allocator>::__deque_base() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + : __start_(0), __size_(0) {} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +__deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a) + : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {} + +template <class _Tp, class _Allocator> +__deque_base<_Tp, _Allocator>::~__deque_base() +{ + clear(); + typename __map::iterator __i = __map_.begin(); + typename __map::iterator __e = __map_.end(); + for (; __i != __e; ++__i) + __alloc_traits::deallocate(__alloc(), *__i, __block_size); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __map_(_VSTD::move(__c.__map_)), + __start_(_VSTD::move(__c.__start_)), + __size_(_VSTD::move(__c.__size_)) +{ + __c.__start_ = 0; + __c.size() = 0; +} + +template <class _Tp, class _Allocator> +__deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a) + : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)), + __start_(_VSTD::move(__c.__start_)), + __size_(_VSTD::move(__c.size()), __a) +{ + if (__a == __c.__alloc()) + { + __c.__start_ = 0; + __c.size() = 0; + } + else + { + __map_.clear(); + __start_ = 0; + size() = 0; + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +__deque_base<_Tp, _Allocator>::swap(__deque_base& __c) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| + __is_nothrow_swappable<allocator_type>::value) +{ + __map_.swap(__c.__map_); + _VSTD::swap(__start_, __c.__start_); + _VSTD::swap(size(), __c.size()); + __swap_alloc(__alloc(), __c.__alloc()); +} + +template <class _Tp, class _Allocator> +void +__deque_base<_Tp, _Allocator>::clear() _NOEXCEPT +{ + allocator_type& __a = __alloc(); + for (iterator __i = begin(), __e = end(); __i != __e; ++__i) + __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); + size() = 0; + while (__map_.size() > 2) + { + __alloc_traits::deallocate(__a, __map_.front(), __block_size); + __map_.pop_front(); + } + switch (__map_.size()) + { + case 1: + __start_ = __block_size / 2; + break; + case 2: + __start_ = __block_size; + break; + } +} + +template <class _Tp, class _Allocator = allocator<_Tp> > +class _LIBCPP_VISIBLE deque + : private __deque_base<_Tp, _Allocator> +{ +public: + // types: + + typedef _Tp value_type; + typedef _Allocator allocator_type; + + typedef __deque_base<value_type, allocator_type> __base; + + typedef typename __base::__alloc_traits __alloc_traits; + typedef typename __base::reference reference; + typedef typename __base::const_reference const_reference; + typedef typename __base::iterator iterator; + typedef typename __base::const_iterator const_iterator; + 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; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + deque() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + {} + _LIBCPP_INLINE_VISIBILITY deque(const allocator_type& __a) : __base(__a) {} + explicit deque(size_type __n); + deque(size_type __n, const value_type& __v); + deque(size_type __n, const value_type& __v, const allocator_type& __a); + template <class _InputIter> + deque(_InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0); + template <class _InputIter> + deque(_InputIter __f, _InputIter __l, const allocator_type& __a, + typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0); + deque(const deque& __c); + deque(const deque& __c, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + deque(initializer_list<value_type> __il); + deque(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + deque& operator=(const deque& __c); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value); + deque(deque&& __c, const allocator_type& __a); + deque& operator=(deque&& __c) + _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class _InputIter> + void assign(_InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value && + !__is_random_access_iterator<_InputIter>::value>::type* = 0); + template <class _RAIter> + void assign(_RAIter __f, _RAIter __l, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); + void assign(size_type __n, const value_type& __v); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + allocator_type get_allocator() const _NOEXCEPT; + + // iterators: + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __base::begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __base::begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __base::end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __base::end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(__base::end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(__base::end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(__base::begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(__base::begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT + {return __base::begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT + {return __base::end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT + {return const_reverse_iterator(__base::end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT + {return const_reverse_iterator(__base::begin());} + + // capacity: + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __base::size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + {return __alloc_traits::max_size(__base::__alloc());} + void resize(size_type __n); + void resize(size_type __n, const value_type& __v); + void shrink_to_fit() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __base::size() == 0;} + + // element access: + reference operator[](size_type __i); + const_reference operator[](size_type __i) const; + reference at(size_type __i); + const_reference at(size_type __i) const; + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + // 23.2.2.3 modifiers: + void push_front(const value_type& __v); + void push_back(const value_type& __v); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> void emplace_front(_Args&&... __args); + template <class... _Args> void emplace_back(_Args&&... __args); + template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS + void push_front(value_type&& __v); + void push_back(value_type&& __v); + iterator insert(const_iterator __p, value_type&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + iterator insert(const_iterator __p, const value_type& __v); + iterator insert(const_iterator __p, size_type __n, const value_type& __v); + template <class _InputIter> + iterator insert (const_iterator __p, _InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value + &&!__is_bidirectional_iterator<_InputIter>::value>::type* = 0); + template <class _BiIter> + iterator insert (const_iterator __p, _BiIter __f, _BiIter __l, + typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, initializer_list<value_type> __il) + {return insert(__p, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + void pop_front(); + void pop_back(); + iterator erase(const_iterator __p); + iterator erase(const_iterator __f, const_iterator __l); + + void swap(deque& __c) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + void clear() _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + bool __invariants() const {return __base::__invariants();} +private: + _LIBCPP_INLINE_VISIBILITY + static size_type __recommend_blocks(size_type __n) + { + return __n / __base::__block_size + (__n % __base::__block_size != 0); + } + _LIBCPP_INLINE_VISIBILITY + size_type __capacity() const + { + return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1; + } + _LIBCPP_INLINE_VISIBILITY + size_type __front_spare() const + { + return __base::__start_; + } + _LIBCPP_INLINE_VISIBILITY + size_type __back_spare() const + { + return __capacity() - (__base::__start_ + __base::size()); + } + + template <class _InpIter> + void __append(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value && + !__is_forward_iterator<_InpIter>::value>::type* = 0); + template <class _ForIter> + void __append(_ForIter __f, _ForIter __l, + typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0); + void __append(size_type __n); + void __append(size_type __n, const value_type& __v); + void __erase_to_end(const_iterator __f); + void __add_front_capacity(); + void __add_front_capacity(size_type __n); + void __add_back_capacity(); + void __add_back_capacity(size_type __n); + iterator __move_and_check(iterator __f, iterator __l, iterator __r, + const_pointer& __vt); + iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r, + const_pointer& __vt); + void __move_construct_and_check(iterator __f, iterator __l, + iterator __r, const_pointer& __vt); + void __move_construct_backward_and_check(iterator __f, iterator __l, + iterator __r, const_pointer& __vt); + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const deque& __c) + {__copy_assign_alloc(__c, integral_constant<bool, + __alloc_traits::propagate_on_container_copy_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const deque& __c, true_type) + { + if (__base::__alloc() != __c.__alloc()) + { + clear(); + shrink_to_fit(); + } + __base::__alloc() = __c.__alloc(); + __base::__map_.__alloc() = __c.__map_.__alloc(); + } + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const deque&, false_type) + {} + + void __move_assign(deque& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); + void __move_assign(deque& __c, false_type); +}; + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(size_type __n) +{ + if (__n > 0) + __append(__n); +} + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v) +{ + if (__n > 0) + __append(__n, __v); +} + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a) + : __base(__a) +{ + if (__n > 0) + __append(__n, __v); +} + +template <class _Tp, class _Allocator> +template <class _InputIter> +deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value>::type*) +{ + __append(__f, __l); +} + +template <class _Tp, class _Allocator> +template <class _InputIter> +deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a, + typename enable_if<__is_input_iterator<_InputIter>::value>::type*) + : __base(__a) +{ + __append(__f, __l); +} + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(const deque& __c) + : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc())) +{ + __append(__c.begin(), __c.end()); +} + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a) + : __base(__a) +{ + __append(__c.begin(), __c.end()); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il) +{ + __append(__il.begin(), __il.end()); +} + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a) + : __base(__a) +{ + __append(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Allocator> +deque<_Tp, _Allocator>& +deque<_Tp, _Allocator>::operator=(const deque& __c) +{ + if (this != &__c) + { + __copy_assign_alloc(__c); + assign(__c.begin(), __c.end()); + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +deque<_Tp, _Allocator>::deque(deque&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) + : __base(_VSTD::move(__c)) +{ +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a) + : __base(_VSTD::move(__c), __a) +{ + if (__a != __c.__alloc()) + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__c.begin()), _Ip(__c.end())); + } +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +deque<_Tp, _Allocator>& +deque<_Tp, _Allocator>::operator=(deque&& __c) + _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) +{ + __move_assign(__c, integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__move_assign(deque& __c, false_type) +{ + if (__base::__alloc() != __c.__alloc()) + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__c.begin()), _Ip(__c.end())); + } + else + __move_assign(__c, true_type()); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__move_assign(deque& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) +{ + clear(); + shrink_to_fit(); + __base::__move_assign(__c); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +template <class _InputIter> +void +deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value && + !__is_random_access_iterator<_InputIter>::value>::type*) +{ + iterator __i = __base::begin(); + iterator __e = __base::end(); + for (; __f != __l && __i != __e; ++__f, ++__i) + *__i = *__f; + if (__f != __l) + __append(__f, __l); + else + __erase_to_end(__i); +} + +template <class _Tp, class _Allocator> +template <class _RAIter> +void +deque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l, + typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) +{ + if (static_cast<size_type>(__l - __f) > __base::size()) + { + _RAIter __m = __f + __base::size(); + _VSTD::copy(__f, __m, __base::begin()); + __append(__m, __l); + } + else + __erase_to_end(_VSTD::copy(__f, __l, __base::begin())); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v) +{ + if (__n > __base::size()) + { + _VSTD::fill_n(__base::begin(), __base::size(), __v); + __n -= __base::size(); + __append(__n, __v); + } + else + __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v)); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +_Allocator +deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT +{ + return __base::__alloc(); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::resize(size_type __n) +{ + if (__n > __base::size()) + __append(__n - __base::size()); + else if (__n < __base::size()) + __erase_to_end(__base::begin() + __n); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v) +{ + if (__n > __base::size()) + __append(__n - __base::size(), __v); + else if (__n < __base::size()) + __erase_to_end(__base::begin() + __n); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT +{ + allocator_type& __a = __base::__alloc(); + if (empty()) + { + while (__base::__map_.size() > 0) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } + __base::__start_ = 0; + } + else + { + if (__front_spare() >= __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); + __base::__map_.pop_front(); + __base::__start_ -= __base::__block_size; + } + if (__back_spare() >= __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } + } + __base::__map_.shrink_to_fit(); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::reference +deque<_Tp, _Allocator>::operator[](size_type __i) +{ + size_type __p = __base::__start_ + __i; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::const_reference +deque<_Tp, _Allocator>::operator[](size_type __i) const +{ + size_type __p = __base::__start_ + __i; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::reference +deque<_Tp, _Allocator>::at(size_type __i) +{ + if (__i >= __base::size()) + __base::__throw_out_of_range(); + size_type __p = __base::__start_ + __i; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::const_reference +deque<_Tp, _Allocator>::at(size_type __i) const +{ + if (__i >= __base::size()) + __base::__throw_out_of_range(); + size_type __p = __base::__start_ + __i; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::reference +deque<_Tp, _Allocator>::front() +{ + return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size) + + __base::__start_ % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::const_reference +deque<_Tp, _Allocator>::front() const +{ + return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size) + + __base::__start_ % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::reference +deque<_Tp, _Allocator>::back() +{ + size_type __p = __base::size() + __base::__start_ - 1; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename deque<_Tp, _Allocator>::const_reference +deque<_Tp, _Allocator>::back() const +{ + size_type __p = __base::size() + __base::__start_ - 1; + return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::push_back(const value_type& __v) +{ + allocator_type& __a = __base::__alloc(); + if (__back_spare() == 0) + __add_back_capacity(); + // __back_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v); + ++__base::size(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::push_back(value_type&& __v) +{ + allocator_type& __a = __base::__alloc(); + if (__back_spare() == 0) + __add_back_capacity(); + // __back_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v)); + ++__base::size(); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +void +deque<_Tp, _Allocator>::emplace_back(_Args&&... __args) +{ + allocator_type& __a = __base::__alloc(); + if (__back_spare() == 0) + __add_back_capacity(); + // __back_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...); + ++__base::size(); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::push_front(const value_type& __v) +{ + allocator_type& __a = __base::__alloc(); + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v); + --__base::__start_; + ++__base::size(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::push_front(value_type&& __v) +{ + allocator_type& __a = __base::__alloc(); + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v)); + --__base::__start_; + ++__base::size(); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +void +deque<_Tp, _Allocator>::emplace_front(_Args&&... __args) +{ + allocator_type& __a = __base::__alloc(); + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...); + --__base::__start_; + ++__base::size(); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v) +{ + size_type __pos = __p - __base::begin(); + size_type __to_end = __base::size() - __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < __to_end) + { // insert by shifting things backward + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + if (__pos == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v); + --__base::__start_; + ++__base::size(); + } + else + { + const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); + iterator __b = __base::begin(); + iterator __bm1 = _VSTD::prev(__b); + if (__vt == pointer_traits<const_pointer>::pointer_to(*__b)) + __vt = pointer_traits<const_pointer>::pointer_to(*__bm1); + __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); + --__base::__start_; + ++__base::size(); + if (__pos > 1) + __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt); + *__b = *__vt; + } + } + else + { // insert by shifting things forward + if (__back_spare() == 0) + __add_back_capacity(); + // __back_capacity >= 1 + size_type __de = __base::size() - __pos; + if (__de == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v); + ++__base::size(); + } + else + { + const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); + iterator __e = __base::end(); + iterator __em1 = _VSTD::prev(__e); + if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1)) + __vt = pointer_traits<const_pointer>::pointer_to(*__e); + __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); + ++__base::size(); + if (__de > 1) + __e = __move_backward_and_check(__e - __de, __em1, __e, __vt); + *--__e = *__vt; + } + } + return __base::begin() + __pos; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v) +{ + size_type __pos = __p - __base::begin(); + size_type __to_end = __base::size() - __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < __to_end) + { // insert by shifting things backward + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + if (__pos == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v)); + --__base::__start_; + ++__base::size(); + } + else + { + iterator __b = __base::begin(); + iterator __bm1 = _VSTD::prev(__b); + __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); + --__base::__start_; + ++__base::size(); + if (__pos > 1) + __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); + *__b = _VSTD::move(__v); + } + } + else + { // insert by shifting things forward + if (__back_spare() == 0) + __add_back_capacity(); + // __back_capacity >= 1 + size_type __de = __base::size() - __pos; + if (__de == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v)); + ++__base::size(); + } + else + { + iterator __e = __base::end(); + iterator __em1 = _VSTD::prev(__e); + __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); + ++__base::size(); + if (__de > 1) + __e = _VSTD::move_backward(__e - __de, __em1, __e); + *--__e = _VSTD::move(__v); + } + } + return __base::begin() + __pos; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args) +{ + size_type __pos = __p - __base::begin(); + size_type __to_end = __base::size() - __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < __to_end) + { // insert by shifting things backward + if (__front_spare() == 0) + __add_front_capacity(); + // __front_spare() >= 1 + if (__pos == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...); + --__base::__start_; + ++__base::size(); + } + else + { + iterator __b = __base::begin(); + iterator __bm1 = _VSTD::prev(__b); + __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); + --__base::__start_; + ++__base::size(); + if (__pos > 1) + __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); + *__b = value_type(_VSTD::forward<_Args>(__args)...); + } + } + else + { // insert by shifting things forward + if (__back_spare() == 0) + __add_back_capacity(); + // __back_capacity >= 1 + size_type __de = __base::size() - __pos; + if (__de == 0) + { + __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...); + ++__base::size(); + } + else + { + iterator __e = __base::end(); + iterator __em1 = _VSTD::prev(__e); + __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); + ++__base::size(); + if (__de > 1) + __e = _VSTD::move_backward(__e - __de, __em1, __e); + *--__e = value_type(_VSTD::forward<_Args>(__args)...); + } + } + return __base::begin() + __pos; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) +{ + size_type __pos = __p - __base::begin(); + size_type __to_end = __base::size() - __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < __to_end) + { // insert by shifting things backward + if (__n > __front_spare()) + __add_front_capacity(__n - __front_spare()); + // __n <= __front_spare() + size_type __old_n = __n; + iterator __old_begin = __base::begin(); + iterator __i = __old_begin; + if (__n > __pos) + { + for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v); + __n = __pos; + } + if (__n > 0) + { + const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); + iterator __obn = __old_begin + __n; + __move_construct_backward_and_check(__old_begin, __obn, __i, __vt); + if (__n < __pos) + __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt); + _VSTD::fill_n(__old_begin, __n, *__vt); + } + } + else + { // insert by shifting things forward + size_type __back_capacity = __back_spare(); + if (__n > __back_capacity) + __add_back_capacity(__n - __back_capacity); + // __n <= __back_capacity + size_type __old_n = __n; + iterator __old_end = __base::end(); + iterator __i = __old_end; + size_type __de = __base::size() - __pos; + if (__n > __de) + { + for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v); + __n = __de; + } + if (__n > 0) + { + const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); + iterator __oen = __old_end - __n; + __move_construct_and_check(__oen, __old_end, __i, __vt); + if (__n < __de) + __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt); + _VSTD::fill_n(__old_end - __n, __n, *__vt); + } + } + return __base::begin() + __pos; +} + +template <class _Tp, class _Allocator> +template <class _InputIter> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l, + typename enable_if<__is_input_iterator<_InputIter>::value + &&!__is_bidirectional_iterator<_InputIter>::value>::type*) +{ + __split_buffer<value_type, allocator_type&> __buf(__base::__alloc()); + __buf.__construct_at_end(__f, __l); + typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi; + return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end())); +} + +template <class _Tp, class _Allocator> +template <class _BiIter> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l, + typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*) +{ + size_type __n = _VSTD::distance(__f, __l); + size_type __pos = __p - __base::begin(); + size_type __to_end = __base::size() - __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < __to_end) + { // insert by shifting things backward + if (__n > __front_spare()) + __add_front_capacity(__n - __front_spare()); + // __n <= __front_spare() + size_type __old_n = __n; + iterator __old_begin = __base::begin(); + iterator __i = __old_begin; + _BiIter __m = __f; + if (__n > __pos) + { + __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos); + for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j); + __n = __pos; + } + if (__n > 0) + { + iterator __obn = __old_begin + __n; + for (iterator __j = __obn; __j != __old_begin;) + { + __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j)); + --__base::__start_; + ++__base::size(); + } + if (__n < __pos) + __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin); + _VSTD::copy(__m, __l, __old_begin); + } + } + else + { // insert by shifting things forward + size_type __back_capacity = __back_spare(); + if (__n > __back_capacity) + __add_back_capacity(__n - __back_capacity); + // __n <= __back_capacity + size_type __old_n = __n; + iterator __old_end = __base::end(); + iterator __i = __old_end; + _BiIter __m = __l; + size_type __de = __base::size() - __pos; + if (__n > __de) + { + __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de); + for (_BiIter __j = __m; __j != __l; ++__i, ++__j, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j); + __n = __de; + } + if (__n > 0) + { + iterator __oen = __old_end - __n; + for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j)); + if (__n < __de) + __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end); + _VSTD::copy_backward(__f, __m, __old_end); + } + } + return __base::begin() + __pos; +} + +template <class _Tp, class _Allocator> +template <class _InpIter> +void +deque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value && + !__is_forward_iterator<_InpIter>::value>::type*) +{ + for (; __f != __l; ++__f) + push_back(*__f); +} + +template <class _Tp, class _Allocator> +template <class _ForIter> +void +deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l, + typename enable_if<__is_forward_iterator<_ForIter>::value>::type*) +{ + size_type __n = _VSTD::distance(__f, __l); + allocator_type& __a = __base::__alloc(); + size_type __back_capacity = __back_spare(); + if (__n > __back_capacity) + __add_back_capacity(__n - __back_capacity); + // __n <= __back_capacity + for (iterator __i = __base::end(); __f != __l; ++__i, ++__f, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__append(size_type __n) +{ + allocator_type& __a = __base::__alloc(); + size_type __back_capacity = __back_spare(); + if (__n > __back_capacity) + __add_back_capacity(__n - __back_capacity); + // __n <= __back_capacity + for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i)); +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v) +{ + allocator_type& __a = __base::__alloc(); + size_type __back_capacity = __back_spare(); + if (__n > __back_capacity) + __add_back_capacity(__n - __back_capacity); + // __n <= __back_capacity + for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v); +} + +// Create front capacity for one block of elements. +// Strong guarantee. Either do it or don't touch anything. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__add_front_capacity() +{ + allocator_type& __a = __base::__alloc(); + if (__back_spare() >= __base::__block_size) + { + __base::__start_ += __base::__block_size; + pointer __pt = __base::__map_.back(); + __base::__map_.pop_back(); + __base::__map_.push_front(__pt); + } + // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer + else if (__base::__map_.size() < __base::__map_.capacity()) + { // we can put the new buffer into the map, but don't shift things around + // until all buffers are allocated. If we throw, we don't need to fix + // anything up (any added buffers are undetectible) + if (__base::__map_.__front_spare() > 0) + __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); + else + { + __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); + // Done allocating, reorder capacity + pointer __pt = __base::__map_.back(); + __base::__map_.pop_back(); + __base::__map_.push_front(__pt); + } + __base::__start_ = __base::__map_.size() == 1 ? + __base::__block_size / 2 : + __base::__start_ + __base::__block_size; + } + // Else need to allocate 1 buffer, *and* we need to reallocate __map_. + else + { + __split_buffer<pointer, typename __base::__pointer_allocator&> + __buf(max<size_type>(2 * __base::__map_.capacity(), 1), + 0, __base::__map_.__alloc()); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __alloc_traits::deallocate(__a, __buf.front(), __base::__block_size); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + for (typename __base::__map_pointer __i = __base::__map_.begin(); + __i != __base::__map_.end(); ++__i) + __buf.push_back(*__i); + _VSTD::swap(__base::__map_.__first_, __buf.__first_); + _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); + _VSTD::swap(__base::__map_.__end_, __buf.__end_); + _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); + __base::__start_ = __base::__map_.size() == 1 ? + __base::__block_size / 2 : + __base::__start_ + __base::__block_size; + } +} + +// Create front capacity for __n elements. +// Strong guarantee. Either do it or don't touch anything. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__add_front_capacity(size_type __n) +{ + allocator_type& __a = __base::__alloc(); + size_type __nb = __recommend_blocks(__n + __base::__map_.empty()); + // Number of unused blocks at back: + size_type __back_capacity = __back_spare() / __base::__block_size; + __back_capacity = _VSTD::min(__back_capacity, __nb); // don't take more than you need + __nb -= __back_capacity; // number of blocks need to allocate + // If __nb == 0, then we have sufficient capacity. + if (__nb == 0) + { + __base::__start_ += __base::__block_size * __back_capacity; + for (; __back_capacity > 0; --__back_capacity) + { + pointer __pt = __base::__map_.back(); + __base::__map_.pop_back(); + __base::__map_.push_front(__pt); + } + } + // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers + else if (__nb <= __base::__map_.capacity() - __base::__map_.size()) + { // we can put the new buffers into the map, but don't shift things around + // until all buffers are allocated. If we throw, we don't need to fix + // anything up (any added buffers are undetectible) + for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1)) + { + if (__base::__map_.__front_spare() == 0) + break; + __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); + } + for (; __nb > 0; --__nb, ++__back_capacity) + __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); + // Done allocating, reorder capacity + __base::__start_ += __back_capacity * __base::__block_size; + for (; __back_capacity > 0; --__back_capacity) + { + pointer __pt = __base::__map_.back(); + __base::__map_.pop_back(); + __base::__map_.push_front(__pt); + } + } + // Else need to allocate __nb buffers, *and* we need to reallocate __map_. + else + { + size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty(); + __split_buffer<pointer, typename __base::__pointer_allocator&> + __buf(max<size_type>(2* __base::__map_.capacity(), + __nb + __base::__map_.size()), + 0, __base::__map_.__alloc()); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __nb > 0; --__nb) + __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (typename __base::__map_pointer __i = __buf.begin(); + __i != __buf.end(); ++__i) + __alloc_traits::deallocate(__a, *__i, __base::__block_size); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __back_capacity > 0; --__back_capacity) + { + __buf.push_back(__base::__map_.back()); + __base::__map_.pop_back(); + } + for (typename __base::__map_pointer __i = __base::__map_.begin(); + __i != __base::__map_.end(); ++__i) + __buf.push_back(*__i); + _VSTD::swap(__base::__map_.__first_, __buf.__first_); + _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); + _VSTD::swap(__base::__map_.__end_, __buf.__end_); + _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); + __base::__start_ += __ds; + } +} + +// Create back capacity for one block of elements. +// Strong guarantee. Either do it or don't touch anything. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__add_back_capacity() +{ + allocator_type& __a = __base::__alloc(); + if (__front_spare() >= __base::__block_size) + { + __base::__start_ -= __base::__block_size; + pointer __pt = __base::__map_.front(); + __base::__map_.pop_front(); + __base::__map_.push_back(__pt); + } + // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers + else if (__base::__map_.size() < __base::__map_.capacity()) + { // we can put the new buffer into the map, but don't shift things around + // until it is allocated. If we throw, we don't need to fix + // anything up (any added buffers are undetectible) + if (__base::__map_.__back_spare() != 0) + __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); + else + { + __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); + // Done allocating, reorder capacity + pointer __pt = __base::__map_.front(); + __base::__map_.pop_front(); + __base::__map_.push_back(__pt); + } + } + // Else need to allocate 1 buffer, *and* we need to reallocate __map_. + else + { + __split_buffer<pointer, typename __base::__pointer_allocator&> + __buf(max<size_type>(2* __base::__map_.capacity(), 1), + __base::__map_.size(), + __base::__map_.__alloc()); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __alloc_traits::deallocate(__a, __buf.back(), __base::__block_size); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + for (typename __base::__map_pointer __i = __base::__map_.end(); + __i != __base::__map_.begin();) + __buf.push_front(*--__i); + _VSTD::swap(__base::__map_.__first_, __buf.__first_); + _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); + _VSTD::swap(__base::__map_.__end_, __buf.__end_); + _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); + } +} + +// Create back capacity for __n elements. +// Strong guarantee. Either do it or don't touch anything. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__add_back_capacity(size_type __n) +{ + allocator_type& __a = __base::__alloc(); + size_type __nb = __recommend_blocks(__n + __base::__map_.empty()); + // Number of unused blocks at front: + size_type __front_capacity = __front_spare() / __base::__block_size; + __front_capacity = _VSTD::min(__front_capacity, __nb); // don't take more than you need + __nb -= __front_capacity; // number of blocks need to allocate + // If __nb == 0, then we have sufficient capacity. + if (__nb == 0) + { + __base::__start_ -= __base::__block_size * __front_capacity; + for (; __front_capacity > 0; --__front_capacity) + { + pointer __pt = __base::__map_.front(); + __base::__map_.pop_front(); + __base::__map_.push_back(__pt); + } + } + // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers + else if (__nb <= __base::__map_.capacity() - __base::__map_.size()) + { // we can put the new buffers into the map, but don't shift things around + // until all buffers are allocated. If we throw, we don't need to fix + // anything up (any added buffers are undetectible) + for (; __nb > 0; --__nb) + { + if (__base::__map_.__back_spare() == 0) + break; + __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); + } + for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ += + __base::__block_size - (__base::__map_.size() == 1)) + __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); + // Done allocating, reorder capacity + __base::__start_ -= __base::__block_size * __front_capacity; + for (; __front_capacity > 0; --__front_capacity) + { + pointer __pt = __base::__map_.front(); + __base::__map_.pop_front(); + __base::__map_.push_back(__pt); + } + } + // Else need to allocate __nb buffers, *and* we need to reallocate __map_. + else + { + size_type __ds = __front_capacity * __base::__block_size; + __split_buffer<pointer, typename __base::__pointer_allocator&> + __buf(max<size_type>(2* __base::__map_.capacity(), + __nb + __base::__map_.size()), + __base::__map_.size() - __front_capacity, + __base::__map_.__alloc()); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __nb > 0; --__nb) + __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (typename __base::__map_pointer __i = __buf.begin(); + __i != __buf.end(); ++__i) + __alloc_traits::deallocate(__a, *__i, __base::__block_size); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __front_capacity > 0; --__front_capacity) + { + __buf.push_back(__base::__map_.front()); + __base::__map_.pop_front(); + } + for (typename __base::__map_pointer __i = __base::__map_.end(); + __i != __base::__map_.begin();) + __buf.push_front(*--__i); + _VSTD::swap(__base::__map_.__first_, __buf.__first_); + _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); + _VSTD::swap(__base::__map_.__end_, __buf.__end_); + _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); + __base::__start_ -= __ds; + } +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::pop_front() +{ + allocator_type& __a = __base::__alloc(); + __alloc_traits::destroy(__a, *(__base::__map_.begin() + + __base::__start_ / __base::__block_size) + + __base::__start_ % __base::__block_size); + --__base::size(); + if (++__base::__start_ >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); + __base::__map_.pop_front(); + __base::__start_ -= __base::__block_size; + } +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::pop_back() +{ + allocator_type& __a = __base::__alloc(); + size_type __p = __base::size() + __base::__start_ - 1; + __alloc_traits::destroy(__a, *(__base::__map_.begin() + + __p / __base::__block_size) + + __p % __base::__block_size); + --__base::size(); + if (__back_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } +} + +// move assign [__f, __l) to [__r, __r + (__l-__f)). +// If __vt points into [__f, __l), then subtract (__f - __r) from __vt. +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r, + const_pointer& __vt) +{ + // as if + // for (; __f != __l; ++__f, ++__r) + // *__r = _VSTD::move(*__f); + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + __base::__block_size; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + if (__fb <= __vt && __vt < __fe) + __vt = (const_iterator(__f.__m_iter_, __vt) -= __f - __r).__ptr_; + __r = _VSTD::move(__fb, __fe, __r); + __n -= __bs; + __f += __bs; + } + return __r; +} + +// move assign [__f, __l) to [__r - (__l-__f), __r) backwards. +// If __vt points into [__f, __l), then add (__r - __l) to __vt. +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r, + const_pointer& __vt) +{ + // as if + // while (__f != __l) + // *--__r = _VSTD::move(*--__l); + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + if (__lb <= __vt && __vt < __le) + __vt = (const_iterator(__l.__m_iter_, __vt) += __r - __l - 1).__ptr_; + __r = _VSTD::move_backward(__lb, __le, __r); + __n -= __bs; + __l -= __bs - 1; + } + return __r; +} + +// move construct [__f, __l) to [__r, __r + (__l-__f)). +// If __vt points into [__f, __l), then add (__r - __f) to __vt. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l, + iterator __r, const_pointer& __vt) +{ + allocator_type& __a = __base::__alloc(); + // as if + // for (; __f != __l; ++__r, ++__f, ++__base::size()) + // __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f)); + difference_type __n = __l - __f; + while (__n > 0) + { + pointer __fb = __f.__ptr_; + pointer __fe = *__f.__m_iter_ + __base::__block_size; + difference_type __bs = __fe - __fb; + if (__bs > __n) + { + __bs = __n; + __fe = __fb + __bs; + } + if (__fb <= __vt && __vt < __fe) + __vt = (const_iterator(__f.__m_iter_, __vt) += __r - __f).__ptr_; + for (; __fb != __fe; ++__fb, ++__r, ++__base::size()) + __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb)); + __n -= __bs; + __f += __bs; + } +} + +// move construct [__f, __l) to [__r - (__l-__f), __r) backwards. +// If __vt points into [__f, __l), then subtract (__l - __r) from __vt. +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l, + iterator __r, const_pointer& __vt) +{ + allocator_type& __a = __base::__alloc(); + // as if + // for (iterator __j = __l; __j != __f;) + // { + // __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j)); + // --__base::__start_; + // ++__base::size(); + // } + difference_type __n = __l - __f; + while (__n > 0) + { + --__l; + pointer __lb = *__l.__m_iter_; + pointer __le = __l.__ptr_ + 1; + difference_type __bs = __le - __lb; + if (__bs > __n) + { + __bs = __n; + __lb = __le - __bs; + } + if (__lb <= __vt && __vt < __le) + __vt = (const_iterator(__l.__m_iter_, __vt) -= __l - __r + 1).__ptr_; + while (__le != __lb) + { + __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le)); + --__base::__start_; + ++__base::size(); + } + __n -= __bs; + __l -= __bs - 1; + } +} + +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::erase(const_iterator __f) +{ + difference_type __n = 1; + iterator __b = __base::begin(); + difference_type __pos = __f - __b; + iterator __p = __b + __pos; + allocator_type& __a = __base::__alloc(); + if (__pos < (__base::size() - 1) / 2) + { // erase from front + _VSTD::move_backward(__b, __p, _VSTD::next(__p)); + __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); + --__base::size(); + ++__base::__start_; + if (__front_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); + __base::__map_.pop_front(); + __base::__start_ -= __base::__block_size; + } + } + else + { // erase from back + iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p); + __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); + --__base::size(); + if (__back_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } + } + return __base::begin() + __pos; +} + +template <class _Tp, class _Allocator> +typename deque<_Tp, _Allocator>::iterator +deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l) +{ + difference_type __n = __l - __f; + iterator __b = __base::begin(); + difference_type __pos = __f - __b; + iterator __p = __b + __pos; + if (__n > 0) + { + allocator_type& __a = __base::__alloc(); + if (__pos < (__base::size() - __n) / 2) + { // erase from front + iterator __i = _VSTD::move_backward(__b, __p, __p + __n); + for (; __b != __i; ++__b) + __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); + __base::size() -= __n; + __base::__start_ += __n; + while (__front_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); + __base::__map_.pop_front(); + __base::__start_ -= __base::__block_size; + } + } + else + { // erase from back + iterator __i = _VSTD::move(__p + __n, __base::end(), __p); + for (iterator __e = __base::end(); __i != __e; ++__i) + __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); + __base::size() -= __n; + while (__back_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } + } + } + return __base::begin() + __pos; +} + +template <class _Tp, class _Allocator> +void +deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f) +{ + iterator __e = __base::end(); + difference_type __n = __e - __f; + if (__n > 0) + { + allocator_type& __a = __base::__alloc(); + iterator __b = __base::begin(); + difference_type __pos = __f - __b; + for (iterator __p = __b + __pos; __p != __e; ++__p) + __alloc_traits::destroy(__a, _VSTD::addressof(*__p)); + __base::size() -= __n; + while (__back_spare() >= 2 * __base::__block_size) + { + __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); + __base::__map_.pop_back(); + } + } +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +deque<_Tp, _Allocator>::swap(deque& __c) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) +{ + __base::swap(__c); +} + +template <class _Tp, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +deque<_Tp, _Allocator>::clear() _NOEXCEPT +{ + __base::clear(); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + const typename deque<_Tp, _Allocator>::size_type __sz = __x.size(); + return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_DEQUE diff --git a/contrib/libc++/include/exception b/contrib/libc++/include/exception new file mode 100644 index 0000000..f7c3b70 --- /dev/null +++ b/contrib/libc++/include/exception @@ -0,0 +1,250 @@ +// -*- C++ -*- +//===-------------------------- exception ---------------------------------===// +// +// 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_EXCEPTION +#define _LIBCPP_EXCEPTION + +/* + exception synopsis + +namespace std +{ + +class exception +{ +public: + exception() noexcept; + exception(const exception&) noexcept; + exception& operator=(const exception&) noexcept; + virtual ~exception() noexcept; + virtual const char* what() const noexcept; +}; + +class bad_exception + : public exception +{ +public: + bad_exception() noexcept; + bad_exception(const bad_exception&) noexcept; + bad_exception& operator=(const bad_exception&) noexcept; + virtual ~bad_exception() noexcept; + virtual const char* what() const noexcept; +}; + +typedef void (*unexpected_handler)(); +unexpected_handler set_unexpected(unexpected_handler f ) noexcept; +unexpected_handler get_unexpected() noexcept; +[[noreturn]] void unexpected(); + +typedef void (*terminate_handler)(); +terminate_handler set_terminate(terminate_handler f ) noexcept; +terminate_handler get_terminate() noexcept; +[[noreturn]] void terminate() noexcept; + +bool uncaught_exception() noexcept; + +typedef unspecified exception_ptr; + +exception_ptr current_exception() noexcept; +void rethrow_exception [[noreturn]] (exception_ptr p); +template<class E> exception_ptr make_exception_ptr(E e) noexcept; + +class nested_exception +{ +public: + nested_exception() noexcept; + nested_exception(const nested_exception&) noexcept = default; + nested_exception& operator=(const nested_exception&) noexcept = default; + virtual ~nested_exception() = default; + + // access functions + [[noreturn]] void rethrow_nested() const; + exception_ptr nested_ptr() const noexcept; +}; + +template <class T> [[noreturn]] void throw_with_nested(T&& t); +template <class E> void rethrow_if_nested(const E& e); + +} // std + +*/ + +#include <__config> +#include <cstddef> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not using versioning namespace +{ + +class _LIBCPP_EXCEPTION_ABI exception +{ +public: + _LIBCPP_INLINE_VISIBILITY exception() _NOEXCEPT {} + virtual ~exception() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI bad_exception + : public exception +{ +public: + _LIBCPP_INLINE_VISIBILITY bad_exception() _NOEXCEPT {} + virtual ~bad_exception() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +typedef void (*unexpected_handler)(); +_LIBCPP_VISIBLE unexpected_handler set_unexpected(unexpected_handler) _NOEXCEPT; +_LIBCPP_VISIBLE unexpected_handler get_unexpected() _NOEXCEPT; +_ATTRIBUTE(noreturn) _LIBCPP_VISIBLE void unexpected(); + +typedef void (*terminate_handler)(); +_LIBCPP_VISIBLE terminate_handler set_terminate(terminate_handler) _NOEXCEPT; +_LIBCPP_VISIBLE terminate_handler get_terminate() _NOEXCEPT; +_ATTRIBUTE(noreturn) _LIBCPP_VISIBLE void terminate() _NOEXCEPT; + +_LIBCPP_VISIBLE bool uncaught_exception() _NOEXCEPT; + +class exception_ptr; + +exception_ptr current_exception() _NOEXCEPT; +_ATTRIBUTE(noreturn) void rethrow_exception(exception_ptr); + +class _LIBCPP_VISIBLE exception_ptr +{ + void* __ptr_; +public: + _LIBCPP_INLINE_VISIBILITY exception_ptr() _NOEXCEPT : __ptr_() {} + _LIBCPP_INLINE_VISIBILITY exception_ptr(nullptr_t) _NOEXCEPT : __ptr_() {} + exception_ptr(const exception_ptr&) _NOEXCEPT; + exception_ptr& operator=(const exception_ptr&) _NOEXCEPT; + ~exception_ptr() _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT + operator bool() const _NOEXCEPT {return __ptr_ != nullptr;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT + {return __x.__ptr_ == __y.__ptr_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const exception_ptr& __x, const exception_ptr& __y) _NOEXCEPT + {return !(__x == __y);} + + friend exception_ptr current_exception() _NOEXCEPT; + _ATTRIBUTE(noreturn) friend void rethrow_exception(exception_ptr); +}; + +template<class _Ep> +exception_ptr +make_exception_ptr(_Ep __e) _NOEXCEPT +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { + throw __e; + } + catch (...) + { + return current_exception(); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +// nested_exception + +class _LIBCPP_EXCEPTION_ABI nested_exception +{ + exception_ptr __ptr_; +public: + nested_exception() _NOEXCEPT; +// nested_exception(const nested_exception&) noexcept = default; +// nested_exception& operator=(const nested_exception&) noexcept = default; + virtual ~nested_exception() _NOEXCEPT; + + // access functions + _ATTRIBUTE(noreturn) void rethrow_nested() const; + _LIBCPP_INLINE_VISIBILITY exception_ptr nested_ptr() const _NOEXCEPT {return __ptr_;} +}; + +template <class _Tp> +struct __nested + : public _Tp, + public nested_exception +{ + _LIBCPP_INLINE_VISIBILITY explicit __nested(const _Tp& __t) : _Tp(__t) {} +}; + +template <class _Tp> +_ATTRIBUTE(noreturn) +void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +throw_with_nested(_Tp&& __t, typename enable_if< + is_class<typename remove_reference<_Tp>::type>::value && + !is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value + >::type* = 0) +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +throw_with_nested (_Tp& __t, typename enable_if< + is_class<_Tp>::value && !is_base_of<nested_exception, _Tp>::value + >::type* = 0) +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw __nested<typename remove_reference<_Tp>::type>(_VSTD::forward<_Tp>(__t)); +#endif +} + +template <class _Tp> +_ATTRIBUTE(noreturn) +void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +throw_with_nested(_Tp&& __t, typename enable_if< + !is_class<typename remove_reference<_Tp>::type>::value || + is_base_of<nested_exception, typename remove_reference<_Tp>::type>::value + >::type* = 0) +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +throw_with_nested (_Tp& __t, typename enable_if< + !is_class<_Tp>::value || is_base_of<nested_exception, _Tp>::value + >::type* = 0) +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw _VSTD::forward<_Tp>(__t); +#endif +} + +template <class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +void +rethrow_if_nested(const _Ep& __e, typename enable_if< + is_polymorphic<_Ep>::value + >::type* = 0) +{ + const nested_exception* __nep = dynamic_cast<const nested_exception*>(&__e); + if (__nep) + __nep->rethrow_nested(); +} + +template <class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +void +rethrow_if_nested(const _Ep&, typename enable_if< + !is_polymorphic<_Ep>::value + >::type* = 0) +{ +} + +} // std + +#endif // _LIBCPP_EXCEPTION diff --git a/contrib/libc++/include/ext/__hash b/contrib/libc++/include/ext/__hash new file mode 100644 index 0000000..8e9635d --- /dev/null +++ b/contrib/libc++/include/ext/__hash @@ -0,0 +1,46 @@ +// -*- C++ -*- +//===------------------------- hash_set ------------------------------------===// +// +// 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_EXT_HASH +#define _LIBCPP_EXT_HASH + +#pragma GCC system_header + +#include <string> +#include <cstring> + +namespace __gnu_cxx { +using namespace std; + +template <typename T> struct _LIBCPP_VISIBLE hash : public std::hash<T> + { }; + +template <> struct _LIBCPP_VISIBLE hash<const char*> + : public unary_function<const char*, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const char *__c) const _NOEXCEPT + { + return __do_string_hash(__c, __c + strlen(__c)); + } +}; + +template <> struct _LIBCPP_VISIBLE hash<char *> + : public unary_function<char*, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char *__c) const _NOEXCEPT + { + return __do_string_hash<const char *>(__c, __c + strlen(__c)); + } +}; +} + +#endif _LIBCPP_EXT_HASH diff --git a/contrib/libc++/include/ext/hash_map b/contrib/libc++/include/ext/hash_map new file mode 100644 index 0000000..bebdccb --- /dev/null +++ b/contrib/libc++/include/ext/hash_map @@ -0,0 +1,1003 @@ +// -*- C++ -*- +//===-------------------------- hash_map ----------------------------------===// +// +// 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_HASH_MAP +#define _LIBCPP_HASH_MAP + +/* + + hash_map synopsis + +namespace __gnu_cxx +{ + +template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, + class Alloc = allocator<pair<const Key, T>>> +class hash_map +{ +public: + // types + typedef Key key_type; + typedef T mapped_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + + explicit hash_map(size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + hash_map(InputIterator f, InputIterator l, + size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + hash_map(const hash_map&); + ~hash_map(); + hash_map& operator=(const hash_map&); + + allocator_type get_allocator() const; + + bool empty() const; + size_type size() const; + size_type max_size() const; + + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + pair<iterator, bool> insert(const value_type& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + + void erase(const_iterator position); + size_type erase(const key_type& k); + void erase(const_iterator first, const_iterator last); + void clear(); + + void swap(hash_map&); + + hasher hash_funct() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + mapped_type& operator[](const key_type& k); + + size_type bucket_count() const; + size_type max_bucket_count() const; + + size_type elems_in_bucket(size_type n) const; + + void resize(size_type n); +}; + +template <class Key, class T, class Hash, class Pred, class Alloc> + void swap(hash_map<Key, T, Hash, Pred, Alloc>& x, + hash_map<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator==(const hash_map<Key, T, Hash, Pred, Alloc>& x, + const hash_map<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator!=(const hash_map<Key, T, Hash, Pred, Alloc>& x, + const hash_map<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, + class Alloc = allocator<pair<const Key, T>>> +class hash_multimap +{ +public: + // types + typedef Key key_type; + typedef T mapped_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + + explicit hash_multimap(size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + hash_multimap(InputIterator f, InputIterator l, + size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + explicit hash_multimap(const allocator_type&); + hash_multimap(const hash_multimap&); + ~hash_multimap(); + hash_multimap& operator=(const hash_multimap&); + + allocator_type get_allocator() const; + + bool empty() const; + size_type size() const; + size_type max_size() const; + + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + iterator insert(const value_type& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + + void erase(const_iterator position); + size_type erase(const key_type& k); + void erase(const_iterator first, const_iterator last); + void clear(); + + void swap(hash_multimap&); + + hasher hash_funct() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const; + size_type max_bucket_count() const; + + size_type elems_in_bucket(size_type n) const; + + void resize(size_type n); +}; + +template <class Key, class T, class Hash, class Pred, class Alloc> + void swap(hash_multimap<Key, T, Hash, Pred, Alloc>& x, + hash_multimap<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator==(const hash_multimap<Key, T, Hash, Pred, Alloc>& x, + const hash_multimap<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator!=(const hash_multimap<Key, T, Hash, Pred, Alloc>& x, + const hash_multimap<Key, T, Hash, Pred, Alloc>& y); + +} // __gnu_cxx + +*/ + +#include <__config> +#include <__hash_table> +#include <functional> +#include <stdexcept> +#include <ext/__hash> + +#if __DEPRECATED +#warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> +#endif + +#pragma GCC system_header + +namespace __gnu_cxx { + +using namespace std; + +template <class _Tp, class _Hash, bool = is_empty<_Hash>::value +#if __has_feature(is_final) + && !__is_final(_Hash) +#endif + > +class __hash_map_hasher + : private _Hash +{ +public: + _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : _Hash() {} + _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : _Hash(__h) {} + _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return *this;} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Tp& __x) const + {return static_cast<const _Hash&>(*this)(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const typename _Tp::first_type& __x) const + {return static_cast<const _Hash&>(*this)(__x);} +}; + +template <class _Tp, class _Hash> +class __hash_map_hasher<_Tp, _Hash, false> +{ + _Hash __hash_; +public: + _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : __hash_() {} + _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : __hash_(__h) {} + _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return __hash_;} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Tp& __x) const + {return __hash_(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const typename _Tp::first_type& __x) const + {return __hash_(__x);} +}; + +template <class _Tp, class _Pred, bool = is_empty<_Pred>::value +#if __has_feature(is_final) + && !__is_final(_Pred) +#endif + > +class __hash_map_equal + : private _Pred +{ +public: + _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : _Pred() {} + _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : _Pred(__p) {} + _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return *this;} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Tp::first_type& __x, + const typename _Tp::first_type& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y);} +}; + +template <class _Tp, class _Pred> +class __hash_map_equal<_Tp, _Pred, false> +{ + _Pred __pred_; +public: + _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : __pred_() {} + _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : __pred_(__p) {} + _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return __pred_;} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const + {return __pred_(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const + {return __pred_(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Tp::first_type& __x, + const typename _Tp::first_type& __y) const + {return __pred_(__x, __y);} +}; + +template <class _Alloc> +class __hash_map_node_destructor +{ + typedef _Alloc allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::value_type::value_type value_type; +public: + typedef typename __alloc_traits::pointer pointer; +private: + typedef typename value_type::first_type first_type; + typedef typename value_type::second_type second_type; + + allocator_type& __na_; + + __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); + +public: + bool __first_constructed; + bool __second_constructed; + + _LIBCPP_INLINE_VISIBILITY + explicit __hash_map_node_destructor(allocator_type& __na) + : __na_(__na), + __first_constructed(false), + __second_constructed(false) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) + : __na_(__x.__na_), + __first_constructed(__x.__value_constructed), + __second_constructed(__x.__value_constructed) + { + __x.__value_constructed = false; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) + : __na_(__x.__na_), + __first_constructed(__x.__value_constructed), + __second_constructed(__x.__value_constructed) + { + const_cast<bool&>(__x.__value_constructed) = false; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) + { + if (__second_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second)); + if (__first_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } +}; + +template <class _HashIterator> +class _LIBCPP_VISIBLE __hash_map_iterator +{ + _HashIterator __i_; + + typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; + typedef const typename _HashIterator::value_type::first_type key_type; + typedef typename _HashIterator::value_type::second_type mapped_type; +public: + typedef forward_iterator_tag iterator_category; + typedef pair<key_type, mapped_type> value_type; + typedef typename _HashIterator::difference_type difference_type; + typedef value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_map_iterator() {} + + _LIBCPP_INLINE_VISIBILITY __hash_map_iterator(_HashIterator __i) : __i_(__i) {} + + _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY __hash_map_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __hash_map_iterator operator++(int) + { + __hash_map_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_multimap; + template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator; +}; + +template <class _HashIterator> +class _LIBCPP_VISIBLE __hash_map_const_iterator +{ + _HashIterator __i_; + + typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; + typedef const typename _HashIterator::value_type::first_type key_type; + typedef typename _HashIterator::value_type::second_type mapped_type; +public: + typedef forward_iterator_tag iterator_category; + typedef pair<key_type, mapped_type> value_type; + typedef typename _HashIterator::difference_type difference_type; + typedef const value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator() {} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator(_HashIterator __i) : __i_(__i) {} + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator( + __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) + : __i_(__i.__i_) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator operator++(int) + { + __hash_map_const_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE hash_multimap; + template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator; +}; + +template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, + class _Alloc = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE hash_map +{ +public: + // types + typedef _Key key_type; + typedef _Tp mapped_type; + typedef _Tp data_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __hash_map_hasher<__value_type, hasher> __hasher; + typedef __hash_map_equal<__value_type, key_equal> __key_equal; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + + typedef __hash_table<__value_type, __hasher, + __key_equal, __allocator_type> __table; + + __table __table_; + + typedef typename __table::__node_pointer __node_pointer; + typedef typename __table::__node_const_pointer __node_const_pointer; + typedef typename __table::__node_traits __node_traits; + typedef typename __table::__node_allocator __node_allocator; + typedef typename __table::__node __node; + typedef __hash_map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + typedef allocator_traits<allocator_type> __alloc_traits; +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + + typedef __hash_map_iterator<typename __table::iterator> iterator; + typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; + + _LIBCPP_INLINE_VISIBILITY hash_map() {__table_.rehash(193);} + explicit hash_map(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + hash_map(size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + hash_map(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + hash_map(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + hash_map(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + hash_map(const hash_map& __u); + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const {return __table_.end();} + + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(const value_type& __x) + {return __table_.__insert_unique(__x);} + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;} + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __p) {__table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __first, const_iterator __last) + {__table_.erase(__first.__i_, __last.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(hash_map& __u) {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_funct() const + {return __table_.hash_function().hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const + {return __table_.key_eq().key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_unique(__k);} + + mapped_type& operator[](const key_type& __k); + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type elems_in_bucket(size_type __n) const + {return __table_.bucket_size(__n);} + + _LIBCPP_INLINE_VISIBILITY + void resize(size_type __n) {__table_.rehash(__n);} + +private: + __node_holder __construct_node(const key_type& __k); +}; + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + _InputIterator __first, _InputIterator __last) +{ + __table_.rehash(193); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( + const hash_map& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __h.get_deleter().__second_constructed = true; + return _VSTD::move(__h); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_unique(*__first); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +_Tp& +hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) +{ + iterator __i = find(__k); + if (__i != end()) + return __i->second; + __node_holder __h = __construct_node(__k); + pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); + __h.release(); + return __r.first->second; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + __x.swap(__y); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +bool +operator==(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); + __i != __ex; ++__i) + { + const_iterator __j = __y.find(__i->first); + if (__j == __ey || !(*__i == *__j)) + return false; + } + return true; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, + class _Alloc = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE hash_multimap +{ +public: + // types + typedef _Key key_type; + typedef _Tp mapped_type; + typedef _Tp data_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __hash_map_hasher<__value_type, hasher> __hasher; + typedef __hash_map_equal<__value_type, key_equal> __key_equal; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + + typedef __hash_table<__value_type, __hasher, + __key_equal, __allocator_type> __table; + + __table __table_; + + typedef typename __table::__node_traits __node_traits; + typedef typename __table::__node_allocator __node_allocator; + typedef typename __table::__node __node; + typedef __hash_map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + typedef allocator_traits<allocator_type> __alloc_traits; +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + + typedef __hash_map_iterator<typename __table::iterator> iterator; + typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; + + _LIBCPP_INLINE_VISIBILITY + hash_multimap() {__table_.rehash(193);} + explicit hash_multimap(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + hash_multimap(size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + hash_multimap(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + hash_multimap(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + hash_multimap(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + hash_multimap(const hash_multimap& __u); + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const {return __table_.end();} + + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) {return insert(__x);} + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __p) {__table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __first, const_iterator __last) + {__table_.erase(__first.__i_, __last.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(hash_multimap& __u) {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_funct() const + {return __table_.hash_function().hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const + {return __table_.key_eq().key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_multi(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type elems_in_bucket(size_type __n) const + {return __table_.bucket_size(__n);} + + _LIBCPP_INLINE_VISIBILITY + void resize(size_type __n) {__table_.rehash(__n);} +}; + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + _InputIterator __first, _InputIterator __last) +{ + __table_.rehash(193); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( + const hash_multimap& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_multi(*__first); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + __x.swap(__y); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +bool +operator==(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + typedef pair<const_iterator, const_iterator> _EqRng; + for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) + { + _EqRng __xeq = __x.equal_range(__i->first); + _EqRng __yeq = __y.equal_range(__i->first); + if (_VSTD::distance(__xeq.first, __xeq.second) != + _VSTD::distance(__yeq.first, __yeq.second) || + !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) + return false; + __i = __xeq.second; + } + return true; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +} // __gnu_cxx + +#endif // _LIBCPP_HASH_MAP diff --git a/contrib/libc++/include/ext/hash_set b/contrib/libc++/include/ext/hash_set new file mode 100644 index 0000000..14daf7b --- /dev/null +++ b/contrib/libc++/include/ext/hash_set @@ -0,0 +1,657 @@ +// -*- C++ -*- +//===------------------------- hash_set ------------------------------------===// +// +// 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_HASH_SET +#define _LIBCPP_HASH_SET + +/* + + hash_set synopsis + +namespace __gnu_cxx +{ + +template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, + class Alloc = allocator<Value>> +class hash_set +{ +public: + // types + typedef Value key_type; + typedef key_type value_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + + explicit hash_set(size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + hash_set(InputIterator f, InputIterator l, + size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + hash_set(const hash_set&); + ~hash_set(); + hash_set& operator=(const hash_set&); + + allocator_type get_allocator() const; + + bool empty() const; + size_type size() const; + size_type max_size() const; + + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + pair<iterator, bool> insert(const value_type& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + + void erase(const_iterator position); + size_type erase(const key_type& k); + void erase(const_iterator first, const_iterator last); + void clear(); + + void swap(hash_set&); + + hasher hash_funct() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const; + size_type max_bucket_count() const; + + size_type elems_in_bucket(size_type n) const; + + void resize(size_type n); +}; + +template <class Value, class Hash, class Pred, class Alloc> + void swap(hash_set<Value, Hash, Pred, Alloc>& x, + hash_set<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator==(const hash_set<Value, Hash, Pred, Alloc>& x, + const hash_set<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator!=(const hash_set<Value, Hash, Pred, Alloc>& x, + const hash_set<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, + class Alloc = allocator<Value>> +class hash_multiset +{ +public: + // types + typedef Value key_type; + typedef key_type value_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + + explicit hash_multiset(size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + hash_multiset(InputIterator f, InputIterator l, + size_type n = 193, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + hash_multiset(const hash_multiset&); + ~hash_multiset(); + hash_multiset& operator=(const hash_multiset&); + + allocator_type get_allocator() const; + + bool empty() const; + size_type size() const; + size_type max_size() const; + + iterator begin(); + iterator end(); + const_iterator begin() const; + const_iterator end() const; + + iterator insert(const value_type& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + + void erase(const_iterator position); + size_type erase(const key_type& k); + void erase(const_iterator first, const_iterator last); + void clear(); + + void swap(hash_multiset&); + + hasher hash_funct() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const; + size_type max_bucket_count() const; + + size_type elems_in_bucket(size_type n) const; + + void resize(size_type n); +}; + +template <class Value, class Hash, class Pred, class Alloc> + void swap(hash_multiset<Value, Hash, Pred, Alloc>& x, + hash_multiset<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator==(const hash_multiset<Value, Hash, Pred, Alloc>& x, + const hash_multiset<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator!=(const hash_multiset<Value, Hash, Pred, Alloc>& x, + const hash_multiset<Value, Hash, Pred, Alloc>& y); +} // __gnu_cxx + +*/ + +#include <__config> +#include <__hash_table> +#include <functional> +#include <ext/__hash> + +#if __DEPRECATED +#warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> +#endif + +namespace __gnu_cxx { + +using namespace std; + +template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, + class _Alloc = allocator<_Value> > +class _LIBCPP_VISIBLE hash_set +{ +public: + // types + typedef _Value key_type; + typedef key_type value_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; + + __table __table_; + +public: + typedef typename __table::pointer pointer; + typedef typename __table::const_pointer const_pointer; + typedef typename __table::size_type size_type; + typedef typename __table::difference_type difference_type; + + typedef typename __table::const_iterator iterator; + typedef typename __table::const_iterator const_iterator; + + _LIBCPP_INLINE_VISIBILITY + hash_set() {__table_.rehash(193);} + explicit hash_set(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + hash_set(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + hash_set(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + hash_set(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + hash_set(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + hash_set(const hash_set& __u); + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const {return __table_.end();} + + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(const value_type& __x) + {return __table_.__insert_unique(__x);} + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;} + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __p) {__table_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __first, const_iterator __last) + {__table_.erase(__first, __last);} + _LIBCPP_INLINE_VISIBILITY + void clear() {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(hash_set& __u) {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_funct() const {return __table_.hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const {return __table_.key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_unique(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);} + + _LIBCPP_INLINE_VISIBILITY + void resize(size_type __n) {__table_.rehash(__n);} +}; + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( + _InputIterator __first, _InputIterator __last) +{ + __table_.rehash(193); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( + const hash_set& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_unique(*__first); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(hash_set<_Value, _Hash, _Pred, _Alloc>& __x, + hash_set<_Value, _Hash, _Pred, _Alloc>& __y) +{ + __x.swap(__y); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +bool +operator==(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x, + const hash_set<_Value, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename hash_set<_Value, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); + __i != __ex; ++__i) + { + const_iterator __j = __y.find(*__i); + if (__j == __ey || !(*__i == *__j)) + return false; + } + return true; +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x, + const hash_set<_Value, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, + class _Alloc = allocator<_Value> > +class _LIBCPP_VISIBLE hash_multiset +{ +public: + // types + typedef _Value key_type; + typedef key_type value_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; + + __table __table_; + +public: + typedef typename __table::pointer pointer; + typedef typename __table::const_pointer const_pointer; + typedef typename __table::size_type size_type; + typedef typename __table::difference_type difference_type; + + typedef typename __table::const_iterator iterator; + typedef typename __table::const_iterator const_iterator; + + _LIBCPP_INLINE_VISIBILITY + hash_multiset() {__table_.rehash(193);} + explicit hash_multiset(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + hash_multiset(size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a); + template <class _InputIterator> + hash_multiset(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + hash_multiset(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + hash_multiset(_InputIterator __first, _InputIterator __last, + size_type __n , const hasher& __hf, + const key_equal& __eql, const allocator_type& __a); + hash_multiset(const hash_multiset& __u); + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const {return __table_.end();} + + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) {return insert(__x);} + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __p) {__table_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + void erase(const_iterator __first, const_iterator __last) + {__table_.erase(__first, __last);} + _LIBCPP_INLINE_VISIBILITY + void clear() {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(hash_multiset& __u) {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_funct() const {return __table_.hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const {return __table_.key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_multi(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);} + + _LIBCPP_INLINE_VISIBILITY + void resize(size_type __n) {__table_.rehash(__n);} +}; + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + _InputIterator __first, _InputIterator __last) +{ + __table_.rehash(193); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( + const hash_multiset& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_multi(*__first); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) +{ + __x.swap(__y); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +bool +operator==(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename hash_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + typedef pair<const_iterator, const_iterator> _EqRng; + for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) + { + _EqRng __xeq = __x.equal_range(*__i); + _EqRng __yeq = __y.equal_range(*__i); + if (_VSTD::distance(__xeq.first, __xeq.second) != + _VSTD::distance(__yeq.first, __yeq.second) || + !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) + return false; + __i = __xeq.second; + } + return true; +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +} // __gnu_cxx + +#endif // _LIBCPP_HASH_SET diff --git a/contrib/libc++/include/forward_list b/contrib/libc++/include/forward_list new file mode 100644 index 0000000..19f7484 --- /dev/null +++ b/contrib/libc++/include/forward_list @@ -0,0 +1,1636 @@ +// -*- C++ -*- +//===----------------------- forward_list ---------------------------------===// +// +// 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_FORWARD_LIST +#define _LIBCPP_FORWARD_LIST + +/* + forward_list synopsis + +namespace std +{ + +template <class T, class Allocator = allocator<T>> +class forward_list +{ +public: + typedef T value_type; + typedef Allocator allocator_type; + + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef <details> iterator; + typedef <details> const_iterator; + + forward_list() + noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit forward_list(const allocator_type& a); + explicit forward_list(size_type n); + forward_list(size_type n, const value_type& v); + forward_list(size_type n, const value_type& v, const allocator_type& a); + template <class InputIterator> + forward_list(InputIterator first, InputIterator last); + template <class InputIterator> + forward_list(InputIterator first, InputIterator last, const allocator_type& a); + forward_list(const forward_list& x); + forward_list(const forward_list& x, const allocator_type& a); + forward_list(forward_list&& x) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + forward_list(forward_list&& x, const allocator_type& a); + forward_list(initializer_list<value_type> il); + forward_list(initializer_list<value_type> il, const allocator_type& a); + + ~forward_list(); + + forward_list& operator=(const forward_list& x); + forward_list& operator=(forward_list&& x) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + forward_list& operator=(initializer_list<value_type> il); + + template <class InputIterator> + void assign(InputIterator first, InputIterator last); + void assign(size_type n, const value_type& v); + void assign(initializer_list<value_type> il); + + allocator_type get_allocator() const noexcept; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + + iterator before_begin() noexcept; + const_iterator before_begin() const noexcept; + const_iterator cbefore_begin() const noexcept; + + bool empty() const noexcept; + size_type max_size() const noexcept; + + reference front(); + const_reference front() const; + + template <class... Args> void emplace_front(Args&&... args); + void push_front(const value_type& v); + void push_front(value_type&& v); + + void pop_front(); + + template <class... Args> + iterator emplace_after(const_iterator p, Args&&... args); + iterator insert_after(const_iterator p, const value_type& v); + iterator insert_after(const_iterator p, value_type&& v); + iterator insert_after(const_iterator p, size_type n, const value_type& v); + template <class InputIterator> + iterator insert_after(const_iterator p, + InputIterator first, InputIterator last); + iterator insert_after(const_iterator p, initializer_list<value_type> il); + + iterator erase_after(const_iterator p); + iterator erase_after(const_iterator first, const_iterator last); + + void swap(forward_list& x) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + + void resize(size_type n); + void resize(size_type n, const value_type& v); + void clear() noexcept; + + void splice_after(const_iterator p, forward_list& x); + void splice_after(const_iterator p, forward_list&& x); + void splice_after(const_iterator p, forward_list& x, const_iterator i); + void splice_after(const_iterator p, forward_list&& x, const_iterator i); + void splice_after(const_iterator p, forward_list& x, + const_iterator first, const_iterator last); + void splice_after(const_iterator p, forward_list&& x, + const_iterator first, const_iterator last); + void remove(const value_type& v); + template <class Predicate> void remove_if(Predicate pred); + void unique(); + template <class BinaryPredicate> void unique(BinaryPredicate binary_pred); + void merge(forward_list& x); + void merge(forward_list&& x); + template <class Compare> void merge(forward_list& x, Compare comp); + template <class Compare> void merge(forward_list&& x, Compare comp); + void sort(); + template <class Compare> void sort(Compare comp); + void reverse() noexcept; +}; + +template <class T, class Allocator> + bool operator==(const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + bool operator< (const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + bool operator!=(const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + bool operator> (const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + bool operator>=(const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + bool operator<=(const forward_list<T, Allocator>& x, + const forward_list<T, Allocator>& y); + +template <class T, class Allocator> + void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> + +#include <initializer_list> +#include <memory> +#include <limits> +#include <iterator> +#include <algorithm> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _VoidPtr> struct __forward_list_node; + +template <class _NodePtr> +struct __forward_begin_node +{ + typedef __forward_begin_node __self; + typedef _NodePtr pointer; + + pointer __next_; + + _LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {} +}; + +template <class _Tp, class _VoidPtr> +struct __forward_list_node + : public __forward_begin_node + < + typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__forward_list_node<_Tp, _VoidPtr> > +#else + rebind<__forward_list_node<_Tp, _VoidPtr> >::other +#endif + > +{ + typedef _Tp value_type; + + value_type __value_; +}; + +template<class _Tp, class _Alloc> class forward_list; +template<class _NodeConstPtr> class __forward_list_const_iterator; + +template <class _NodePtr> +class _LIBCPP_VISIBLE __forward_list_iterator +{ + typedef _NodePtr __node_pointer; + + __node_pointer __ptr_; + + _LIBCPP_INLINE_VISIBILITY + explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {} + + template<class, class> friend class forward_list; + template<class> friend class __forward_list_const_iterator; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename pointer_traits<__node_pointer>::element_type::value_type + value_type; + typedef value_type& reference; + typedef typename pointer_traits<__node_pointer>::difference_type + difference_type; + typedef typename pointer_traits<__node_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &__ptr_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __forward_list_iterator& operator++() + { + __ptr_ = __ptr_->__next_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __forward_list_iterator operator++(int) + { + __forward_list_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __forward_list_iterator& __x, + const __forward_list_iterator& __y) + {return __x.__ptr_ == __y.__ptr_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __forward_list_iterator& __x, + const __forward_list_iterator& __y) + {return !(__x == __y);} +}; + +template <class _NodeConstPtr> +class _LIBCPP_VISIBLE __forward_list_const_iterator +{ + typedef _NodeConstPtr __node_const_pointer; + + __node_const_pointer __ptr_; + + _LIBCPP_INLINE_VISIBILITY + explicit __forward_list_const_iterator(__node_const_pointer __p) _NOEXCEPT + : __ptr_(__p) {} + + typedef typename remove_const + < + typename pointer_traits<__node_const_pointer>::element_type + >::type __node; + typedef typename pointer_traits<__node_const_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__node> +#else + rebind<__node>::other +#endif + __node_pointer; + + template<class, class> friend class forward_list; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename __node::value_type value_type; + typedef const value_type& reference; + typedef typename pointer_traits<__node_const_pointer>::difference_type + difference_type; + typedef typename pointer_traits<__node_const_pointer>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __forward_list_const_iterator() _NOEXCEPT : __ptr_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY + __forward_list_const_iterator(__forward_list_iterator<__node_pointer> __p) _NOEXCEPT + : __ptr_(__p.__ptr_) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __ptr_->__value_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &__ptr_->__value_;} + + _LIBCPP_INLINE_VISIBILITY + __forward_list_const_iterator& operator++() + { + __ptr_ = __ptr_->__next_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __forward_list_const_iterator operator++(int) + { + __forward_list_const_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __forward_list_const_iterator& __x, + const __forward_list_const_iterator& __y) + {return __x.__ptr_ == __y.__ptr_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __forward_list_const_iterator& __x, + const __forward_list_const_iterator& __y) + {return !(__x == __y);} +}; + +template <class _Tp, class _Alloc> +class __forward_list_base +{ +protected: + typedef _Tp value_type; + typedef _Alloc allocator_type; + + typedef typename allocator_traits<allocator_type>::void_pointer void_pointer; + typedef __forward_list_node<value_type, void_pointer> __node; + typedef typename __node::__self __begin_node; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__node> +#else + rebind_alloc<__node>::other +#endif + __node_allocator; + typedef allocator_traits<__node_allocator> __node_traits; + typedef typename __node_traits::pointer __node_pointer; + typedef typename __node_traits::const_pointer __node_const_pointer; + + __compressed_pair<__begin_node, __node_allocator> __before_begin_; + + _LIBCPP_INLINE_VISIBILITY + __node_pointer __before_begin() _NOEXCEPT + {return pointer_traits<__node_pointer>::pointer_to( + static_cast<__node&>(__before_begin_.first()));} + _LIBCPP_INLINE_VISIBILITY + __node_const_pointer __before_begin() const _NOEXCEPT + {return pointer_traits<__node_const_pointer>::pointer_to( + static_cast<const __node&>(__before_begin_.first()));} + + _LIBCPP_INLINE_VISIBILITY + __node_allocator& __alloc() _NOEXCEPT + {return __before_begin_.second();} + _LIBCPP_INLINE_VISIBILITY + const __node_allocator& __alloc() const _NOEXCEPT + {return __before_begin_.second();} + + typedef __forward_list_iterator<__node_pointer> iterator; + typedef __forward_list_const_iterator<__node_const_pointer> const_iterator; + + _LIBCPP_INLINE_VISIBILITY + __forward_list_base() + _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) + : __before_begin_(__begin_node()) {} + _LIBCPP_INLINE_VISIBILITY + __forward_list_base(const allocator_type& __a) + : __before_begin_(__begin_node(), __node_allocator(__a)) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +public: + __forward_list_base(__forward_list_base&& __x) + _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); + __forward_list_base(__forward_list_base&& __x, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +private: + __forward_list_base(const __forward_list_base&); + __forward_list_base& operator=(const __forward_list_base&); + +public: + ~__forward_list_base(); + +protected: + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __forward_list_base& __x) + {__copy_assign_alloc(__x, integral_constant<bool, + __node_traits::propagate_on_container_copy_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__forward_list_base& __x) + _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<__node_allocator>::value) + {__move_assign_alloc(__x, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>());} + +public: + void swap(__forward_list_base& __x) + _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value); +protected: + void clear() _NOEXCEPT; + +private: + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __forward_list_base&, false_type) {} + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __forward_list_base& __x, true_type) + { + if (__alloc() != __x.__alloc()) + clear(); + __alloc() = __x.__alloc(); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__forward_list_base& __x, false_type) _NOEXCEPT + {} + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__forward_list_base& __x, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) + {__alloc() = _VSTD::move(__x.__alloc());} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y) + _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __node_traits::propagate_on_container_swap::value>());} + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, + false_type) + _NOEXCEPT + {} + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, + true_type) + _NOEXCEPT_(__is_nothrow_swappable<__node_allocator>::value) + { + using _VSTD::swap; + swap(__x, __y); + } +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x) + _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value) + : __before_begin_(_VSTD::move(__x.__before_begin_)) +{ + __x.__before_begin()->__next_ = nullptr; +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x, + const allocator_type& __a) + : __before_begin_(__begin_node(), __node_allocator(__a)) +{ + if (__alloc() == __x.__alloc()) + { + __before_begin()->__next_ = __x.__before_begin()->__next_; + __x.__before_begin()->__next_ = nullptr; + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +__forward_list_base<_Tp, _Alloc>::~__forward_list_base() +{ + clear(); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x) + _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) +{ + __swap_alloc(__alloc(), __x.__alloc()); + using _VSTD::swap; + swap(__before_begin()->__next_, __x.__before_begin()->__next_); +} + +template <class _Tp, class _Alloc> +void +__forward_list_base<_Tp, _Alloc>::clear() _NOEXCEPT +{ + __node_allocator& __a = __alloc(); + for (__node_pointer __p = __before_begin()->__next_; __p != nullptr;) + { + __node_pointer __next = __p->__next_; + __node_traits::destroy(__a, _VSTD::addressof(__p->__value_)); + __node_traits::deallocate(__a, __p, 1); + __p = __next; + } + __before_begin()->__next_ = nullptr; +} + +template <class _Tp, class _Alloc = allocator<_Tp> > +class _LIBCPP_VISIBLE forward_list + : private __forward_list_base<_Tp, _Alloc> +{ + typedef __forward_list_base<_Tp, _Alloc> base; + typedef typename base::__node_allocator __node_allocator; + typedef typename base::__node __node; + typedef typename base::__node_traits __node_traits; + typedef typename base::__node_pointer __node_pointer; + +public: + typedef _Tp value_type; + typedef _Alloc allocator_type; + + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef typename base::iterator iterator; + typedef typename base::const_iterator const_iterator; + + _LIBCPP_INLINE_VISIBILITY + forward_list() + _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) + {} // = default; + explicit forward_list(const allocator_type& __a); + explicit forward_list(size_type __n); + forward_list(size_type __n, const value_type& __v); + forward_list(size_type __n, const value_type& __v, const allocator_type& __a); + template <class _InputIterator> + forward_list(_InputIterator __f, _InputIterator __l, + typename enable_if< + __is_input_iterator<_InputIterator>::value + >::type* = nullptr); + template <class _InputIterator> + forward_list(_InputIterator __f, _InputIterator __l, + const allocator_type& __a, + typename enable_if< + __is_input_iterator<_InputIterator>::value + >::type* = nullptr); + forward_list(const forward_list& __x); + forward_list(const forward_list& __x, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + forward_list(forward_list&& __x) + _NOEXCEPT_(is_nothrow_move_constructible<base>::value) + : base(_VSTD::move(__x)) {} + forward_list(forward_list&& __x, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + forward_list(initializer_list<value_type> __il); + forward_list(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + // ~forward_list() = default; + + forward_list& operator=(const forward_list& __x); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + forward_list& operator=(forward_list&& __x) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); +#endif +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + forward_list& operator=(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + template <class _InputIterator> + typename enable_if + < + __is_input_iterator<_InputIterator>::value, + void + >::type + assign(_InputIterator __f, _InputIterator __l); + void assign(size_type __n, const value_type& __v); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + void assign(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(base::__alloc());} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT + {return iterator(base::__before_begin()->__next_);} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT + {return const_iterator(base::__before_begin()->__next_);} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT + {return iterator(nullptr);} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT + {return const_iterator(nullptr);} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT + {return const_iterator(base::__before_begin()->__next_);} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT + {return const_iterator(nullptr);} + + _LIBCPP_INLINE_VISIBILITY + iterator before_begin() _NOEXCEPT + {return iterator(base::__before_begin());} + _LIBCPP_INLINE_VISIBILITY + const_iterator before_begin() const _NOEXCEPT + {return const_iterator(base::__before_begin());} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbefore_begin() const _NOEXCEPT + {return const_iterator(base::__before_begin());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT + {return base::__before_begin()->__next_ == nullptr;} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + {return numeric_limits<size_type>::max();} + + _LIBCPP_INLINE_VISIBILITY + reference front() {return base::__before_begin()->__next_->__value_;} + _LIBCPP_INLINE_VISIBILITY + const_reference front() const {return base::__before_begin()->__next_->__value_;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> void emplace_front(_Args&&... __args); +#endif + void push_front(value_type&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void push_front(const value_type& __v); + + void pop_front(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> + iterator emplace_after(const_iterator __p, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS + iterator insert_after(const_iterator __p, value_type&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + iterator insert_after(const_iterator __p, const value_type& __v); + iterator insert_after(const_iterator __p, size_type __n, const value_type& __v); + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_input_iterator<_InputIterator>::value, + iterator + >::type + insert_after(const_iterator __p, _InputIterator __f, _InputIterator __l); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + iterator insert_after(const_iterator __p, initializer_list<value_type> __il) + {return insert_after(__p, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + iterator erase_after(const_iterator __p); + iterator erase_after(const_iterator __f, const_iterator __l); + + _LIBCPP_INLINE_VISIBILITY + void swap(forward_list& __x) + _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) + {base::swap(__x);} + + void resize(size_type __n); + void resize(size_type __n, const value_type& __v); + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {base::clear();} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void splice_after(const_iterator __p, forward_list&& __x); + _LIBCPP_INLINE_VISIBILITY + void splice_after(const_iterator __p, forward_list&& __x, const_iterator __i); + _LIBCPP_INLINE_VISIBILITY + void splice_after(const_iterator __p, forward_list&& __x, + const_iterator __f, const_iterator __l); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void splice_after(const_iterator __p, forward_list& __x); + void splice_after(const_iterator __p, forward_list& __x, const_iterator __i); + void splice_after(const_iterator __p, forward_list& __x, + const_iterator __f, const_iterator __l); + void remove(const value_type& __v); + template <class _Predicate> void remove_if(_Predicate __pred); + _LIBCPP_INLINE_VISIBILITY + void unique() {unique(__equal_to<value_type>());} + template <class _BinaryPredicate> void unique(_BinaryPredicate __binary_pred); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void merge(forward_list&& __x) {merge(__x, __less<value_type>());} + template <class _Compare> + _LIBCPP_INLINE_VISIBILITY + void merge(forward_list&& __x, _Compare __comp) + {merge(__x, _VSTD::move(__comp));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void merge(forward_list& __x) {merge(__x, __less<value_type>());} + template <class _Compare> void merge(forward_list& __x, _Compare __comp); + _LIBCPP_INLINE_VISIBILITY + void sort() {sort(__less<value_type>());} + template <class _Compare> void sort(_Compare __comp); + void reverse() _NOEXCEPT; + +private: + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void __move_assign(forward_list& __x, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); + void __move_assign(forward_list& __x, false_type); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class _Compare> + static + __node_pointer + __merge(__node_pointer __f1, __node_pointer __f2, _Compare& __comp); + + template <class _Compare> + static + __node_pointer + __sort(__node_pointer __f, difference_type __sz, _Compare& __comp); +}; + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) + : base(__a) +{ +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(size_type __n) +{ + if (__n > 0) + { + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); + for (__node_pointer __p = base::__before_begin(); __n > 0; --__n, + __p = __p->__next_) + { + __h.reset(__node_traits::allocate(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_)); + __h->__next_ = nullptr; + __p->__next_ = __h.release(); + } + } +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v) +{ + insert_after(cbefore_begin(), __n, __v); +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v, + const allocator_type& __a) + : base(__a) +{ + insert_after(cbefore_begin(), __n, __v); +} + +template <class _Tp, class _Alloc> +template <class _InputIterator> +forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, + typename enable_if< + __is_input_iterator<_InputIterator>::value + >::type*) +{ + insert_after(cbefore_begin(), __f, __l); +} + +template <class _Tp, class _Alloc> +template <class _InputIterator> +forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, + const allocator_type& __a, + typename enable_if< + __is_input_iterator<_InputIterator>::value + >::type*) + : base(__a) +{ + insert_after(cbefore_begin(), __f, __l); +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x) + : base(allocator_type( + __node_traits::select_on_container_copy_construction(__x.__alloc()) + ) + ) +{ + insert_after(cbefore_begin(), __x.begin(), __x.end()); +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x, + const allocator_type& __a) + : base(__a) +{ + insert_after(cbefore_begin(), __x.begin(), __x.end()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(forward_list&& __x, + const allocator_type& __a) + : base(_VSTD::move(__x), __a) +{ + if (base::__alloc() != __x.__alloc()) + { + typedef move_iterator<iterator> _Ip; + insert_after(cbefore_begin(), _Ip(__x.begin()), _Ip(__x.end())); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il) +{ + insert_after(cbefore_begin(), __il.begin(), __il.end()); +} + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il, + const allocator_type& __a) + : base(__a) +{ + insert_after(cbefore_begin(), __il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +forward_list<_Tp, _Alloc>& +forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) +{ + if (this != &__x) + { + base::__copy_assign_alloc(__x); + assign(__x.begin(), __x.end()); + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) +{ + clear(); + base::__move_assign_alloc(__x); + base::__before_begin()->__next_ = __x.__before_begin()->__next_; + __x.__before_begin()->__next_ = nullptr; +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, false_type) +{ + if (base::__alloc() == __x.__alloc()) + __move_assign(__x, true_type()); + else + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__x.begin()), _Ip(__x.end())); + } +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +forward_list<_Tp, _Alloc>& +forward_list<_Tp, _Alloc>::operator=(forward_list&& __x) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) +{ + __move_assign(__x, integral_constant<bool, + __node_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +forward_list<_Tp, _Alloc>& +forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il) +{ + assign(__il.begin(), __il.end()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator<_InputIterator>::value, + void +>::type +forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l) +{ + iterator __i = before_begin(); + iterator __j = _VSTD::next(__i); + iterator __e = end(); + for (; __j != __e && __f != __l; ++__i, ++__j, ++__f) + *__j = *__f; + if (__j == __e) + insert_after(__i, __f, __l); + else + erase_after(__i, __e); +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::assign(size_type __n, const value_type& __v) +{ + iterator __i = before_begin(); + iterator __j = _VSTD::next(__i); + iterator __e = end(); + for (; __j != __e && __n > 0; --__n, ++__i, ++__j) + *__j = __v; + if (__j == __e) + insert_after(__i, __n, __v); + else + erase_after(__i, __e); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il) +{ + assign(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +template <class... _Args> +void +forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args) +{ + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), + _VSTD::forward<_Args>(__args)...); + __h->__next_ = base::__before_begin()->__next_; + base::__before_begin()->__next_ = __h.release(); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::push_front(value_type&& __v) +{ + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); + __h->__next_ = base::__before_begin()->__next_; + base::__before_begin()->__next_ = __h.release(); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::push_front(const value_type& __v) +{ + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); + __h->__next_ = base::__before_begin()->__next_; + base::__before_begin()->__next_ = __h.release(); +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::pop_front() +{ + __node_allocator& __a = base::__alloc(); + __node_pointer __p = base::__before_begin()->__next_; + base::__before_begin()->__next_ = __p->__next_; + __node_traits::destroy(__a, _VSTD::addressof(__p->__value_)); + __node_traits::deallocate(__a, __p, 1); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +template <class... _Args> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args) +{ + __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_); + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), + _VSTD::forward<_Args>(__args)...); + __h->__next_ = __r->__next_; + __r->__next_ = __h.release(); + return iterator(__r->__next_); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) +{ + __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_); + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); + __h->__next_ = __r->__next_; + __r->__next_ = __h.release(); + return iterator(__r->__next_); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v) +{ + __node_pointer const __r = const_cast<__node_pointer>(__p.__ptr_); + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); + __h->__next_ = __r->__next_; + __r->__next_ = __h.release(); + return iterator(__r->__next_); +} + +template <class _Tp, class _Alloc> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, + const value_type& __v) +{ + __node_pointer __r = const_cast<__node_pointer>(__p.__ptr_); + if (__n > 0) + { + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); + __node_pointer __first = __h.release(); + __node_pointer __last = __first; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (--__n; __n != 0; --__n, __last = __last->__next_) + { + __h.reset(__node_traits::allocate(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); + __last->__next_ = __h.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (__first != nullptr) + { + __node_pointer __next = __first->__next_; + __node_traits::destroy(__a, _VSTD::addressof(__first->__value_)); + __node_traits::deallocate(__a, __first, 1); + __first = __next; + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __last->__next_ = __r->__next_; + __r->__next_ = __first; + __r = __last; + } + return iterator(__r); +} + +template <class _Tp, class _Alloc> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator<_InputIterator>::value, + typename forward_list<_Tp, _Alloc>::iterator +>::type +forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, + _InputIterator __f, _InputIterator __l) +{ + __node_pointer __r = const_cast<__node_pointer>(__p.__ptr_); + if (__f != __l) + { + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); + __node_pointer __first = __h.release(); + __node_pointer __last = __first; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (++__f; __f != __l; ++__f, __last = __last->__next_) + { + __h.reset(__node_traits::allocate(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); + __last->__next_ = __h.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (__first != nullptr) + { + __node_pointer __next = __first->__next_; + __node_traits::destroy(__a, _VSTD::addressof(__first->__value_)); + __node_traits::deallocate(__a, __first, 1); + __first = __next; + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __last->__next_ = __r->__next_; + __r->__next_ = __first; + __r = __last; + } + return iterator(__r); +} + +template <class _Tp, class _Alloc> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::erase_after(const_iterator __f) +{ + __node_pointer __p = const_cast<__node_pointer>(__f.__ptr_); + __node_pointer __n = __p->__next_; + __p->__next_ = __n->__next_; + __node_allocator& __a = base::__alloc(); + __node_traits::destroy(__a, _VSTD::addressof(__n->__value_)); + __node_traits::deallocate(__a, __n, 1); + return iterator(__p->__next_); +} + +template <class _Tp, class _Alloc> +typename forward_list<_Tp, _Alloc>::iterator +forward_list<_Tp, _Alloc>::erase_after(const_iterator __f, const_iterator __l) +{ + __node_pointer __e = const_cast<__node_pointer>(__l.__ptr_); + if (__f != __l) + { + __node_pointer __p = const_cast<__node_pointer>(__f.__ptr_); + __node_pointer __n = __p->__next_; + if (__n != __e) + { + __p->__next_ = __e; + __node_allocator& __a = base::__alloc(); + do + { + __p = __n->__next_; + __node_traits::destroy(__a, _VSTD::addressof(__n->__value_)); + __node_traits::deallocate(__a, __n, 1); + __n = __p; + } while (__n != __e); + } + } + return iterator(__e); +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::resize(size_type __n) +{ + size_type __sz = 0; + iterator __p = before_begin(); + iterator __i = begin(); + iterator __e = end(); + for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) + ; + if (__i != __e) + erase_after(__p, __e); + else + { + __n -= __sz; + if (__n > 0) + { + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); + for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n, + __ptr = __ptr->__next_) + { + __h.reset(__node_traits::allocate(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_)); + __h->__next_ = nullptr; + __ptr->__next_ = __h.release(); + } + } + } +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) +{ + size_type __sz = 0; + iterator __p = before_begin(); + iterator __i = begin(); + iterator __e = end(); + for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) + ; + if (__i != __e) + erase_after(__p, __e); + else + { + __n -= __sz; + if (__n > 0) + { + __node_allocator& __a = base::__alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); + for (__node_pointer __ptr = __p.__ptr_; __n > 0; --__n, + __ptr = __ptr->__next_) + { + __h.reset(__node_traits::allocate(__a, 1)); + __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); + __h->__next_ = nullptr; + __ptr->__next_ = __h.release(); + } + } + } +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list& __x) +{ + if (!__x.empty()) + { + if (__p.__ptr_->__next_ != nullptr) + { + const_iterator __lm1 = __x.before_begin(); + while (__lm1.__ptr_->__next_ != nullptr) + ++__lm1; + const_cast<__node_pointer>(__lm1.__ptr_)->__next_ = + const_cast<__node_pointer>(__p.__ptr_)->__next_; + } + const_cast<__node_pointer>(__p.__ptr_)->__next_ = + const_cast<__node_pointer>(__x.__before_begin())->__next_; + const_cast<__node_pointer>(__x.__before_begin())->__next_ = nullptr; + } +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list& __x, + const_iterator __i) +{ + const_iterator __lm1 = _VSTD::next(__i); + if (__p != __i && __p != __lm1) + { + const_cast<__node_pointer>(__i.__ptr_)->__next_ = + const_cast<__node_pointer>(__lm1.__ptr_)->__next_; + const_cast<__node_pointer>(__lm1.__ptr_)->__next_ = + const_cast<__node_pointer>(__p.__ptr_)->__next_; + const_cast<__node_pointer>(__p.__ptr_)->__next_ = + const_cast<__node_pointer>(__lm1.__ptr_); + } +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list& __x, + const_iterator __f, const_iterator __l) +{ + if (__f != __l && __p != __f) + { + const_iterator __lm1 = __f; + while (__lm1.__ptr_->__next_ != __l.__ptr_) + ++__lm1; + if (__f != __lm1) + { + const_cast<__node_pointer>(__lm1.__ptr_)->__next_ = + const_cast<__node_pointer>(__p.__ptr_)->__next_; + const_cast<__node_pointer>(__p.__ptr_)->__next_ = + const_cast<__node_pointer>(__f.__ptr_)->__next_; + const_cast<__node_pointer>(__f.__ptr_)->__next_ = + const_cast<__node_pointer>(__l.__ptr_); + } + } +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list&& __x) +{ + splice_after(__p, __x); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list&& __x, + const_iterator __i) +{ + splice_after(__p, __x, __i); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +forward_list<_Tp, _Alloc>::splice_after(const_iterator __p, + forward_list&& __x, + const_iterator __f, const_iterator __l) +{ + splice_after(__p, __x, __f, __l); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::remove(const value_type& __v) +{ + iterator __e = end(); + for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) + { + if (__i.__ptr_->__next_->__value_ == __v) + { + iterator __j = _VSTD::next(__i, 2); + for (; __j != __e && *__j == __v; ++__j) + ; + erase_after(__i, __j); + if (__j == __e) + break; + __i = __j; + } + else + ++__i; + } +} + +template <class _Tp, class _Alloc> +template <class _Predicate> +void +forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred) +{ + iterator __e = end(); + for (iterator __i = before_begin(); __i.__ptr_->__next_ != nullptr;) + { + if (__pred(__i.__ptr_->__next_->__value_)) + { + iterator __j = _VSTD::next(__i, 2); + for (; __j != __e && __pred(*__j); ++__j) + ; + erase_after(__i, __j); + if (__j == __e) + break; + __i = __j; + } + else + ++__i; + } +} + +template <class _Tp, class _Alloc> +template <class _BinaryPredicate> +void +forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred) +{ + for (iterator __i = begin(), __e = end(); __i != __e;) + { + iterator __j = _VSTD::next(__i); + for (; __j != __e && __binary_pred(*__i, *__j); ++__j) + ; + if (__i.__ptr_->__next_ != __j.__ptr_) + erase_after(__i, __j); + __i = __j; + } +} + +template <class _Tp, class _Alloc> +template <class _Compare> +void +forward_list<_Tp, _Alloc>::merge(forward_list& __x, _Compare __comp) +{ + if (this != &__x) + { + base::__before_begin()->__next_ = __merge(base::__before_begin()->__next_, + __x.__before_begin()->__next_, + __comp); + __x.__before_begin()->__next_ = nullptr; + } +} + +template <class _Tp, class _Alloc> +template <class _Compare> +typename forward_list<_Tp, _Alloc>::__node_pointer +forward_list<_Tp, _Alloc>::__merge(__node_pointer __f1, __node_pointer __f2, + _Compare& __comp) +{ + if (__f1 == nullptr) + return __f2; + if (__f2 == nullptr) + return __f1; + __node_pointer __r; + if (__comp(__f2->__value_, __f1->__value_)) + { + __node_pointer __t = __f2; + while (__t->__next_ != nullptr && + __comp(__t->__next_->__value_, __f1->__value_)) + __t = __t->__next_; + __r = __f2; + __f2 = __t->__next_; + __t->__next_ = __f1; + } + else + __r = __f1; + __node_pointer __p = __f1; + __f1 = __f1->__next_; + while (__f1 != nullptr && __f2 != nullptr) + { + if (__comp(__f2->__value_, __f1->__value_)) + { + __node_pointer __t = __f2; + while (__t->__next_ != nullptr && + __comp(__t->__next_->__value_, __f1->__value_)) + __t = __t->__next_; + __p->__next_ = __f2; + __f2 = __t->__next_; + __t->__next_ = __f1; + } + __p = __f1; + __f1 = __f1->__next_; + } + if (__f2 != nullptr) + __p->__next_ = __f2; + return __r; +} + +template <class _Tp, class _Alloc> +template <class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +forward_list<_Tp, _Alloc>::sort(_Compare __comp) +{ + base::__before_begin()->__next_ = __sort(base::__before_begin()->__next_, + _VSTD::distance(begin(), end()), __comp); +} + +template <class _Tp, class _Alloc> +template <class _Compare> +typename forward_list<_Tp, _Alloc>::__node_pointer +forward_list<_Tp, _Alloc>::__sort(__node_pointer __f1, difference_type __sz, + _Compare& __comp) +{ + switch (__sz) + { + case 0: + case 1: + return __f1; + case 2: + if (__comp(__f1->__next_->__value_, __f1->__value_)) + { + __node_pointer __t = __f1->__next_; + __t->__next_ = __f1; + __f1->__next_ = nullptr; + __f1 = __t; + } + return __f1; + } + difference_type __sz1 = __sz / 2; + difference_type __sz2 = __sz - __sz1; + __node_pointer __t = _VSTD::next(iterator(__f1), __sz1 - 1).__ptr_; + __node_pointer __f2 = __t->__next_; + __t->__next_ = nullptr; + return __merge(__sort(__f1, __sz1, __comp), + __sort(__f2, __sz2, __comp), __comp); +} + +template <class _Tp, class _Alloc> +void +forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT +{ + __node_pointer __p = base::__before_begin()->__next_; + if (__p != nullptr) + { + __node_pointer __f = __p->__next_; + __p->__next_ = nullptr; + while (__f != nullptr) + { + __node_pointer __t = __f->__next_; + __f->__next_ = __p; + __p = __f; + __f = __t; + } + base::__before_begin()->__next_ = __p; + } +} + +template <class _Tp, class _Alloc> +bool operator==(const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + typedef forward_list<_Tp, _Alloc> _Cp; + typedef typename _Cp::const_iterator _Ip; + _Ip __ix = __x.begin(); + _Ip __ex = __x.end(); + _Ip __iy = __y.begin(); + _Ip __ey = __y.end(); + for (; __ix != __ex && __iy != __ey; ++__ix, ++__iy) + if (!(*__ix == *__iy)) + return false; + return (__ix == __ex) == (__iy == __ey); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool operator!=(const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool operator< (const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), + __y.begin(), __y.end()); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool operator> (const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool operator>=(const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool operator<=(const forward_list<_Tp, _Alloc>& __x, + const forward_list<_Tp, _Alloc>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(forward_list<_Tp, _Alloc>& __x, forward_list<_Tp, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FORWARD_LIST diff --git a/contrib/libc++/include/fstream b/contrib/libc++/include/fstream new file mode 100644 index 0000000..8e1b1fb --- /dev/null +++ b/contrib/libc++/include/fstream @@ -0,0 +1,1398 @@ +// -*- C++ -*- +//===------------------------- fstream ------------------------------------===// +// +// 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_FSTREAM +#define _LIBCPP_FSTREAM + +/* + fstream synopsis + +template <class charT, class traits = char_traits<charT> > +class basic_filebuf + : public basic_streambuf<charT, traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // 27.9.1.2 Constructors/destructor: + basic_filebuf(); + basic_filebuf(basic_filebuf&& rhs); + virtual ~basic_filebuf(); + + // 27.9.1.3 Assign/swap: + basic_filebuf& operator=(basic_filebuf&& rhs); + void swap(basic_filebuf& rhs); + + // 27.9.1.4 Members: + bool is_open() const; + basic_filebuf* open(const char* s, ios_base::openmode mode); + basic_filebuf* open(const string& s, ios_base::openmode mode); + basic_filebuf* close(); + +protected: + // 27.9.1.5 Overridden virtual functions: + virtual streamsize showmanyc(); + virtual int_type underflow(); + virtual int_type uflow(); + virtual int_type pbackfail(int_type c = traits_type::eof()); + virtual int_type overflow (int_type c = traits_type::eof()); + virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n); + virtual pos_type seekoff(off_type off, ios_base::seekdir way, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type sp, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual int sync(); + virtual void imbue(const locale& loc); +}; + +template <class charT, class traits> + void + swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y); + +typedef basic_filebuf<char> filebuf; +typedef basic_filebuf<wchar_t> wfilebuf; + +template <class charT, class traits = char_traits<charT> > +class basic_ifstream + : public basic_istream<charT,traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_ifstream(); + explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in); + explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in); + basic_ifstream(basic_ifstream&& rhs); + + basic_ifstream& operator=(basic_ifstream&& rhs); + void swap(basic_ifstream& rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* s, ios_base::openmode mode = ios_base::in); + void open(const string& s, ios_base::openmode mode = ios_base::in); + void close(); +}; + +template <class charT, class traits> + void + swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y); + +typedef basic_ifstream<char> ifstream; +typedef basic_ifstream<wchar_t> wifstream; + +template <class charT, class traits = char_traits<charT> > +class basic_ofstream + : public basic_ostream<charT,traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_ofstream(); + explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); + explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out); + basic_ofstream(basic_ofstream&& rhs); + + basic_ofstream& operator=(basic_ofstream&& rhs); + void swap(basic_ofstream& rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* s, ios_base::openmode mode = ios_base::out); + void open(const string& s, ios_base::openmode mode = ios_base::out); + void close(); +}; + +template <class charT, class traits> + void + swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y); + +typedef basic_ofstream<char> ofstream; +typedef basic_ofstream<wchar_t> wofstream; + +template <class charT, class traits=char_traits<charT> > +class basic_fstream + : public basic_iostream<charT,traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_fstream(); + explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); + explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); + basic_fstream(basic_fstream&& rhs); + + basic_fstream& operator=(basic_fstream&& rhs); + void swap(basic_fstream& rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); + void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); + void close(); +}; + +template <class charT, class traits> + void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y); + +typedef basic_fstream<char> fstream; +typedef basic_fstream<wchar_t> wfstream; + +} // std + +*/ + +#include <__config> +#include <ostream> +#include <istream> +#include <__locale> +#include <cstdio> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_filebuf + : public basic_streambuf<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef typename traits_type::state_type state_type; + + // 27.9.1.2 Constructors/destructor: + basic_filebuf(); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_filebuf(basic_filebuf&& __rhs); +#endif + virtual ~basic_filebuf(); + + // 27.9.1.3 Assign/swap: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_filebuf& operator=(basic_filebuf&& __rhs); +#endif + void swap(basic_filebuf& __rhs); + + // 27.9.1.4 Members: + bool is_open() const; + basic_filebuf* open(const char* __s, ios_base::openmode __mode); + basic_filebuf* open(const string& __s, ios_base::openmode __mode); + basic_filebuf* close(); + +protected: + // 27.9.1.5 Overridden virtual functions: + virtual int_type underflow(); + virtual int_type pbackfail(int_type __c = traits_type::eof()); + virtual int_type overflow (int_type __c = traits_type::eof()); + virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, streamsize __n); + virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __wch = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type __sp, + ios_base::openmode __wch = ios_base::in | ios_base::out); + virtual int sync(); + virtual void imbue(const locale& __loc); + +private: + char* __extbuf_; + const char* __extbufnext_; + const char* __extbufend_; + char __extbuf_min_[8]; + size_t __ebs_; + char_type* __intbuf_; + size_t __ibs_; + FILE* __file_; + const codecvt<char_type, char, state_type>* __cv_; + state_type __st_; + ios_base::openmode __om_; + ios_base::openmode __cm_; + bool __owns_eb_; + bool __owns_ib_; + bool __always_noconv_; + + bool __read_mode(); + void __write_mode(); +}; + +template <class _CharT, class _Traits> +basic_filebuf<_CharT, _Traits>::basic_filebuf() + : __extbuf_(0), + __extbufnext_(0), + __extbufend_(0), + __ebs_(0), + __intbuf_(0), + __ibs_(0), + __file_(0), + __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), + __st_(), + __om_(0), + __cm_(0), + __owns_eb_(false), + __owns_ib_(false), + __always_noconv_(__cv_->always_noconv()) +{ + setbuf(0, 4096); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +basic_filebuf<_CharT, _Traits>::basic_filebuf(basic_filebuf&& __rhs) + : basic_streambuf<_CharT, _Traits>(__rhs) +{ + if (__rhs.__extbuf_ == __rhs.__extbuf_min_) + { + __extbuf_ = __extbuf_min_; + __extbufnext_ = __extbuf_ + (__rhs.__extbufnext_ - __rhs.__extbuf_); + __extbufend_ = __extbuf_ + (__rhs.__extbufend_ - __rhs.__extbuf_); + } + else + { + __extbuf_ = __rhs.__extbuf_; + __extbufnext_ = __rhs.__extbufnext_; + __extbufend_ = __rhs.__extbufend_; + } + __ebs_ = __rhs.__ebs_; + __intbuf_ = __rhs.__intbuf_; + __ibs_ = __rhs.__ibs_; + __file_ = __rhs.__file_; + __cv_ = __rhs.__cv_; + __st_ = __rhs.__st_; + __om_ = __rhs.__om_; + __cm_ = __rhs.__cm_; + __owns_eb_ = __rhs.__owns_eb_; + __owns_ib_ = __rhs.__owns_ib_; + __always_noconv_ = __rhs.__always_noconv_; + if (__rhs.pbase()) + { + if (__rhs.pbase() == __rhs.__intbuf_) + this->setp(__intbuf_, __intbuf_ + (__rhs. epptr() - __rhs.pbase())); + else + this->setp((char_type*)__extbuf_, + (char_type*)__extbuf_ + (__rhs. epptr() - __rhs.pbase())); + this->pbump(__rhs. pptr() - __rhs.pbase()); + } + else if (__rhs.eback()) + { + if (__rhs.eback() == __rhs.__intbuf_) + this->setg(__intbuf_, __intbuf_ + (__rhs.gptr() - __rhs.eback()), + __intbuf_ + (__rhs.egptr() - __rhs.eback())); + else + this->setg((char_type*)__extbuf_, + (char_type*)__extbuf_ + (__rhs.gptr() - __rhs.eback()), + (char_type*)__extbuf_ + (__rhs.egptr() - __rhs.eback())); + } + __rhs.__extbuf_ = 0; + __rhs.__extbufnext_ = 0; + __rhs.__extbufend_ = 0; + __rhs.__ebs_ = 0; + __rhs.__intbuf_ = 0; + __rhs.__ibs_ = 0; + __rhs.__file_ = 0; + __rhs.__st_ = state_type(); + __rhs.__om_ = 0; + __rhs.__cm_ = 0; + __rhs.__owns_eb_ = false; + __rhs.__owns_ib_ = false; + __rhs.setg(0, 0, 0); + __rhs.setp(0, 0); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_filebuf<_CharT, _Traits>& +basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs) +{ + close(); + swap(__rhs); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +basic_filebuf<_CharT, _Traits>::~basic_filebuf() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + close(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + if (__owns_eb_) + delete [] __extbuf_; + if (__owns_ib_) + delete [] __intbuf_; +} + +template <class _CharT, class _Traits> +void +basic_filebuf<_CharT, _Traits>::swap(basic_filebuf& __rhs) +{ + basic_streambuf<char_type, traits_type>::swap(__rhs); + if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_) + { + _VSTD::swap(__extbuf_, __rhs.__extbuf_); + _VSTD::swap(__extbufnext_, __rhs.__extbufnext_); + _VSTD::swap(__extbufend_, __rhs.__extbufend_); + } + else + { + ptrdiff_t __ln = __extbufnext_ - __extbuf_; + ptrdiff_t __le = __extbufend_ - __extbuf_; + ptrdiff_t __rn = __rhs.__extbufnext_ - __rhs.__extbuf_; + ptrdiff_t __re = __rhs.__extbufend_ - __rhs.__extbuf_; + if (__extbuf_ == __extbuf_min_ && __rhs.__extbuf_ != __rhs.__extbuf_min_) + { + __extbuf_ = __rhs.__extbuf_; + __rhs.__extbuf_ = __rhs.__extbuf_min_; + } + else if (__extbuf_ != __extbuf_min_ && __rhs.__extbuf_ == __rhs.__extbuf_min_) + { + __rhs.__extbuf_ = __extbuf_; + __extbuf_ = __extbuf_min_; + } + __extbufnext_ = __extbuf_ + __rn; + __extbufend_ = __extbuf_ + __re; + __rhs.__extbufnext_ = __rhs.__extbuf_ + __ln; + __rhs.__extbufend_ = __rhs.__extbuf_ + __le; + } + _VSTD::swap(__ebs_, __rhs.__ebs_); + _VSTD::swap(__intbuf_, __rhs.__intbuf_); + _VSTD::swap(__ibs_, __rhs.__ibs_); + _VSTD::swap(__file_, __rhs.__file_); + _VSTD::swap(__cv_, __rhs.__cv_); + _VSTD::swap(__st_, __rhs.__st_); + _VSTD::swap(__om_, __rhs.__om_); + _VSTD::swap(__cm_, __rhs.__cm_); + _VSTD::swap(__owns_eb_, __rhs.__owns_eb_); + _VSTD::swap(__owns_ib_, __rhs.__owns_ib_); + _VSTD::swap(__always_noconv_, __rhs.__always_noconv_); + if (this->eback() == (char_type*)__rhs.__extbuf_min_) + { + ptrdiff_t __n = this->gptr() - this->eback(); + ptrdiff_t __e = this->egptr() - this->eback(); + this->setg((char_type*)__extbuf_min_, + (char_type*)__extbuf_min_ + __n, + (char_type*)__extbuf_min_ + __e); + } + else if (this->pbase() == (char_type*)__rhs.__extbuf_min_) + { + ptrdiff_t __n = this->pptr() - this->pbase(); + ptrdiff_t __e = this->epptr() - this->pbase(); + this->setp((char_type*)__extbuf_min_, + (char_type*)__extbuf_min_ + __e); + this->pbump(__n); + } + if (__rhs.eback() == (char_type*)__extbuf_min_) + { + ptrdiff_t __n = __rhs.gptr() - __rhs.eback(); + ptrdiff_t __e = __rhs.egptr() - __rhs.eback(); + __rhs.setg((char_type*)__rhs.__extbuf_min_, + (char_type*)__rhs.__extbuf_min_ + __n, + (char_type*)__rhs.__extbuf_min_ + __e); + } + else if (__rhs.pbase() == (char_type*)__extbuf_min_) + { + ptrdiff_t __n = __rhs.pptr() - __rhs.pbase(); + ptrdiff_t __e = __rhs.epptr() - __rhs.pbase(); + __rhs.setp((char_type*)__rhs.__extbuf_min_, + (char_type*)__rhs.__extbuf_min_ + __e); + __rhs.pbump(__n); + } +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_filebuf<_CharT, _Traits>& __x, basic_filebuf<_CharT, _Traits>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +basic_filebuf<_CharT, _Traits>::is_open() const +{ + return __file_ != 0; +} + +template <class _CharT, class _Traits> +basic_filebuf<_CharT, _Traits>* +basic_filebuf<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) +{ + basic_filebuf<_CharT, _Traits>* __rt = 0; + if (__file_ == 0) + { + __rt = this; + const char* __mdstr; + switch (__mode & ~ios_base::ate) + { + case ios_base::out: + case ios_base::out | ios_base::trunc: + __mdstr = "w"; + break; + case ios_base::out | ios_base::app: + case ios_base::app: + __mdstr = "a"; + break; + case ios_base::in: + __mdstr = "r"; + break; + case ios_base::in | ios_base::out: + __mdstr = "r+"; + break; + case ios_base::in | ios_base::out | ios_base::trunc: + __mdstr = "w+"; + break; + case ios_base::in | ios_base::out | ios_base::app: + case ios_base::in | ios_base::app: + __mdstr = "a+"; + break; + case ios_base::out | ios_base::binary: + case ios_base::out | ios_base::trunc | ios_base::binary: + __mdstr = "wb"; + break; + case ios_base::out | ios_base::app | ios_base::binary: + case ios_base::app | ios_base::binary: + __mdstr = "ab"; + break; + case ios_base::in | ios_base::binary: + __mdstr = "rb"; + break; + case ios_base::in | ios_base::out | ios_base::binary: + __mdstr = "r+b"; + break; + case ios_base::in | ios_base::out | ios_base::trunc | ios_base::binary: + __mdstr = "w+b"; + break; + case ios_base::in | ios_base::out | ios_base::app | ios_base::binary: + case ios_base::in | ios_base::app | ios_base::binary: + __mdstr = "a+b"; + break; + default: + __rt = 0; + break; + } + if (__rt) + { + __file_ = fopen(__s, __mdstr); + if (__file_) + { + __om_ = __mode; + if (__mode & ios_base::ate) + { + if (fseek(__file_, 0, SEEK_END)) + { + fclose(__file_); + __file_ = 0; + __rt = 0; + } + } + } + else + __rt = 0; + } + } + return __rt; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_filebuf<_CharT, _Traits>* +basic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) +{ + return open(__s.c_str(), __mode); +} + +template <class _CharT, class _Traits> +basic_filebuf<_CharT, _Traits>* +basic_filebuf<_CharT, _Traits>::close() +{ + basic_filebuf<_CharT, _Traits>* __rt = 0; + if (__file_) + { + __rt = this; + unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose); + if (sync()) + __rt = 0; + if (fclose(__h.release()) == 0) + __file_ = 0; + else + __rt = 0; + } + return __rt; +} + +template <class _CharT, class _Traits> +typename basic_filebuf<_CharT, _Traits>::int_type +basic_filebuf<_CharT, _Traits>::underflow() +{ + if (__file_ == 0) + return traits_type::eof(); + bool __initial = __read_mode(); + char_type __1buf; + if (this->gptr() == 0) + this->setg(&__1buf, &__1buf+1, &__1buf+1); + const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4); + int_type __c = traits_type::eof(); + if (this->gptr() == this->egptr()) + { + memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type)); + if (__always_noconv_) + { + size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz); + __nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_); + if (__nmemb != 0) + { + this->setg(this->eback(), + this->eback() + __unget_sz, + this->eback() + __unget_sz + __nmemb); + __c = traits_type::to_int_type(*this->gptr()); + } + } + else + { + memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_); + __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_); + __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_); + size_t __nmemb = _VSTD::min(static_cast<size_t>(this->egptr() - this->eback() - __unget_sz), + static_cast<size_t>(__extbufend_ - __extbufnext_)); + codecvt_base::result __r; + state_type __svs = __st_; + size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_); + if (__nr != 0) + { + __extbufend_ = __extbufnext_ + __nr; + char_type* __inext; + __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, + this->eback() + __unget_sz, + this->egptr(), __inext); + if (__r == codecvt_base::noconv) + { + this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_); + __c = traits_type::to_int_type(*this->gptr()); + } + else if (__inext != this->eback() + __unget_sz) + { + this->setg(this->eback(), this->eback() + __unget_sz, __inext); + __c = traits_type::to_int_type(*this->gptr()); + } + } + } + } + else + __c = traits_type::to_int_type(*this->gptr()); + if (this->eback() == &__1buf) + this->setg(0, 0, 0); + return __c; +} + +template <class _CharT, class _Traits> +typename basic_filebuf<_CharT, _Traits>::int_type +basic_filebuf<_CharT, _Traits>::pbackfail(int_type __c) +{ + if (__file_ && this->eback() < this->gptr()) + { + if (traits_type::eq_int_type(__c, traits_type::eof())) + { + this->gbump(-1); + return traits_type::not_eof(__c); + } + if ((__om_ & ios_base::out) || + traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) + { + this->gbump(-1); + *this->gptr() = traits_type::to_char_type(__c); + return __c; + } + } + return traits_type::eof(); +} + +template <class _CharT, class _Traits> +typename basic_filebuf<_CharT, _Traits>::int_type +basic_filebuf<_CharT, _Traits>::overflow(int_type __c) +{ + if (__file_ == 0) + return traits_type::eof(); + __write_mode(); + char_type __1buf; + char_type* __pb_save = this->pbase(); + char_type* __epb_save = this->epptr(); + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + if (this->pptr() == 0) + this->setp(&__1buf, &__1buf+1); + *this->pptr() = traits_type::to_char_type(__c); + this->pbump(1); + } + if (this->pptr() != this->pbase()) + { + if (__always_noconv_) + { + size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); + if (fwrite(this->pbase(), sizeof(char_type), __nmemb, __file_) != __nmemb) + return traits_type::eof(); + } + else + { + char* __extbe = __extbuf_; + codecvt_base::result __r; + do + { + const char_type* __e; + __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, + __extbuf_, __extbuf_ + __ebs_, __extbe); + if (__e == this->pbase()) + return traits_type::eof(); + if (__r == codecvt_base::noconv) + { + size_t __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); + if (fwrite(this->pbase(), 1, __nmemb, __file_) != __nmemb) + return traits_type::eof(); + } + else if (__r == codecvt_base::ok || __r == codecvt_base::partial) + { + size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_); + if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb) + return traits_type::eof(); + if (__r == codecvt_base::partial) + { + this->setp((char_type*)__e, this->pptr()); + this->pbump(this->epptr() - this->pbase()); + } + } + else + return traits_type::eof(); + } while (__r == codecvt_base::partial); + } + this->setp(__pb_save, __epb_save); + } + return traits_type::not_eof(__c); +} + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>* +basic_filebuf<_CharT, _Traits>::setbuf(char_type* __s, streamsize __n) +{ + this->setg(0, 0, 0); + this->setp(0, 0); + if (__owns_eb_) + delete [] __extbuf_; + if (__owns_ib_) + delete [] __intbuf_; + __ebs_ = __n; + if (__ebs_ > sizeof(__extbuf_min_)) + { + if (__always_noconv_ && __s) + { + __extbuf_ = (char*)__s; + __owns_eb_ = false; + } + else + { + __extbuf_ = new char[__ebs_]; + __owns_eb_ = true; + } + } + else + { + __extbuf_ = __extbuf_min_; + __ebs_ = sizeof(__extbuf_min_); + __owns_eb_ = false; + } + if (!__always_noconv_) + { + __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_)); + if (__s && __ibs_ >= sizeof(__extbuf_min_)) + { + __intbuf_ = __s; + __owns_ib_ = false; + } + else + { + __intbuf_ = new char_type[__ibs_]; + __owns_ib_ = true; + } + } + else + { + __ibs_ = 0; + __intbuf_ = 0; + __owns_ib_ = false; + } + return this; +} + +template <class _CharT, class _Traits> +typename basic_filebuf<_CharT, _Traits>::pos_type +basic_filebuf<_CharT, _Traits>::seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode) +{ + int __width = __cv_->encoding(); + if (__file_ == 0 || (__width <= 0 && __off != 0) || sync()) + return pos_type(off_type(-1)); + // __width > 0 || __off == 0 + int __whence; + switch (__way) + { + case ios_base::beg: + __whence = SEEK_SET; + break; + case ios_base::cur: + __whence = SEEK_CUR; + break; + case ios_base::end: + __whence = SEEK_END; + break; + default: + return pos_type(off_type(-1)); + } + if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence)) + return pos_type(off_type(-1)); + pos_type __r = ftello(__file_); + __r.state(__st_); + return __r; +} + +template <class _CharT, class _Traits> +typename basic_filebuf<_CharT, _Traits>::pos_type +basic_filebuf<_CharT, _Traits>::seekpos(pos_type __sp, ios_base::openmode) +{ + if (__file_ == 0 || sync()) + return pos_type(off_type(-1)); + if (fseeko(__file_, __sp, SEEK_SET)) + return pos_type(off_type(-1)); + return __sp; +} + +template <class _CharT, class _Traits> +int +basic_filebuf<_CharT, _Traits>::sync() +{ + if (__file_ == 0) + return 0; + if (__cm_ & ios_base::out) + { + if (this->pptr() != this->pbase()) + if (overflow() == traits_type::eof()) + return -1; + codecvt_base::result __r; + do + { + char* __extbe; + __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe); + size_t __nmemb = static_cast<size_t>(__extbe - __extbuf_); + if (fwrite(__extbuf_, 1, __nmemb, __file_) != __nmemb) + return -1; + } while (__r == codecvt_base::partial); + if (__r == codecvt_base::error) + return -1; + if (fflush(__file_)) + return -1; + } + else if (__cm_ & ios_base::in) + { + off_type __c; + if (__always_noconv_) + __c = this->egptr() - this->gptr(); + else + { + int __width = __cv_->encoding(); + __c = __extbufend_ - __extbufnext_; + if (__width > 0) + __c += __width * (this->egptr() - this->gptr()); + else + { + if (this->gptr() != this->egptr()) + { + reverse(this->gptr(), this->egptr()); + codecvt_base::result __r; + const char_type* __e = this->gptr(); + char* __extbe; + do + { + __r = __cv_->out(__st_, __e, this->egptr(), __e, + __extbuf_, __extbuf_ + __ebs_, __extbe); + switch (__r) + { + case codecvt_base::noconv: + __c += this->egptr() - this->gptr(); + break; + case codecvt_base::ok: + case codecvt_base::partial: + __c += __extbe - __extbuf_; + break; + default: + return -1; + } + } while (__r == codecvt_base::partial); + } + } + } + if (fseeko(__file_, -__c, SEEK_CUR)) + return -1; + this->setg(0, 0, 0); + __cm_ = 0; + } + return 0; +} + +template <class _CharT, class _Traits> +void +basic_filebuf<_CharT, _Traits>::imbue(const locale& __loc) +{ + sync(); + __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); + bool __old_anc = __always_noconv_; + __always_noconv_ = __cv_->always_noconv(); + if (__old_anc != __always_noconv_) + { + this->setg(0, 0, 0); + this->setp(0, 0); + // invariant, char_type is char, else we couldn't get here + if (__always_noconv_) // need to dump __intbuf_ + { + if (__owns_eb_) + delete [] __extbuf_; + __owns_eb_ = __owns_ib_; + __ebs_ = __ibs_; + __extbuf_ = (char*)__intbuf_; + __ibs_ = 0; + __intbuf_ = 0; + __owns_ib_ = false; + } + else // need to obtain an __intbuf_. + { // If __extbuf_ is user-supplied, use it, else new __intbuf_ + if (!__owns_eb_ && __extbuf_ != __extbuf_min_) + { + __ibs_ = __ebs_; + __intbuf_ = (char_type*)__extbuf_; + __owns_ib_ = false; + __extbuf_ = new char[__ebs_]; + __owns_eb_ = true; + } + else + { + __ibs_ = __ebs_; + __intbuf_ = new char_type[__ibs_]; + __owns_ib_ = true; + } + } + } +} + +template <class _CharT, class _Traits> +bool +basic_filebuf<_CharT, _Traits>::__read_mode() +{ + if (!(__cm_ & ios_base::in)) + { + this->setp(0, 0); + if (__always_noconv_) + this->setg((char_type*)__extbuf_, + (char_type*)__extbuf_ + __ebs_, + (char_type*)__extbuf_ + __ebs_); + else + this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_); + __cm_ = ios_base::in; + return true; + } + return false; +} + +template <class _CharT, class _Traits> +void +basic_filebuf<_CharT, _Traits>::__write_mode() +{ + if (!(__cm_ & ios_base::out)) + { + this->setg(0, 0, 0); + if (__ebs_ > sizeof(__extbuf_min_)) + { + if (__always_noconv_) + this->setp((char_type*)__extbuf_, + (char_type*)__extbuf_ + (__ebs_ - 1)); + else + this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1)); + } + else + this->setp(0, 0); + __cm_ = ios_base::out; + } +} + +// basic_ifstream + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_ifstream + : public basic_istream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_ifstream(); + explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in); + explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_ifstream(basic_ifstream&& __rhs); +#endif + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_ifstream& operator=(basic_ifstream&& __rhs); +#endif + void swap(basic_ifstream& __rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* __s, ios_base::openmode __mode = ios_base::in); + void open(const string& __s, ios_base::openmode __mode = ios_base::in); + void close(); + +private: + basic_filebuf<char_type, traits_type> __sb_; +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ifstream<_CharT, _Traits>::basic_ifstream() + : basic_istream<char_type, traits_type>(&__sb_) +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ifstream<_CharT, _Traits>::basic_ifstream(const char* __s, ios_base::openmode __mode) + : basic_istream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode | ios_base::in) == 0) + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ifstream<_CharT, _Traits>::basic_ifstream(const string& __s, ios_base::openmode __mode) + : basic_istream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode | ios_base::in) == 0) + this->setstate(ios_base::failbit); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ifstream<_CharT, _Traits>::basic_ifstream(basic_ifstream&& __rhs) + : basic_istream<char_type, traits_type>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + this->set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ifstream<_CharT, _Traits>& +basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs) +{ + basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ifstream<_CharT, _Traits>::swap(basic_ifstream& __rhs) +{ + basic_istream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_ifstream<_CharT, _Traits>& __x, basic_ifstream<_CharT, _Traits>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_filebuf<_CharT, _Traits>* +basic_ifstream<_CharT, _Traits>::rdbuf() const +{ + return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +basic_ifstream<_CharT, _Traits>::is_open() const +{ + return __sb_.is_open(); +} + +template <class _CharT, class _Traits> +void +basic_ifstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode | ios_base::in)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +void +basic_ifstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode | ios_base::in)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ifstream<_CharT, _Traits>::close() +{ + if (__sb_.close() == 0) + this->setstate(ios_base::failbit); +} + +// basic_ofstream + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_ofstream + : public basic_ostream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_ofstream(); + explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out); + explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_ofstream(basic_ofstream&& __rhs); +#endif + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_ofstream& operator=(basic_ofstream&& __rhs); +#endif + void swap(basic_ofstream& __rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* __s, ios_base::openmode __mode = ios_base::out); + void open(const string& __s, ios_base::openmode __mode = ios_base::out); + void close(); + +private: + basic_filebuf<char_type, traits_type> __sb_; +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ofstream<_CharT, _Traits>::basic_ofstream() + : basic_ostream<char_type, traits_type>(&__sb_) +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ofstream<_CharT, _Traits>::basic_ofstream(const char* __s, ios_base::openmode __mode) + : basic_ostream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode | ios_base::out) == 0) + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ofstream<_CharT, _Traits>::basic_ofstream(const string& __s, ios_base::openmode __mode) + : basic_ostream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode | ios_base::out) == 0) + this->setstate(ios_base::failbit); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ofstream<_CharT, _Traits>::basic_ofstream(basic_ofstream&& __rhs) + : basic_ostream<char_type, traits_type>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + this->set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ofstream<_CharT, _Traits>& +basic_ofstream<_CharT, _Traits>::operator=(basic_ofstream&& __rhs) +{ + basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ofstream<_CharT, _Traits>::swap(basic_ofstream& __rhs) +{ + basic_ostream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_ofstream<_CharT, _Traits>& __x, basic_ofstream<_CharT, _Traits>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_filebuf<_CharT, _Traits>* +basic_ofstream<_CharT, _Traits>::rdbuf() const +{ + return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +basic_ofstream<_CharT, _Traits>::is_open() const +{ + return __sb_.is_open(); +} + +template <class _CharT, class _Traits> +void +basic_ofstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode | ios_base::out)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +void +basic_ofstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode | ios_base::out)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ofstream<_CharT, _Traits>::close() +{ + if (__sb_.close() == 0) + this->setstate(ios_base::failbit); +} + +// basic_fstream + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_fstream + : public basic_iostream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + basic_fstream(); + explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); + explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_fstream(basic_fstream&& __rhs); +#endif + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_fstream& operator=(basic_fstream&& __rhs); +#endif + void swap(basic_fstream& __rhs); + + basic_filebuf<char_type, traits_type>* rdbuf() const; + bool is_open() const; + void open(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); + void open(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); + void close(); + +private: + basic_filebuf<char_type, traits_type> __sb_; +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_fstream<_CharT, _Traits>::basic_fstream() + : basic_iostream<char_type, traits_type>(&__sb_) +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_fstream<_CharT, _Traits>::basic_fstream(const char* __s, ios_base::openmode __mode) + : basic_iostream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode) == 0) + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_fstream<_CharT, _Traits>::basic_fstream(const string& __s, ios_base::openmode __mode) + : basic_iostream<char_type, traits_type>(&__sb_) +{ + if (__sb_.open(__s, __mode) == 0) + this->setstate(ios_base::failbit); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_fstream<_CharT, _Traits>::basic_fstream(basic_fstream&& __rhs) + : basic_iostream<char_type, traits_type>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + this->set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_fstream<_CharT, _Traits>& +basic_fstream<_CharT, _Traits>::operator=(basic_fstream&& __rhs) +{ + basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_fstream<_CharT, _Traits>::swap(basic_fstream& __rhs) +{ + basic_iostream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_fstream<_CharT, _Traits>& __x, basic_fstream<_CharT, _Traits>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_filebuf<_CharT, _Traits>* +basic_fstream<_CharT, _Traits>::rdbuf() const +{ + return const_cast<basic_filebuf<char_type, traits_type>*>(&__sb_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +basic_fstream<_CharT, _Traits>::is_open() const +{ + return __sb_.is_open(); +} + +template <class _CharT, class _Traits> +void +basic_fstream<_CharT, _Traits>::open(const char* __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +void +basic_fstream<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) +{ + if (__sb_.open(__s, __mode)) + this->clear(); + else + this->setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_fstream<_CharT, _Traits>::close() +{ + if (__sb_.close() == 0) + this->setstate(ios_base::failbit); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FSTREAM diff --git a/contrib/libc++/include/functional b/contrib/libc++/include/functional new file mode 100644 index 0000000..884a577 --- /dev/null +++ b/contrib/libc++/include/functional @@ -0,0 +1,2020 @@ +// -*- C++ -*- +//===------------------------ functional ----------------------------------===// +// +// 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_FUNCTIONAL +#define _LIBCPP_FUNCTIONAL + +/* + functional synopsis + +namespace std +{ + +template <class Arg, class Result> +struct unary_function +{ + typedef Arg argument_type; + typedef Result result_type; +}; + +template <class Arg1, class Arg2, class Result> +struct binary_function +{ + typedef Arg1 first_argument_type; + typedef Arg2 second_argument_type; + typedef Result result_type; +}; + +template <class T> +class reference_wrapper + : public unary_function<T1, R> // if wrapping a unary functor + : public binary_function<T1, T2, R> // if wraping a binary functor +{ +public: + // types + typedef T type; + typedef see below result_type; // Not always defined + + // construct/copy/destroy + reference_wrapper(T&) noexcept; + reference_wrapper(T&&) = delete; // do not bind to temps + reference_wrapper(const reference_wrapper<T>& x) noexcept; + + // assignment + reference_wrapper& operator=(const reference_wrapper<T>& x) noexcept; + + // access + operator T& () const noexcept; + T& get() const noexcept; + + // invoke + template <class... ArgTypes> + typename result_of<T(ArgTypes...)>::type + operator() (ArgTypes&&...) const; +}; + +template <class T> reference_wrapper<T> ref(T& t) noexcept; +template <class T> void ref(const T&& t) = delete; +template <class T> reference_wrapper<T> ref(reference_wrapper<T>t) noexcept; + +template <class T> reference_wrapper<const T> cref(const T& t) noexcept; +template <class T> void cref(const T&& t) = delete; +template <class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept; + +template <class T> +struct plus : binary_function<T, T, T> +{ + T operator()(const T& x, const T& y) const; +}; + +template <class T> +struct minus : binary_function<T, T, T> +{ + T operator()(const T& x, const T& y) const; +}; + +template <class T> +struct multiplies : binary_function<T, T, T> +{ + T operator()(const T& x, const T& y) const; +}; + +template <class T> +struct divides : binary_function<T, T, T> +{ + T operator()(const T& x, const T& y) const; +}; + +template <class T> +struct modulus : binary_function<T, T, T> +{ + T operator()(const T& x, const T& y) const; +}; + +template <class T> +struct negate : unary_function<T, T> +{ + T operator()(const T& x) const; +}; + +template <class T> +struct equal_to : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct not_equal_to : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct greater : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct less : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct greater_equal : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct less_equal : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct logical_and : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct logical_or : binary_function<T, T, bool> +{ + bool operator()(const T& x, const T& y) const; +}; + +template <class T> +struct logical_not : unary_function<T, bool> +{ + bool operator()(const T& x) const; +}; + +template <class Predicate> +class unary_negate + : public unary_function<typename Predicate::argument_type, bool> +{ +public: + explicit unary_negate(const Predicate& pred); + bool operator()(const typename Predicate::argument_type& x) const; +}; + +template <class Predicate> unary_negate<Predicate> not1(const Predicate& pred); + +template <class Predicate> +class binary_negate + : public binary_function<typename Predicate::first_argument_type, + typename Predicate::second_argument_type, + bool> +{ +public: + explicit binary_negate(const Predicate& pred); + bool operator()(const typename Predicate::first_argument_type& x, + const typename Predicate::second_argument_type& y) const; +}; + +template <class Predicate> binary_negate<Predicate> not2(const Predicate& pred); + +template<class T> struct is_bind_expression; +template<class T> struct is_placeholder; + +template<class Fn, class... BoundArgs> + unspecified bind(Fn&&, BoundArgs&&...); +template<class R, class Fn, class... BoundArgs> + unspecified bind(Fn&&, BoundArgs&&...); + +namespace placeholders { + // M is the implementation-defined number of placeholders + extern unspecified _1; + extern unspecified _2; + . + . + . + extern unspecified _Mp; +} + +template <class Operation> +class binder1st + : public unary_function<typename Operation::second_argument_type, + typename Operation::result_type> +{ +protected: + Operation op; + typename Operation::first_argument_type value; +public: + binder1st(const Operation& x, const typename Operation::first_argument_type y); + typename Operation::result_type operator()( typename Operation::second_argument_type& x) const; + typename Operation::result_type operator()(const typename Operation::second_argument_type& x) const; +}; + +template <class Operation, class T> +binder1st<Operation> bind1st(const Operation& op, const T& x); + +template <class Operation> +class binder2nd + : public unary_function<typename Operation::first_argument_type, + typename Operation::result_type> +{ +protected: + Operation op; + typename Operation::second_argument_type value; +public: + binder2nd(const Operation& x, const typename Operation::second_argument_type y); + typename Operation::result_type operator()( typename Operation::first_argument_type& x) const; + typename Operation::result_type operator()(const typename Operation::first_argument_type& x) const; +}; + +template <class Operation, class T> +binder2nd<Operation> bind2nd(const Operation& op, const T& x); + +template <class Arg, class Result> +class pointer_to_unary_function : public unary_function<Arg, Result> +{ +public: + explicit pointer_to_unary_function(Result (*f)(Arg)); + Result operator()(Arg x) const; +}; + +template <class Arg, class Result> +pointer_to_unary_function<Arg,Result> ptr_fun(Result (*f)(Arg)); + +template <class Arg1, class Arg2, class Result> +class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> +{ +public: + explicit pointer_to_binary_function(Result (*f)(Arg1, Arg2)); + Result operator()(Arg1 x, Arg2 y) const; +}; + +template <class Arg1, class Arg2, class Result> +pointer_to_binary_function<Arg1,Arg2,Result> ptr_fun(Result (*f)(Arg1,Arg2)); + +template<class S, class T> +class mem_fun_t : public unary_function<T*, S> +{ +public: + explicit mem_fun_t(S (T::*p)()); + S operator()(T* p) const; +}; + +template<class S, class T, class A> +class mem_fun1_t : public binary_function<T*, A, S> +{ +public: + explicit mem_fun1_t(S (T::*p)(A)); + S operator()(T* p, A x) const; +}; + +template<class S, class T> mem_fun_t<S,T> mem_fun(S (T::*f)()); +template<class S, class T, class A> mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A)); + +template<class S, class T> +class mem_fun_ref_t : public unary_function<T, S> +{ +public: + explicit mem_fun_ref_t(S (T::*p)()); + S operator()(T& p) const; +}; + +template<class S, class T, class A> +class mem_fun1_ref_t : public binary_function<T, A, S> +{ +public: + explicit mem_fun1_ref_t(S (T::*p)(A)); + S operator()(T& p, A x) const; +}; + +template<class S, class T> mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()); +template<class S, class T, class A> mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A)); + +template <class S, class T> +class const_mem_fun_t : public unary_function<const T*, S> +{ +public: + explicit const_mem_fun_t(S (T::*p)() const); + S operator()(const T* p) const; +}; + +template <class S, class T, class A> +class const_mem_fun1_t : public binary_function<const T*, A, S> +{ +public: + explicit const_mem_fun1_t(S (T::*p)(A) const); + S operator()(const T* p, A x) const; +}; + +template <class S, class T> const_mem_fun_t<S,T> mem_fun(S (T::*f)() const); +template <class S, class T, class A> const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A) const); + +template <class S, class T> +class const_mem_fun_ref_t : public unary_function<T, S> +{ +public: + explicit const_mem_fun_ref_t(S (T::*p)() const); + S operator()(const T& p) const; +}; + +template <class S, class T, class A> +class const_mem_fun1_ref_t : public binary_function<T, A, S> +{ +public: + explicit const_mem_fun1_ref_t(S (T::*p)(A) const); + S operator()(const T& p, A x) const; +}; + +template <class S, class T> const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const); +template <class S, class T, class A> const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A) const); + +template<class R, class T> unspecified mem_fn(R T::*); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...)); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) &); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const &); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile &); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile &); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) &&); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const &&); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) volatile &&); +template<class R, class T, class... Args> unspecified mem_fn(R (T::*)(Args...) const volatile &&); + +class bad_function_call + : public exception +{ +}; + +template<class> class function; // undefined + +template<class R, class... ArgTypes> +class function<R(ArgTypes...)> + : public unary_function<T1, R> // iff sizeof...(ArgTypes) == 1 and + // ArgTypes contains T1 + : public binary_function<T1, T2, R> // iff sizeof...(ArgTypes) == 2 and + // ArgTypes contains T1 and T2 +{ +public: + typedef R result_type; + + // construct/copy/destroy: + function() noexcept; + function(nullptr_t) noexcept; + function(const function&); + function(function&&) noexcept; + template<class F> + function(F); + template<Allocator Alloc> + function(allocator_arg_t, const Alloc&) noexcept; + template<Allocator Alloc> + function(allocator_arg_t, const Alloc&, nullptr_t) noexcept; + template<Allocator Alloc> + function(allocator_arg_t, const Alloc&, const function&); + template<Allocator Alloc> + function(allocator_arg_t, const Alloc&, function&&); + template<class F, Allocator Alloc> + function(allocator_arg_t, const Alloc&, F); + + function& operator=(const function&); + function& operator=(function&&) noexcept; + function& operator=(nullptr_t) noexcept; + template<class F> + function& operator=(F&&); + template<class F> + function& operator=(reference_wrapper<F>) noexcept; + + ~function(); + + // function modifiers: + void swap(function&) noexcept; + template<class F, class Alloc> + void assign(F&&, const Alloc&); + + // function capacity: + explicit operator bool() const noexcept; + + // function invocation: + R operator()(ArgTypes...) const; + + // function target access: + const std::type_info& target_type() const noexcept; + template <typename T> T* target() noexcept; + template <typename T> const T* target() const noexcept; +}; + +// Null pointer comparisons: +template <class R, class ... ArgTypes> + bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept; + +template <class R, class ... ArgTypes> + bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept; + +template <class R, class ... ArgTypes> + bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept; + +template <class R, class ... ArgTypes> + bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept; + +// specialized algorithms: +template <class R, class ... ArgTypes> + void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept; + +template <class T> struct hash; + +template <> struct hash<bool>; +template <> struct hash<char>; +template <> struct hash<signed char>; +template <> struct hash<unsigned char>; +template <> struct hash<char16_t>; +template <> struct hash<char32_t>; +template <> struct hash<wchar_t>; +template <> struct hash<short>; +template <> struct hash<unsigned short>; +template <> struct hash<int>; +template <> struct hash<unsigned int>; +template <> struct hash<long>; +template <> struct hash<long long>; +template <> struct hash<unsigned long>; +template <> struct hash<unsigned long long>; + +template <> struct hash<float>; +template <> struct hash<double>; +template <> struct hash<long double>; + +template<class T> struct hash<T*>; + +} // std + +POLICY: For non-variadic implementations, the number of arguments is limited + to 3. It is hoped that the need for non-variadic implementations + will be minimal. + +*/ + +#include <__config> +#include <type_traits> +#include <typeinfo> +#include <exception> +#include <memory> +#include <tuple> + +#include <__functional_base> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp> +struct _LIBCPP_VISIBLE plus : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x + __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE minus : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x - __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE multiplies : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x * __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE divides : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x / __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE modulus : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x % __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE negate : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x) const + {return -__x;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE equal_to : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x == __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE not_equal_to : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x != __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE greater : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x > __y;} +}; + +// less in <__functional_base> + +template <class _Tp> +struct _LIBCPP_VISIBLE greater_equal : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x >= __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE less_equal : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x <= __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE logical_and : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x && __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE logical_or : binary_function<_Tp, _Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x || __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE logical_not : unary_function<_Tp, bool> +{ + _LIBCPP_INLINE_VISIBILITY bool operator()(const _Tp& __x) const + {return !__x;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE bit_and : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x & __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE bit_or : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x | __y;} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE bit_xor : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x ^ __y;} +}; + +template <class _Predicate> +class _LIBCPP_VISIBLE unary_negate + : public unary_function<typename _Predicate::argument_type, bool> +{ + _Predicate __pred_; +public: + _LIBCPP_INLINE_VISIBILITY explicit unary_negate(const _Predicate& __pred) + : __pred_(__pred) {} + _LIBCPP_INLINE_VISIBILITY bool operator()(const typename _Predicate::argument_type& __x) const + {return !__pred_(__x);} +}; + +template <class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +unary_negate<_Predicate> +not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);} + +template <class _Predicate> +class _LIBCPP_VISIBLE binary_negate + : public binary_function<typename _Predicate::first_argument_type, + typename _Predicate::second_argument_type, + bool> +{ + _Predicate __pred_; +public: + _LIBCPP_INLINE_VISIBILITY explicit binary_negate(const _Predicate& __pred) + : __pred_(__pred) {} + _LIBCPP_INLINE_VISIBILITY bool operator()(const typename _Predicate::first_argument_type& __x, + const typename _Predicate::second_argument_type& __y) const + {return !__pred_(__x, __y);} +}; + +template <class _Predicate> +inline _LIBCPP_INLINE_VISIBILITY +binary_negate<_Predicate> +not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);} + +template <class __Operation> +class _LIBCPP_VISIBLE binder1st + : public unary_function<typename __Operation::second_argument_type, + typename __Operation::result_type> +{ +protected: + __Operation op; + typename __Operation::first_argument_type value; +public: + _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x, + const typename __Operation::first_argument_type __y) + : op(__x), value(__y) {} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (typename __Operation::second_argument_type& __x) const + {return op(value, __x);} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (const typename __Operation::second_argument_type& __x) const + {return op(value, __x);} +}; + +template <class __Operation, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +binder1st<__Operation> +bind1st(const __Operation& __op, const _Tp& __x) + {return binder1st<__Operation>(__op, __x);} + +template <class __Operation> +class _LIBCPP_VISIBLE binder2nd + : public unary_function<typename __Operation::first_argument_type, + typename __Operation::result_type> +{ +protected: + __Operation op; + typename __Operation::second_argument_type value; +public: + _LIBCPP_INLINE_VISIBILITY + binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y) + : op(__x), value(__y) {} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + ( typename __Operation::first_argument_type& __x) const + {return op(__x, value);} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (const typename __Operation::first_argument_type& __x) const + {return op(__x, value);} +}; + +template <class __Operation, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +binder2nd<__Operation> +bind2nd(const __Operation& __op, const _Tp& __x) + {return binder2nd<__Operation>(__op, __x);} + +template <class _Arg, class _Result> +class _LIBCPP_VISIBLE pointer_to_unary_function + : public unary_function<_Arg, _Result> +{ + _Result (*__f_)(_Arg); +public: + _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg)) + : __f_(__f) {} + _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const + {return __f_(__x);} +}; + +template <class _Arg, class _Result> +inline _LIBCPP_INLINE_VISIBILITY +pointer_to_unary_function<_Arg,_Result> +ptr_fun(_Result (*__f)(_Arg)) + {return pointer_to_unary_function<_Arg,_Result>(__f);} + +template <class _Arg1, class _Arg2, class _Result> +class _LIBCPP_VISIBLE pointer_to_binary_function + : public binary_function<_Arg1, _Arg2, _Result> +{ + _Result (*__f_)(_Arg1, _Arg2); +public: + _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2)) + : __f_(__f) {} + _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const + {return __f_(__x, __y);} +}; + +template <class _Arg1, class _Arg2, class _Result> +inline _LIBCPP_INLINE_VISIBILITY +pointer_to_binary_function<_Arg1,_Arg2,_Result> +ptr_fun(_Result (*__f)(_Arg1,_Arg2)) + {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);} + +template<class _Sp, class _Tp> +class _LIBCPP_VISIBLE mem_fun_t : public unary_function<_Tp*, _Sp> +{ + _Sp (_Tp::*__p_)(); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)()) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const + {return (__p->*__p_)();} +}; + +template<class _Sp, class _Tp, class _Ap> +class _LIBCPP_VISIBLE mem_fun1_t : public binary_function<_Tp*, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const + {return (__p->*__p_)(__x);} +}; + +template<class _Sp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +mem_fun_t<_Sp,_Tp> +mem_fun(_Sp (_Tp::*__f)()) + {return mem_fun_t<_Sp,_Tp>(__f);} + +template<class _Sp, class _Tp, class _Ap> +inline _LIBCPP_INLINE_VISIBILITY +mem_fun1_t<_Sp,_Tp,_Ap> +mem_fun(_Sp (_Tp::*__f)(_Ap)) + {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);} + +template<class _Sp, class _Tp> +class _LIBCPP_VISIBLE mem_fun_ref_t : public unary_function<_Tp, _Sp> +{ + _Sp (_Tp::*__p_)(); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const + {return (__p.*__p_)();} +}; + +template<class _Sp, class _Tp, class _Ap> +class _LIBCPP_VISIBLE mem_fun1_ref_t : public binary_function<_Tp, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const + {return (__p.*__p_)(__x);} +}; + +template<class _Sp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +mem_fun_ref_t<_Sp,_Tp> +mem_fun_ref(_Sp (_Tp::*__f)()) + {return mem_fun_ref_t<_Sp,_Tp>(__f);} + +template<class _Sp, class _Tp, class _Ap> +inline _LIBCPP_INLINE_VISIBILITY +mem_fun1_ref_t<_Sp,_Tp,_Ap> +mem_fun_ref(_Sp (_Tp::*__f)(_Ap)) + {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} + +template <class _Sp, class _Tp> +class _LIBCPP_VISIBLE const_mem_fun_t : public unary_function<const _Tp*, _Sp> +{ + _Sp (_Tp::*__p_)() const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const + {return (__p->*__p_)();} +}; + +template <class _Sp, class _Tp, class _Ap> +class _LIBCPP_VISIBLE const_mem_fun1_t : public binary_function<const _Tp*, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap) const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const + {return (__p->*__p_)(__x);} +}; + +template <class _Sp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun_t<_Sp,_Tp> +mem_fun(_Sp (_Tp::*__f)() const) + {return const_mem_fun_t<_Sp,_Tp>(__f);} + +template <class _Sp, class _Tp, class _Ap> +inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun1_t<_Sp,_Tp,_Ap> +mem_fun(_Sp (_Tp::*__f)(_Ap) const) + {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);} + +template <class _Sp, class _Tp> +class _LIBCPP_VISIBLE const_mem_fun_ref_t : public unary_function<_Tp, _Sp> +{ + _Sp (_Tp::*__p_)() const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const + {return (__p.*__p_)();} +}; + +template <class _Sp, class _Tp, class _Ap> +class _LIBCPP_VISIBLE const_mem_fun1_ref_t + : public binary_function<_Tp, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap) const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const + {return (__p.*__p_)(__x);} +}; + +template <class _Sp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun_ref_t<_Sp,_Tp> +mem_fun_ref(_Sp (_Tp::*__f)() const) + {return const_mem_fun_ref_t<_Sp,_Tp>(__f);} + +template <class _Sp, class _Tp, class _Ap> +inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun1_ref_t<_Sp,_Tp,_Ap> +mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const) + {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} + +#ifdef _LIBCPP_HAS_NO_VARIADICS + +#include <__functional_03> + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp> +class __mem_fn + : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type __f_; + +public: + _LIBCPP_INLINE_VISIBILITY __mem_fn(type __f) : __f_(__f) {} + + // invoke + template <class... _ArgTypes> + _LIBCPP_INLINE_VISIBILITY + typename __invoke_return<type, _ArgTypes...>::type + operator() (_ArgTypes&&... __args) + { + return __invoke(__f_, _VSTD::forward<_ArgTypes>(__args)...); + } +}; + +template<class _Rp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp _Tp::*> +mem_fn(_Rp _Tp::* __pm) +{ + return __mem_fn<_Rp _Tp::*>(__pm); +} + +template<class _Rp, class _Tp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_Args...)> +mem_fn(_Rp (_Tp::* __pm)(_Args...)) +{ + return __mem_fn<_Rp (_Tp::*)(_Args...)>(__pm); +} + +template<class _Rp, class _Tp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_Args...) const> +mem_fn(_Rp (_Tp::* __pm)(_Args...) const) +{ + return __mem_fn<_Rp (_Tp::*)(_Args...) const>(__pm); +} + +template<class _Rp, class _Tp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_Args...) volatile> +mem_fn(_Rp (_Tp::* __pm)(_Args...) volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_Args...) volatile>(__pm); +} + +template<class _Rp, class _Tp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +__mem_fn<_Rp (_Tp::*)(_Args...) const volatile> +mem_fn(_Rp (_Tp::* __pm)(_Args...) const volatile) +{ + return __mem_fn<_Rp (_Tp::*)(_Args...) const volatile>(__pm); +} + +// bad_function_call + +class _LIBCPP_EXCEPTION_ABI bad_function_call + : public exception +{ +}; + +template<class _Fp> class _LIBCPP_VISIBLE function; // undefined + +namespace __function +{ + +template<class _Rp, class ..._ArgTypes> +struct __maybe_derive_from_unary_function +{ +}; + +template<class _Rp, class _A1> +struct __maybe_derive_from_unary_function<_Rp(_A1)> + : public unary_function<_A1, _Rp> +{ +}; + +template<class _Rp, class ..._ArgTypes> +struct __maybe_derive_from_binary_function +{ +}; + +template<class _Rp, class _A1, class _A2> +struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> + : public binary_function<_A1, _A2, _Rp> +{ +}; + +template<class _Fp> class __base; + +template<class _Rp, class ..._ArgTypes> +class __base<_Rp(_ArgTypes...)> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + _LIBCPP_INLINE_VISIBILITY __base() {} + _LIBCPP_INLINE_VISIBILITY virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() _NOEXCEPT = 0; + virtual void destroy_deallocate() _NOEXCEPT = 0; + virtual _Rp operator()(_ArgTypes&& ...) = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const _NOEXCEPT = 0; + virtual const std::type_info& target_type() const _NOEXCEPT = 0; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _FD, class _Alloc, class _FB> class __func; + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +class __func<_Fp, _Alloc, _Rp(_ArgTypes...)> + : public __base<_Rp(_ArgTypes...)> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __func(_Fp&& __f) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), + _VSTD::forward_as_tuple()) {} + _LIBCPP_INLINE_VISIBILITY + explicit __func(const _Fp& __f, const _Alloc& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), + _VSTD::forward_as_tuple(__a)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __func(const _Fp& __f, _Alloc&& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), + _VSTD::forward_as_tuple(_VSTD::move(__a))) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __func(_Fp&& __f, _Alloc&& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), + _VSTD::forward_as_tuple(_VSTD::move(__a))) {} + virtual __base<_Rp(_ArgTypes...)>* __clone() const; + virtual void __clone(__base<_Rp(_ArgTypes...)>*) const; + virtual void destroy() _NOEXCEPT; + virtual void destroy_deallocate() _NOEXCEPT; + virtual _Rp operator()(_ArgTypes&& ... __arg); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const _NOEXCEPT; + virtual const std::type_info& target_type() const _NOEXCEPT; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +__base<_Rp(_ArgTypes...)>* +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) __func(__f_.first(), _Alloc(__a)); + return __hold.release(); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const +{ + ::new (__p) __func(__f_.first(), __f_.second()); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT +{ + typedef typename _Alloc::template rebind<__func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +_Rp +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg) +{ + return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +const void* +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT +{ + if (__ti == typeid(_Fp)) + return &__f_.first(); + return (const void*)0; +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +const std::type_info& +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +} // __function + +template<class _Rp, class ..._ArgTypes> +class _LIBCPP_VISIBLE function<_Rp(_ArgTypes...)> + : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>, + public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)> +{ + typedef __function::__base<_Rp(_ArgTypes...)> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const _Fp&) {return true;} + template <class _R2, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (*__p)(_Ap...)) {return __p;} + template <class _R2, class _Cp, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_Ap...)) {return __p;} + template <class _R2, class _Cp, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_Ap...) const) {return __p;} + template <class _R2, class _Cp, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_Ap...) volatile) {return __p;} + template <class _R2, class _Cp, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(_R2 (_Cp::*__p)(_Ap...) const volatile) {return __p;} + template <class _R2, class ..._Ap> + _LIBCPP_INLINE_VISIBILITY + static bool __not_null(const function<_Rp(_Ap...)>& __p) {return __p;} + + template <class _Fp, bool = __invokable<_Fp&, _ArgTypes...>::value> + struct __callable; + template <class _Fp> + struct __callable<_Fp, true> + { + static const bool value = + is_convertible<typename __invoke_of<_Fp&, _ArgTypes...>::type, + _Rp>::value; + }; + template <class _Fp> + struct __callable<_Fp, false> + { + static const bool value = false; + }; +public: + typedef _Rp result_type; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + function() _NOEXCEPT : __f_(0) {} + _LIBCPP_INLINE_VISIBILITY + function(nullptr_t) _NOEXCEPT : __f_(0) {} + function(const function&); + function(function&&) _NOEXCEPT; + template<class _Fp> + function(_Fp, + typename enable_if<__callable<_Fp>::value>::type* = 0); + + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) _NOEXCEPT : __f_(0) {} + template<class _Alloc> + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT : __f_(0) {} + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, const function&); + template<class _Alloc> + function(allocator_arg_t, const _Alloc&, function&&); + template<class _Fp, class _Alloc> + function(allocator_arg_t, const _Alloc& __a, _Fp __f, + typename enable_if<__callable<_Fp>::value>::type* = 0); + + function& operator=(const function&); + function& operator=(function&&) _NOEXCEPT; + function& operator=(nullptr_t) _NOEXCEPT; + template<class _Fp> + typename enable_if + < + __callable<typename decay<_Fp>::type>::value, + function& + >::type + operator=(_Fp&&); + + ~function(); + + // function modifiers: + void swap(function&) _NOEXCEPT; + template<class _Fp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp&& __f, const _Alloc& __a) + {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);} + + // function capacity: + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return __f_;} + + // deleted overloads close possible hole in the type system + template<class _R2, class... _ArgTypes2> + bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete; + template<class _R2, class... _ArgTypes2> + bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete; +public: + // function invocation: + _Rp operator()(_ArgTypes...) const; + +#ifndef _LIBCPP_NO_RTTI + // function target access: + const std::type_info& target_type() const _NOEXCEPT; + template <typename _Tp> _Tp* target() _NOEXCEPT; + template <typename _Tp> const _Tp* target() const _NOEXCEPT; +#endif // _LIBCPP_NO_RTTI +}; + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>::function(const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class ..._ArgTypes> +template <class _Alloc> +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, + const function& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (const __base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); +} + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = 0; + } +} + +template<class _Rp, class ..._ArgTypes> +template <class _Alloc> +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, + function&& __f) +{ + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = 0; + } +} + +template<class _Rp, class ..._ArgTypes> +template <class _Fp> +function<_Rp(_ArgTypes...)>::function(_Fp __f, + typename enable_if<__callable<_Fp>::value>::type*) + : __f_(0) +{ + if (__not_null(__f)) + { + typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_ArgTypes...)> _FF; + if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(_VSTD::move(__f)); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(_VSTD::move(__f), allocator<_Fp>(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class ..._ArgTypes> +template <class _Fp, class _Alloc> +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f, + typename enable_if<__callable<_Fp>::value>::type*) + : __f_(0) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + if (__not_null(__f)) + { + typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _FF; + if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_Fp>::value) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(_VSTD::move(__f)); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a)); + __f_ = __hold.release(); + } + } +} + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; + if (__f.__f_ == 0) + __f_ = 0; + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__clone(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = 0; + } +} + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = 0; +} + +template<class _Rp, class ..._ArgTypes> +template <class _Fp> +typename enable_if +< + function<_Rp(_ArgTypes...)>::template __callable<typename decay<_Fp>::type>::value, + function<_Rp(_ArgTypes...)>& +>::type +function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f) +{ + function(_VSTD::forward<_Fp>(__f)).swap(*this); + return *this; +} + +template<class _Rp, class ..._ArgTypes> +function<_Rp(_ArgTypes...)>::~function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp, class ..._ArgTypes> +void +function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__clone(__t); + __f_->destroy(); + __f_ = 0; + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = 0; + __f_ = (__base*)&__buf_; + __t->__clone((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__clone((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__clone((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp, class ..._ArgTypes> +_Rp +function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__f_ == 0) + throw bad_function_call(); +#endif // _LIBCPP_NO_EXCEPTIONS + return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Rp, class ..._ArgTypes> +const std::type_info& +function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT +{ + if (__f_ == 0) + return typeid(void); + return __f_->target_type(); +} + +template<class _Rp, class ..._ArgTypes> +template <typename _Tp> +_Tp* +function<_Rp(_ArgTypes...)>::target() _NOEXCEPT +{ + if (__f_ == 0) + return (_Tp*)0; + return (_Tp*)__f_->target(typeid(_Tp)); +} + +template<class _Rp, class ..._ArgTypes> +template <typename _Tp> +const _Tp* +function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT +{ + if (__f_ == 0) + return (const _Tp*)0; + return (const _Tp*)__f_->target(typeid(_Tp)); +} + +#endif // _LIBCPP_NO_RTTI + +template <class _Rp, class... _ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;} + +template <class _Rp, class... _ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;} + +template <class _Rp, class... _ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;} + +template <class _Rp, class... _ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;} + +template <class _Rp, class... _ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT +{return __x.swap(__y);} + +template<class _Tp> struct __is_bind_expression : public false_type {}; +template<class _Tp> struct _LIBCPP_VISIBLE is_bind_expression + : public __is_bind_expression<typename remove_cv<_Tp>::type> {}; + +template<class _Tp> struct __is_placeholder : public integral_constant<int, 0> {}; +template<class _Tp> struct _LIBCPP_VISIBLE is_placeholder + : public __is_placeholder<typename remove_cv<_Tp>::type> {}; + +namespace placeholders +{ + +template <int _Np> struct __ph {}; + +extern __ph<1> _1; +extern __ph<2> _2; +extern __ph<3> _3; +extern __ph<4> _4; +extern __ph<5> _5; +extern __ph<6> _6; +extern __ph<7> _7; +extern __ph<8> _8; +extern __ph<9> _9; +extern __ph<10> _10; + +} // placeholders + +template<int _Np> +struct __is_placeholder<placeholders::__ph<_Np> > + : public integral_constant<int, _Np> {}; + +template <class _Tp, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +_Tp& +__mu(reference_wrapper<_Tp> __t, _Uj&) +{ + return __t.get(); +} + +template <class _Ti, class ..._Uj, size_t ..._Indx> +inline _LIBCPP_INLINE_VISIBILITY +typename __invoke_of<_Ti&, _Uj...>::type +__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>) +{ + return __ti(_VSTD::forward<_Uj>(get<_Indx>(__uj))...); +} + +template <class _Ti, class ..._Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_bind_expression<_Ti>::value, + typename __invoke_of<_Ti&, _Uj...>::type +>::type +__mu(_Ti& __ti, tuple<_Uj...>& __uj) +{ + typedef typename __make_tuple_indices<sizeof...(_Uj)>::type __indices; + return __mu_expand(__ti, __uj, __indices()); +} + +template <bool IsPh, class _Ti, class _Uj> +struct __mu_return2 {}; + +template <class _Ti, class _Uj> +struct __mu_return2<true, _Ti, _Uj> +{ + typedef typename tuple_element<is_placeholder<_Ti>::value - 1, _Uj>::type type; +}; + +template <class _Ti, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + 0 < is_placeholder<_Ti>::value, + typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type +>::type +__mu(_Ti&, _Uj& __uj) +{ + const size_t _Indx = is_placeholder<_Ti>::value - 1; + return _VSTD::forward<typename tuple_element<_Indx, _Uj>::type>(get<_Indx>(__uj)); +} + +template <class _Ti, class _Uj> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_bind_expression<_Ti>::value && + is_placeholder<_Ti>::value == 0 && + !__is_reference_wrapper<_Ti>::value, + _Ti& +>::type +__mu(_Ti& __ti, _Uj&) +{ + return __ti; +} + +template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh, + class _TupleUj> +struct ____mu_return; + +template <class _Ti, class ..._Uj> +struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> > +{ + typedef typename __invoke_of<_Ti&, _Uj...>::type type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, false, false, true, _TupleUj> +{ + typedef typename tuple_element<is_placeholder<_Ti>::value - 1, + _TupleUj>::type&& type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, true, false, false, _TupleUj> +{ + typedef typename _Ti::type& type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, false, false, false, _TupleUj> +{ + typedef _Ti& type; +}; + +template <class _Ti, class _TupleUj> +struct __mu_return + : public ____mu_return<_Ti, + __is_reference_wrapper<_Ti>::value, + is_bind_expression<_Ti>::value, + 0 < is_placeholder<_Ti>::value, + _TupleUj> +{ +}; + +template <class _Fp, class _BoundArgs, class _TupleUj> +struct __bind_return; + +template <class _Fp, class ..._BoundArgs, class _TupleUj> +struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj> +{ + typedef typename __invoke_of + < + _Fp&, + typename __mu_return + < + _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template <class _Fp, class ..._BoundArgs, class _TupleUj> +struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj> +{ + typedef typename __invoke_of + < + _Fp&, + typename __mu_return + < + const _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template <class _Fp, class _BoundArgs, size_t ..._Indx, class _Args> +inline _LIBCPP_INLINE_VISIBILITY +typename __bind_return<_Fp, _BoundArgs, _Args>::type +__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>, + _Args&& __args) +{ + return __invoke(__f, __mu(get<_Indx>(__bound_args), __args)...); +} + +template<class _Fp, class ..._BoundArgs> +class __bind + : public __weak_result_type<typename decay<_Fp>::type> +{ + typedef typename decay<_Fp>::type _Fd; + typedef tuple<typename decay<_BoundArgs>::type...> _Td; + _Fd __f_; + _Td __bound_args_; + + typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices; +public: +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __bind(const __bind& __b) + : __f_(__b.__f_), + __bound_args_(__b.__bound_args_) {} + + _LIBCPP_INLINE_VISIBILITY + __bind& operator=(const __bind& __b) + { + __f_ = __b.__f_; + __bound_args_ = __b.__bound_args_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __bind(__bind&& __b) + : __f_(_VSTD::move(__b.__f_)), + __bound_args_(_VSTD::move(__b.__bound_args_)) {} + + _LIBCPP_INLINE_VISIBILITY + __bind& operator=(__bind&& __b) + { + __f_ = _VSTD::move(__b.__f_); + __bound_args_ = _VSTD::move(__b.__bound_args_); + return *this; + } + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + template <class _Gp, class ..._BA> + _LIBCPP_INLINE_VISIBILITY + explicit __bind(_Gp&& __f, _BA&& ...__bound_args) + : __f_(_VSTD::forward<_Gp>(__f)), + __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} + + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type + operator()(_Args&& ...__args) + { + return __apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); + } + + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type + operator()(_Args&& ...__args) const + { + return __apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); + } +}; + +template<class _Fp, class ..._BoundArgs> +struct __is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {}; + +template<class _Rp, class _Fp, class ..._BoundArgs> +class __bind_r + : public __bind<_Fp, _BoundArgs...> +{ + typedef __bind<_Fp, _BoundArgs...> base; +public: + typedef _Rp result_type; + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __bind_r(const __bind_r& __b) + : base(_VSTD::forward<const base&>(__b)) {} + + _LIBCPP_INLINE_VISIBILITY + __bind_r& operator=(const __bind_r& __b) + { + base::operator=(_VSTD::forward<const base&>(__b)); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __bind_r(__bind_r&& __b) + : base(_VSTD::forward<base>(__b)) {} + + _LIBCPP_INLINE_VISIBILITY + __bind_r& operator=(__bind_r&& __b) + { + base::operator=(_VSTD::forward<base>(__b)); + return *this; + } + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + template <class _Gp, class ..._BA> + _LIBCPP_INLINE_VISIBILITY + explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args) + : base(_VSTD::forward<_Gp>(__f), + _VSTD::forward<_BA>(__bound_args)...) {} + + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + result_type + operator()(_Args&& ...__args) + { + return base::operator()(_VSTD::forward<_Args>(__args)...); + } + + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + result_type + operator()(_Args&& ...__args) const + { + return base::operator()(_VSTD::forward<_Args>(__args)...); + } +}; + +template<class _Rp, class _Fp, class ..._BoundArgs> +struct __is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {}; + +template<class _Fp, class ..._BoundArgs> +inline _LIBCPP_INLINE_VISIBILITY +__bind<_Fp, _BoundArgs...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind<_Fp, _BoundArgs...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} + +template<class _Rp, class _Fp, class ..._BoundArgs> +inline _LIBCPP_INLINE_VISIBILITY +__bind_r<_Rp, _Fp, _BoundArgs...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind_r<_Rp, _Fp, _BoundArgs...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <> +struct _LIBCPP_VISIBLE hash<bool> + : public unary_function<bool, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(bool __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<char> + : public unary_function<char, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<signed char> + : public unary_function<signed char, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(signed char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<unsigned char> + : public unary_function<unsigned char, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + +template <> +struct _LIBCPP_VISIBLE hash<char16_t> + : public unary_function<char16_t, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<char32_t> + : public unary_function<char32_t, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +template <> +struct _LIBCPP_VISIBLE hash<wchar_t> + : public unary_function<wchar_t, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<short> + : public unary_function<short, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(short __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<unsigned short> + : public unary_function<unsigned short, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<int> + : public unary_function<int, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(int __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<unsigned int> + : public unary_function<unsigned int, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<long> + : public unary_function<long, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(long __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<unsigned long> + : public unary_function<unsigned long, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast<size_t>(__v);} +}; + +template <> +struct _LIBCPP_VISIBLE hash<long long> + : public __scalar_hash<long long> +{ +}; + +template <> +struct _LIBCPP_VISIBLE hash<unsigned long long> + : public __scalar_hash<unsigned long long> +{ +}; + +template <> +struct _LIBCPP_VISIBLE hash<float> + : public __scalar_hash<float> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(float __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0) + return 0; + return __scalar_hash<float>::operator()(__v); + } +}; + +template <> +struct _LIBCPP_VISIBLE hash<double> + : public __scalar_hash<double> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(double __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0) + return 0; + return __scalar_hash<double>::operator()(__v); + } +}; + +template <> +struct _LIBCPP_VISIBLE hash<long double> + : public __scalar_hash<long double> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(long double __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0) + return 0; +#if defined(__i386__) + // Zero out padding bits + union + { + long double __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + size_t __d; + }; + } __u; + __u.__a = 0; + __u.__b = 0; + __u.__c = 0; + __u.__d = 0; + __u.__t = __v; + return __u.__a ^ __u.__b ^ __u.__c ^ __u.__d; +#elif defined(__x86_64__) + // Zero out padding bits + union + { + long double __t; + struct + { + size_t __a; + size_t __b; + }; + } __u; + __u.__a = 0; + __u.__b = 0; + __u.__t = __v; + return __u.__a ^ __u.__b; +#else + return __scalar_hash<long double>::operator()(__v); +#endif + } +}; + +// struct hash<T*> in <memory> + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FUNCTIONAL diff --git a/contrib/libc++/include/future b/contrib/libc++/include/future new file mode 100644 index 0000000..aae707e --- /dev/null +++ b/contrib/libc++/include/future @@ -0,0 +1,2501 @@ +// -*- C++ -*- +//===--------------------------- future -----------------------------------===// +// +// 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_FUTURE +#define _LIBCPP_FUTURE + +/* + future synopsis + +namespace std +{ + +enum class future_errc +{ + broken_promise, + future_already_retrieved, + promise_already_satisfied, + no_state +}; + +enum class launch +{ + async = 1, + deferred = 2, + any = async | deferred +}; + +enum class future_status +{ + ready, + timeout, + deferred +}; + +template <> struct is_error_code_enum<future_errc> : public true_type { }; +error_code make_error_code(future_errc e); +error_condition make_error_condition(future_errc e); + +const error_category& future_category(); + +class future_error + : public logic_error +{ +public: + future_error(error_code ec); // exposition only + + const error_code& code() const throw(); + const char* what() const throw(); +}; + +template <class R> +class promise +{ +public: + promise(); + template <class Allocator> + promise(allocator_arg_t, const Allocator& a); + promise(promise&& rhs); + promise(const promise& rhs) = delete; + ~promise(); + + // assignment + promise& operator=(promise&& rhs); + promise& operator=(const promise& rhs) = delete; + void swap(promise& other); + + // retrieving the result + future<R> get_future(); + + // setting the result + void set_value(const R& r); + void set_value(R&& r); + void set_exception(exception_ptr p); + + // setting the result with deferred notification + void set_value_at_thread_exit(const R& r); + void set_value_at_thread_exit(R&& r); + void set_exception_at_thread_exit(exception_ptr p); +}; + +template <class R> +class promise<R&> +{ +public: + promise(); + template <class Allocator> + promise(allocator_arg_t, const Allocator& a); + promise(promise&& rhs); + promise(const promise& rhs) = delete; + ~promise(); + + // assignment + promise& operator=(promise&& rhs); + promise& operator=(const promise& rhs) = delete; + void swap(promise& other); + + // retrieving the result + future<R&> get_future(); + + // setting the result + void set_value(R& r); + void set_exception(exception_ptr p); + + // setting the result with deferred notification + void set_value_at_thread_exit(R&); + void set_exception_at_thread_exit(exception_ptr p); +}; + +template <> +class promise<void> +{ +public: + promise(); + template <class Allocator> + promise(allocator_arg_t, const Allocator& a); + promise(promise&& rhs); + promise(const promise& rhs) = delete; + ~promise(); + + // assignment + promise& operator=(promise&& rhs); + promise& operator=(const promise& rhs) = delete; + void swap(promise& other); + + // retrieving the result + future<void> get_future(); + + // setting the result + void set_value(); + void set_exception(exception_ptr p); + + // setting the result with deferred notification + void set_value_at_thread_exit(); + void set_exception_at_thread_exit(exception_ptr p); +}; + +template <class R> void swap(promise<R>& x, promise<R>& y); + +template <class R, class Alloc> + struct uses_allocator<promise<R>, Alloc> : public true_type {}; + +template <class R> +class future +{ +public: + future(); + future(future&&); + future(const future& rhs) = delete; + ~future(); + future& operator=(const future& rhs) = delete; + future& operator=(future&&); + shared_future<R> share() &&; + + // retrieving the value + R get(); + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <class R> +class future<R&> +{ +public: + future(); + future(future&&); + future(const future& rhs) = delete; + ~future(); + future& operator=(const future& rhs) = delete; + future& operator=(future&&); + shared_future<R&> share() &&; + + // retrieving the value + R& get(); + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <> +class future<void> +{ +public: + future(); + future(future&&); + future(const future& rhs) = delete; + ~future(); + future& operator=(const future& rhs) = delete; + future& operator=(future&&); + shared_future<void> share() &&; + + // retrieving the value + void get(); + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <class R> +class shared_future +{ +public: + shared_future(); + shared_future(const shared_future& rhs); + shared_future(future<R>&&); + shared_future(shared_future&& rhs); + ~shared_future(); + shared_future& operator=(const shared_future& rhs); + shared_future& operator=(shared_future&& rhs); + + // retrieving the value + const R& get() const; + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <class R> +class shared_future<R&> +{ +public: + shared_future(); + shared_future(const shared_future& rhs); + shared_future(future<R&>&&); + shared_future(shared_future&& rhs); + ~shared_future(); + shared_future& operator=(const shared_future& rhs); + shared_future& operator=(shared_future&& rhs); + + // retrieving the value + R& get() const; + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <> +class shared_future<void> +{ +public: + shared_future(); + shared_future(const shared_future& rhs); + shared_future(future<void>&&); + shared_future(shared_future&& rhs); + ~shared_future(); + shared_future& operator=(const shared_future& rhs); + shared_future& operator=(shared_future&& rhs); + + // retrieving the value + void get() const; + + // functions to check state + bool valid() const; + + void wait() const; + template <class Rep, class Period> + future_status + wait_for(const chrono::duration<Rep, Period>& rel_time) const; + template <class Clock, class Duration> + future_status + wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; +}; + +template <class F, class... Args> + future<typename result_of<F(Args...)>::type> + async(F&& f, Args&&... args); + +template <class F, class... Args> + future<typename result_of<F(Args...)>::type> + async(launch policy, F&& f, Args&&... args); + +template <class> class packaged_task; // undefined + +template <class R, class... ArgTypes> +class packaged_task<R(ArgTypes...)> +{ +public: + typedef R result_type; + + // construction and destruction + packaged_task(); + template <class F> + explicit packaged_task(F&& f); + template <class F, class Allocator> + explicit packaged_task(allocator_arg_t, const Allocator& a, F&& f); + ~packaged_task(); + + // no copy + packaged_task(packaged_task&) = delete; + packaged_task& operator=(packaged_task&) = delete; + + // move support + packaged_task(packaged_task&& other); + packaged_task& operator=(packaged_task&& other); + void swap(packaged_task& other); + + bool valid() const; + + // result retrieval + future<R> get_future(); + + // execution + void operator()(ArgTypes... ); + void make_ready_at_thread_exit(ArgTypes...); + + void reset(); +}; + +template <class R> + void swap(packaged_task<R(ArgTypes...)&, packaged_task<R(ArgTypes...)>&); + +template <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>; + +} // std + +*/ + +#include <__config> +#include <system_error> +#include <memory> +#include <chrono> +#include <exception> +#include <mutex> +#include <thread> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +//enum class future_errc +_LIBCPP_DECLARE_STRONG_ENUM(future_errc) +{ + broken_promise, + future_already_retrieved, + promise_already_satisfied, + no_state +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc) + +template <> +struct _LIBCPP_VISIBLE is_error_code_enum<future_errc> : public true_type {}; + +#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS +template <> +struct _LIBCPP_VISIBLE is_error_code_enum<future_errc::_> : public true_type { }; +#endif + +//enum class launch +_LIBCPP_DECLARE_STRONG_ENUM(launch) +{ + async = 1, + deferred = 2, + any = async | deferred +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch) + +//enum class future_status +_LIBCPP_DECLARE_STRONG_ENUM(future_status) +{ + ready, + timeout, + deferred +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status) + +_LIBCPP_VISIBLE +const error_category& future_category(); + +inline _LIBCPP_INLINE_VISIBILITY +error_code +make_error_code(future_errc __e) +{ + return error_code(static_cast<int>(__e), future_category()); +} + +inline _LIBCPP_INLINE_VISIBILITY +error_condition +make_error_condition(future_errc __e) +{ + return error_condition(static_cast<int>(__e), future_category()); +} + +class _LIBCPP_EXCEPTION_ABI future_error + : public logic_error +{ + error_code __ec_; +public: + future_error(error_code __ec); + + _LIBCPP_INLINE_VISIBILITY + const error_code& code() const throw() {return __ec_;} + + virtual ~future_error() _NOEXCEPT; +}; + +class __assoc_sub_state + : public __shared_count +{ +protected: + exception_ptr __exception_; + mutable mutex __mut_; + mutable condition_variable __cv_; + unsigned __state_; + + virtual void __on_zero_shared() _NOEXCEPT; + void __sub_wait(unique_lock<mutex>& __lk); +public: + enum + { + __constructed = 1, + __future_attached = 2, + ready = 4, + deferred = 8 + }; + + _LIBCPP_INLINE_VISIBILITY + __assoc_sub_state() : __state_(0) {} + + _LIBCPP_INLINE_VISIBILITY + bool __has_value() const + {return (__state_ & __constructed) || (__exception_ != nullptr);} + + _LIBCPP_INLINE_VISIBILITY + void __set_future_attached() {__state_ |= __future_attached;} + _LIBCPP_INLINE_VISIBILITY + bool __has_future_attached() const {return __state_ & __future_attached;} + + _LIBCPP_INLINE_VISIBILITY + void __set_deferred() {__state_ |= deferred;} + + void __make_ready(); + _LIBCPP_INLINE_VISIBILITY + bool __is_ready() const {return __state_ & ready;} + + void set_value(); + void set_value_at_thread_exit(); + + void set_exception(exception_ptr __p); + void set_exception_at_thread_exit(exception_ptr __p); + + void copy(); + + void wait(); + template <class _Rep, class _Period> + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const; + template <class _Clock, class _Duration> + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const; + + virtual void __execute(); +}; + +template <class _Clock, class _Duration> +future_status +__assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const +{ + unique_lock<mutex> __lk(__mut_); + if (__state_ & deferred) + return future_status::deferred; + while (!(__state_ & ready) && _Clock::now() < __abs_time) + __cv_.wait_until(__lk, __abs_time); + if (__state_ & ready) + return future_status::ready; + return future_status::timeout; +} + +template <class _Rep, class _Period> +inline _LIBCPP_INLINE_VISIBILITY +future_status +__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const +{ + return wait_until(chrono::steady_clock::now() + __rel_time); +} + +template <class _Rp> +class __assoc_state + : public __assoc_sub_state +{ + typedef __assoc_sub_state base; + typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up; +protected: + _Up __value_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: + + template <class _Arg> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void set_value(_Arg&& __arg); +#else + void set_value(_Arg& __arg); +#endif + + template <class _Arg> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void set_value_at_thread_exit(_Arg&& __arg); +#else + void set_value_at_thread_exit(_Arg& __arg); +#endif + + _Rp move(); + typename add_lvalue_reference<_Rp>::type copy(); +}; + +template <class _Rp> +void +__assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT +{ + if (this->__state_ & base::__constructed) + reinterpret_cast<_Rp*>(&__value_)->~_Rp(); + delete this; +} + +template <class _Rp> +template <class _Arg> +void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__assoc_state<_Rp>::set_value(_Arg&& __arg) +#else +__assoc_state<_Rp>::set_value(_Arg& __arg) +#endif +{ + unique_lock<mutex> __lk(this->__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (this->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg)); + this->__state_ |= base::__constructed | base::ready; + __lk.unlock(); + __cv_.notify_all(); +} + +template <class _Rp> +template <class _Arg> +void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg) +#else +__assoc_state<_Rp>::set_value_at_thread_exit(_Arg& __arg) +#endif +{ + unique_lock<mutex> __lk(this->__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (this->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg)); + this->__state_ |= base::__constructed; + __thread_local_data()->__make_ready_at_thread_exit(this); + __lk.unlock(); +} + +template <class _Rp> +_Rp +__assoc_state<_Rp>::move() +{ + unique_lock<mutex> __lk(this->__mut_); + this->__sub_wait(__lk); + if (this->__exception_ != nullptr) + rethrow_exception(this->__exception_); + return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_)); +} + +template <class _Rp> +typename add_lvalue_reference<_Rp>::type +__assoc_state<_Rp>::copy() +{ + unique_lock<mutex> __lk(this->__mut_); + this->__sub_wait(__lk); + if (this->__exception_ != nullptr) + rethrow_exception(this->__exception_); + return *reinterpret_cast<_Rp*>(&__value_); +} + +template <class _Rp> +class __assoc_state<_Rp&> + : public __assoc_sub_state +{ + typedef __assoc_sub_state base; + typedef _Rp* _Up; +protected: + _Up __value_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: + + void set_value(_Rp& __arg); + void set_value_at_thread_exit(_Rp& __arg); + + _Rp& copy(); +}; + +template <class _Rp> +void +__assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT +{ + delete this; +} + +template <class _Rp> +void +__assoc_state<_Rp&>::set_value(_Rp& __arg) +{ + unique_lock<mutex> __lk(this->__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (this->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __value_ = &__arg; + this->__state_ |= base::__constructed | base::ready; + __lk.unlock(); + __cv_.notify_all(); +} + +template <class _Rp> +void +__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg) +{ + unique_lock<mutex> __lk(this->__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (this->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __value_ = &__arg; + this->__state_ |= base::__constructed; + __thread_local_data()->__make_ready_at_thread_exit(this); + __lk.unlock(); +} + +template <class _Rp> +_Rp& +__assoc_state<_Rp&>::copy() +{ + unique_lock<mutex> __lk(this->__mut_); + this->__sub_wait(__lk); + if (this->__exception_ != nullptr) + rethrow_exception(this->__exception_); + return *__value_; +} + +template <class _Rp, class _Alloc> +class __assoc_state_alloc + : public __assoc_state<_Rp> +{ + typedef __assoc_state<_Rp> base; + _Alloc __alloc_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __assoc_state_alloc(const _Alloc& __a) + : __alloc_(__a) {} +}; + +template <class _Rp, class _Alloc> +void +__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT +{ + if (this->__state_ & base::__constructed) + reinterpret_cast<_Rp*>(&this->__value_)->~_Rp(); + typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_); + this->~__assoc_state_alloc(); + __a.deallocate(this, 1); +} + +template <class _Rp, class _Alloc> +class __assoc_state_alloc<_Rp&, _Alloc> + : public __assoc_state<_Rp&> +{ + typedef __assoc_state<_Rp&> base; + _Alloc __alloc_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __assoc_state_alloc(const _Alloc& __a) + : __alloc_(__a) {} +}; + +template <class _Rp, class _Alloc> +void +__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT +{ + typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_); + this->~__assoc_state_alloc(); + __a.deallocate(this, 1); +} + +template <class _Alloc> +class __assoc_sub_state_alloc + : public __assoc_sub_state +{ + typedef __assoc_sub_state base; + _Alloc __alloc_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __assoc_sub_state_alloc(const _Alloc& __a) + : __alloc_(__a) {} +}; + +template <class _Alloc> +void +__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT +{ + this->~base(); + typename _Alloc::template rebind<__assoc_sub_state_alloc>::other __a(__alloc_); + this->~__assoc_sub_state_alloc(); + __a.deallocate(this, 1); +} + +template <class _Rp, class _Fp> +class __deferred_assoc_state + : public __assoc_state<_Rp> +{ + typedef __assoc_state<_Rp> base; + + _Fp __func_; + +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + explicit __deferred_assoc_state(_Fp&& __f); +#endif + + virtual void __execute(); +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp, class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f) + : __func_(_VSTD::forward<_Fp>(__f)) +{ + this->__set_deferred(); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp, class _Fp> +void +__deferred_assoc_state<_Rp, _Fp>::__execute() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + this->set_value(__func_()); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Fp> +class __deferred_assoc_state<void, _Fp> + : public __assoc_sub_state +{ + typedef __assoc_sub_state base; + + _Fp __func_; + +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + explicit __deferred_assoc_state(_Fp&& __f); +#endif + + virtual void __execute(); +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f) + : __func_(_VSTD::forward<_Fp>(__f)) +{ + this->__set_deferred(); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Fp> +void +__deferred_assoc_state<void, _Fp>::__execute() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __func_(); + this->set_value(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Rp, class _Fp> +class __async_assoc_state + : public __assoc_state<_Rp> +{ + typedef __assoc_state<_Rp> base; + + _Fp __func_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + explicit __async_assoc_state(_Fp&& __f); +#endif + + virtual void __execute(); +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp, class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f) + : __func_(_VSTD::forward<_Fp>(__f)) +{ +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp, class _Fp> +void +__async_assoc_state<_Rp, _Fp>::__execute() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + this->set_value(__func_()); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Rp, class _Fp> +void +__async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT +{ + this->wait(); + base::__on_zero_shared(); +} + +template <class _Fp> +class __async_assoc_state<void, _Fp> + : public __assoc_sub_state +{ + typedef __assoc_sub_state base; + + _Fp __func_; + + virtual void __on_zero_shared() _NOEXCEPT; +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + explicit __async_assoc_state(_Fp&& __f); +#endif + + virtual void __execute(); +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Fp> +inline _LIBCPP_INLINE_VISIBILITY +__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f) + : __func_(_VSTD::forward<_Fp>(__f)) +{ +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Fp> +void +__async_assoc_state<void, _Fp>::__execute() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __func_(); + this->set_value(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Fp> +void +__async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT +{ + this->wait(); + base::__on_zero_shared(); +} + +template <class _Rp> class promise; +template <class _Rp> class shared_future; + +// future + +template <class _Rp> class future; + +template <class _Rp, class _Fp> +future<_Rp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__make_deferred_assoc_state(_Fp&& __f); +#else +__make_deferred_assoc_state(_Fp __f); +#endif + +template <class _Rp, class _Fp> +future<_Rp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__make_async_assoc_state(_Fp&& __f); +#else +__make_async_assoc_state(_Fp __f); +#endif + +template <class _Rp> +class _LIBCPP_VISIBLE future +{ + __assoc_state<_Rp>* __state_; + + explicit future(__assoc_state<_Rp>* __state); + + template <class> friend class promise; + template <class> friend class shared_future; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp&& __f); +#else + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp __f); +#endif + +public: + _LIBCPP_INLINE_VISIBILITY + future() : __state_(nullptr) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + future(future&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + future(const future&) = delete; + future& operator=(const future&) = delete; + _LIBCPP_INLINE_VISIBILITY + future& operator=(future&& __rhs) + { + future(std::move(__rhs)).swap(*this); + return *this; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + future(const future&); + future& operator=(const future&); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~future(); + shared_future<_Rp> share(); + + // retrieving the value + _Rp get(); + + _LIBCPP_INLINE_VISIBILITY + void swap(future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +future<_Rp>::future(__assoc_state<_Rp>* __state) + : __state_(__state) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_->__has_future_attached()) + throw future_error(make_error_code(future_errc::future_already_retrieved)); +#endif + __state_->__add_shared(); + __state_->__set_future_attached(); +} + +struct __release_shared_count +{ + void operator()(__shared_count* p) {p->__release_shared();} +}; + +template <class _Rp> +future<_Rp>::~future() +{ + if (__state_) + __state_->__release_shared(); +} + +template <class _Rp> +_Rp +future<_Rp>::get() +{ + unique_ptr<__shared_count, __release_shared_count> __(__state_); + __assoc_state<_Rp>* __s = __state_; + __state_ = nullptr; + return __s->move(); +} + +template <class _Rp> +class _LIBCPP_VISIBLE future<_Rp&> +{ + __assoc_state<_Rp&>* __state_; + + explicit future(__assoc_state<_Rp&>* __state); + + template <class> friend class promise; + template <class> friend class shared_future; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp&& __f); +#else + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp __f); +#endif + +public: + _LIBCPP_INLINE_VISIBILITY + future() : __state_(nullptr) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + future(future&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + future(const future&) = delete; + future& operator=(const future&) = delete; + _LIBCPP_INLINE_VISIBILITY + future& operator=(future&& __rhs) + { + future(std::move(__rhs)).swap(*this); + return *this; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + future(const future&); + future& operator=(const future&); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~future(); + shared_future<_Rp&> share(); + + // retrieving the value + _Rp& get(); + + _LIBCPP_INLINE_VISIBILITY + void swap(future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +future<_Rp&>::future(__assoc_state<_Rp&>* __state) + : __state_(__state) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_->__has_future_attached()) + throw future_error(make_error_code(future_errc::future_already_retrieved)); +#endif + __state_->__add_shared(); + __state_->__set_future_attached(); +} + +template <class _Rp> +future<_Rp&>::~future() +{ + if (__state_) + __state_->__release_shared(); +} + +template <class _Rp> +_Rp& +future<_Rp&>::get() +{ + unique_ptr<__shared_count, __release_shared_count> __(__state_); + __assoc_state<_Rp&>* __s = __state_; + __state_ = nullptr; + return __s->copy(); +} + +template <> +class _LIBCPP_VISIBLE future<void> +{ + __assoc_sub_state* __state_; + + explicit future(__assoc_sub_state* __state); + + template <class> friend class promise; + template <class> friend class shared_future; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp&& __f); +#else + template <class _R1, class _Fp> + friend future<_R1> __make_deferred_assoc_state(_Fp __f); + template <class _R1, class _Fp> + friend future<_R1> __make_async_assoc_state(_Fp __f); +#endif + +public: + _LIBCPP_INLINE_VISIBILITY + future() : __state_(nullptr) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + future(future&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + future(const future&) = delete; + future& operator=(const future&) = delete; + _LIBCPP_INLINE_VISIBILITY + future& operator=(future&& __rhs) + { + future(std::move(__rhs)).swap(*this); + return *this; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + future(const future&); + future& operator=(const future&); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~future(); + shared_future<void> share(); + + // retrieving the value + void get(); + + _LIBCPP_INLINE_VISIBILITY + void swap(future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(future<_Rp>& __x, future<_Rp>& __y) +{ + __x.swap(__y); +} + +// promise<R> + +template <class _Callable> class packaged_task; + +template <class _Rp> +class _LIBCPP_VISIBLE promise +{ + __assoc_state<_Rp>* __state_; + + _LIBCPP_INLINE_VISIBILITY + explicit promise(nullptr_t) : __state_(nullptr) {} + + template <class> friend class packaged_task; +public: + promise(); + template <class _Alloc> + promise(allocator_arg_t, const _Alloc& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise(promise&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + promise(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~promise(); + + // assignment +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise& operator=(promise&& __rhs) + { + promise(std::move(__rhs)).swap(*this); + return *this; + } + promise& operator=(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise& operator=(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void swap(promise& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // retrieving the result + future<_Rp> get_future(); + + // setting the result + void set_value(const _Rp& __r); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void set_value(_Rp&& __r); +#endif + void set_exception(exception_ptr __p); + + // setting the result with deferred notification + void set_value_at_thread_exit(const _Rp& __r); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void set_value_at_thread_exit(_Rp&& __r); +#endif + void set_exception_at_thread_exit(exception_ptr __p); +}; + +template <class _Rp> +promise<_Rp>::promise() + : __state_(new __assoc_state<_Rp>) +{ +} + +template <class _Rp> +template <class _Alloc> +promise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0) +{ + typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp, _Alloc> >::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a(__a0); + unique_ptr<__assoc_state_alloc<_Rp, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1)); + ::new(__hold.get()) __assoc_state_alloc<_Rp, _Alloc>(__a0); + __state_ = __hold.release(); +} + +template <class _Rp> +promise<_Rp>::~promise() +{ + if (__state_) + { + if (!__state_->__has_value() && __state_->use_count() > 1) + __state_->set_exception(make_exception_ptr( + future_error(make_error_code(future_errc::broken_promise)) + )); + __state_->__release_shared(); + } +} + +template <class _Rp> +future<_Rp> +promise<_Rp>::get_future() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + return future<_Rp>(__state_); +} + +template <class _Rp> +void +promise<_Rp>::set_value(const _Rp& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value(__r); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp> +void +promise<_Rp>::set_value(_Rp&& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value(_VSTD::move(__r)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp> +void +promise<_Rp>::set_exception(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception(__p); +} + +template <class _Rp> +void +promise<_Rp>::set_value_at_thread_exit(const _Rp& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value_at_thread_exit(__r); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp> +void +promise<_Rp>::set_value_at_thread_exit(_Rp&& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value_at_thread_exit(_VSTD::move(__r)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Rp> +void +promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception_at_thread_exit(__p); +} + +// promise<R&> + +template <class _Rp> +class _LIBCPP_VISIBLE promise<_Rp&> +{ + __assoc_state<_Rp&>* __state_; + + _LIBCPP_INLINE_VISIBILITY + explicit promise(nullptr_t) : __state_(nullptr) {} + + template <class> friend class packaged_task; + +public: + promise(); + template <class _Allocator> + promise(allocator_arg_t, const _Allocator& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise(promise&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + promise(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~promise(); + + // assignment +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise& operator=(promise&& __rhs) + { + promise(std::move(__rhs)).swap(*this); + return *this; + } + promise& operator=(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise& operator=(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void swap(promise& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // retrieving the result + future<_Rp&> get_future(); + + // setting the result + void set_value(_Rp& __r); + void set_exception(exception_ptr __p); + + // setting the result with deferred notification + void set_value_at_thread_exit(_Rp&); + void set_exception_at_thread_exit(exception_ptr __p); +}; + +template <class _Rp> +promise<_Rp&>::promise() + : __state_(new __assoc_state<_Rp&>) +{ +} + +template <class _Rp> +template <class _Alloc> +promise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0) +{ + typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp&, _Alloc> >::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a(__a0); + unique_ptr<__assoc_state_alloc<_Rp&, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1)); + ::new(__hold.get()) __assoc_state_alloc<_Rp&, _Alloc>(__a0); + __state_ = __hold.release(); +} + +template <class _Rp> +promise<_Rp&>::~promise() +{ + if (__state_) + { + if (!__state_->__has_value() && __state_->use_count() > 1) + __state_->set_exception(make_exception_ptr( + future_error(make_error_code(future_errc::broken_promise)) + )); + __state_->__release_shared(); + } +} + +template <class _Rp> +future<_Rp&> +promise<_Rp&>::get_future() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + return future<_Rp&>(__state_); +} + +template <class _Rp> +void +promise<_Rp&>::set_value(_Rp& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value(__r); +} + +template <class _Rp> +void +promise<_Rp&>::set_exception(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception(__p); +} + +template <class _Rp> +void +promise<_Rp&>::set_value_at_thread_exit(_Rp& __r) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value_at_thread_exit(__r); +} + +template <class _Rp> +void +promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception_at_thread_exit(__p); +} + +// promise<void> + +template <> +class _LIBCPP_VISIBLE promise<void> +{ + __assoc_sub_state* __state_; + + _LIBCPP_INLINE_VISIBILITY + explicit promise(nullptr_t) : __state_(nullptr) {} + + template <class> friend class packaged_task; + +public: + promise(); + template <class _Allocator> + promise(allocator_arg_t, const _Allocator& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise(promise&& __rhs) + : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} + promise(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~promise(); + + // assignment +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + promise& operator=(promise&& __rhs) + { + promise(std::move(__rhs)).swap(*this); + return *this; + } + promise& operator=(const promise& __rhs) = delete; +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +private: + promise& operator=(const promise& __rhs); +public: +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void swap(promise& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // retrieving the result + future<void> get_future(); + + // setting the result + void set_value(); + void set_exception(exception_ptr __p); + + // setting the result with deferred notification + void set_value_at_thread_exit(); + void set_exception_at_thread_exit(exception_ptr __p); +}; + +template <class _Alloc> +promise<void>::promise(allocator_arg_t, const _Alloc& __a0) +{ + typedef typename _Alloc::template rebind<__assoc_sub_state_alloc<_Alloc> >::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a(__a0); + unique_ptr<__assoc_sub_state_alloc<_Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1)); + ::new(__hold.get()) __assoc_sub_state_alloc<_Alloc>(__a0); + __state_ = __hold.release(); +} + +template <class _Rp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(promise<_Rp>& __x, promise<_Rp>& __y) +{ + __x.swap(__y); +} + +template <class _Rp, class _Alloc> + struct _LIBCPP_VISIBLE uses_allocator<promise<_Rp>, _Alloc> + : public true_type {}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// packaged_task + +template<class _Fp> class __packaged_task_base; + +template<class _Rp, class ..._ArgTypes> +class __packaged_task_base<_Rp(_ArgTypes...)> +{ + __packaged_task_base(const __packaged_task_base&); + __packaged_task_base& operator=(const __packaged_task_base&); +public: + _LIBCPP_INLINE_VISIBILITY + __packaged_task_base() {} + _LIBCPP_INLINE_VISIBILITY + virtual ~__packaged_task_base() {} + virtual void __move_to(__packaged_task_base*) = 0; + virtual void destroy() = 0; + virtual void destroy_deallocate() = 0; + virtual _Rp operator()(_ArgTypes&& ...) = 0; +}; + +template<class _FD, class _Alloc, class _FB> class __packaged_task_func; + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +class __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)> + : public __packaged_task_base<_Rp(_ArgTypes...)> +{ + __compressed_pair<_Fp, _Alloc> __f_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __packaged_task_func(const _Fp& __f) : __f_(__f) {} + _LIBCPP_INLINE_VISIBILITY + explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f)) {} + _LIBCPP_INLINE_VISIBILITY + __packaged_task_func(const _Fp& __f, const _Alloc& __a) + : __f_(__f, __a) {} + _LIBCPP_INLINE_VISIBILITY + __packaged_task_func(_Fp&& __f, const _Alloc& __a) + : __f_(_VSTD::move(__f), __a) {} + virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*); + virtual void destroy(); + virtual void destroy_deallocate(); + virtual _Rp operator()(_ArgTypes&& ... __args); +}; + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to( + __packaged_task_base<_Rp(_ArgTypes...)>* __p) +{ + ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second())); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() +{ + __f_.~__compressed_pair<_Fp, _Alloc>(); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +void +__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() +{ + typedef typename _Alloc::template rebind<__packaged_task_func>::other _Ap; + _Ap __a(__f_.second()); + __f_.~__compressed_pair<_Fp, _Alloc>(); + __a.deallocate(this, 1); +} + +template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> +_Rp +__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg) +{ + return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...); +} + +template <class _Callable> class __packaged_task_function; + +template<class _Rp, class ..._ArgTypes> +class __packaged_task_function<_Rp(_ArgTypes...)> +{ + typedef __packaged_task_base<_Rp(_ArgTypes...)> __base; + aligned_storage<3*sizeof(void*)>::type __buf_; + __base* __f_; + +public: + typedef _Rp result_type; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + __packaged_task_function() : __f_(nullptr) {} + template<class _Fp> + __packaged_task_function(_Fp&& __f); + template<class _Fp, class _Alloc> + __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f); + + __packaged_task_function(__packaged_task_function&&); + __packaged_task_function& operator=(__packaged_task_function&&); + + __packaged_task_function(const __packaged_task_function&) = delete; + __packaged_task_function& operator=(const __packaged_task_function&) = delete; + + ~__packaged_task_function(); + + void swap(__packaged_task_function&); + + _Rp operator()(_ArgTypes...) const; +}; + +template<class _Rp, class ..._ArgTypes> +__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) +{ + if (__f.__f_ == nullptr) + __f_ = nullptr; + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__move_to(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = nullptr; + } +} + +template<class _Rp, class ..._ArgTypes> +template <class _Fp> +__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f) + : __f_(nullptr) +{ + typedef typename remove_reference<_Fp>::type _FR; + typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(_VSTD::forward<_Fp>(__f)); + } + else + { + typedef allocator<_FF> _Ap; + _Ap __a; + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a)); + __f_ = __hold.release(); + } +} + +template<class _Rp, class ..._ArgTypes> +template <class _Fp, class _Alloc> +__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function( + allocator_arg_t, const _Alloc& __a0, _Fp&& __f) + : __f_(nullptr) +{ + typedef allocator_traits<_Alloc> __alloc_traits; + typedef typename remove_reference<_Fp>::type _FR; + typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF; + if (sizeof(_FF) <= sizeof(__buf_)) + { + __f_ = (__base*)&__buf_; + ::new (__f_) _FF(_VSTD::forward<_Fp>(__f)); + } + else + { + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<_FF> +#else + rebind_alloc<_FF>::other +#endif + _Ap; + _Ap __a(__a0); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a)); + __f_ = __hold.release(); + } +} + +template<class _Rp, class ..._ArgTypes> +__packaged_task_function<_Rp(_ArgTypes...)>& +__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + __f_ = nullptr; + if (__f.__f_ == nullptr) + __f_ = nullptr; + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f_ = (__base*)&__buf_; + __f.__f_->__move_to(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = nullptr; + } +} + +template<class _Rp, class ..._ArgTypes> +__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function() +{ + if (__f_ == (__base*)&__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); +} + +template<class _Rp, class ..._ArgTypes> +void +__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) +{ + if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) + { + typename aligned_storage<sizeof(__buf_)>::type __tempbuf; + __base* __t = (__base*)&__tempbuf; + __f_->__move_to(__t); + __f_->destroy(); + __f_ = nullptr; + __f.__f_->__move_to((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = nullptr; + __f_ = (__base*)&__buf_; + __t->__move_to((__base*)&__f.__buf_); + __t->destroy(); + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f_ == (__base*)&__buf_) + { + __f_->__move_to((__base*)&__f.__buf_); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = (__base*)&__f.__buf_; + } + else if (__f.__f_ == (__base*)&__f.__buf_) + { + __f.__f_->__move_to((__base*)&__buf_); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = (__base*)&__buf_; + } + else + _VSTD::swap(__f_, __f.__f_); +} + +template<class _Rp, class ..._ArgTypes> +inline _LIBCPP_INLINE_VISIBILITY +_Rp +__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const +{ + return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...); +} + +template<class _Rp, class ..._ArgTypes> +class _LIBCPP_VISIBLE packaged_task<_Rp(_ArgTypes...)> +{ +public: + typedef _Rp result_type; + +private: + __packaged_task_function<result_type(_ArgTypes...)> __f_; + promise<result_type> __p_; + +public: + // construction and destruction + _LIBCPP_INLINE_VISIBILITY + packaged_task() : __p_(nullptr) {} + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} + template <class _Fp, class _Allocator> + _LIBCPP_INLINE_VISIBILITY + explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) + : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), + __p_(allocator_arg, __a) {} + // ~packaged_task() = default; + + // no copy + packaged_task(packaged_task&) = delete; + packaged_task& operator=(packaged_task&) = delete; + + // move support + _LIBCPP_INLINE_VISIBILITY + packaged_task(packaged_task&& __other) + : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {} + _LIBCPP_INLINE_VISIBILITY + packaged_task& operator=(packaged_task&& __other) + { + __f_ = _VSTD::move(__other.__f_); + __p_ = _VSTD::move(__other.__p_); + return *this; + } + _LIBCPP_INLINE_VISIBILITY + void swap(packaged_task& __other) + { + __f_.swap(__other.__f_); + __p_.swap(__other.__p_); + } + + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __p_.__state_ != nullptr;} + + // result retrieval + _LIBCPP_INLINE_VISIBILITY + future<result_type> get_future() {return __p_.get_future();} + + // execution + void operator()(_ArgTypes... __args); + void make_ready_at_thread_exit(_ArgTypes... __args); + + void reset(); +}; + +template<class _Rp, class ..._ArgTypes> +void +packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__p_.__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); + if (__p_.__state_->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __p_.set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Rp, class ..._ArgTypes> +void +packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__p_.__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); + if (__p_.__state_->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __p_.set_exception_at_thread_exit(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Rp, class ..._ArgTypes> +void +packaged_task<_Rp(_ArgTypes...)>::reset() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!valid()) + throw future_error(make_error_code(future_errc::no_state)); +#endif // _LIBCPP_NO_EXCEPTIONS + __p_ = promise<result_type>(); +} + +template<class ..._ArgTypes> +class _LIBCPP_VISIBLE packaged_task<void(_ArgTypes...)> +{ +public: + typedef void result_type; + +private: + __packaged_task_function<result_type(_ArgTypes...)> __f_; + promise<result_type> __p_; + +public: + // construction and destruction + _LIBCPP_INLINE_VISIBILITY + packaged_task() : __p_(nullptr) {} + template <class _Fp> + _LIBCPP_INLINE_VISIBILITY + explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} + template <class _Fp, class _Allocator> + _LIBCPP_INLINE_VISIBILITY + explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) + : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), + __p_(allocator_arg, __a) {} + // ~packaged_task() = default; + + // no copy + packaged_task(packaged_task&) = delete; + packaged_task& operator=(packaged_task&) = delete; + + // move support + _LIBCPP_INLINE_VISIBILITY + packaged_task(packaged_task&& __other) + : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {} + _LIBCPP_INLINE_VISIBILITY + packaged_task& operator=(packaged_task&& __other) + { + __f_ = _VSTD::move(__other.__f_); + __p_ = _VSTD::move(__other.__p_); + return *this; + } + _LIBCPP_INLINE_VISIBILITY + void swap(packaged_task& __other) + { + __f_.swap(__other.__f_); + __p_.swap(__other.__p_); + } + + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __p_.__state_ != nullptr;} + + // result retrieval + _LIBCPP_INLINE_VISIBILITY + future<result_type> get_future() {return __p_.get_future();} + + // execution + void operator()(_ArgTypes... __args); + void make_ready_at_thread_exit(_ArgTypes... __args); + + void reset(); +}; + +template<class ..._ArgTypes> +void +packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__p_.__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); + if (__p_.__state_->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __f_(_VSTD::forward<_ArgTypes>(__args)...); + __p_.set_value(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __p_.set_exception(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class ..._ArgTypes> +void +packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__p_.__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); + if (__p_.__state_->__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __f_(_VSTD::forward<_ArgTypes>(__args)...); + __p_.set_value_at_thread_exit(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __p_.set_exception_at_thread_exit(current_exception()); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class ..._ArgTypes> +void +packaged_task<void(_ArgTypes...)>::reset() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!valid()) + throw future_error(make_error_code(future_errc::no_state)); +#endif // _LIBCPP_NO_EXCEPTIONS + __p_ = promise<result_type>(); +} + +template <class _Callable> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) +{ + __x.swap(__y); +} + +template <class _Callable, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator<packaged_task<_Callable>, _Alloc> + : public true_type {}; + +template <class _Rp, class _Fp> +future<_Rp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__make_deferred_assoc_state(_Fp&& __f) +#else +__make_deferred_assoc_state(_Fp __f) +#endif +{ + unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count> + __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f))); + return future<_Rp>(__h.get()); +} + +template <class _Rp, class _Fp> +future<_Rp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__make_async_assoc_state(_Fp&& __f) +#else +__make_async_assoc_state(_Fp __f) +#endif +{ + unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count> + __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f))); + _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach(); + return future<_Rp>(__h.get()); +} + +template <class _Fp, class... _Args> +class __async_func +{ + tuple<_Fp, _Args...> __f_; + +public: + typedef typename __invoke_of<_Fp, _Args...>::type _Rp; + + _LIBCPP_INLINE_VISIBILITY + explicit __async_func(_Fp&& __f, _Args&&... __args) + : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {} + + _LIBCPP_INLINE_VISIBILITY + __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {} + + _Rp operator()() + { + typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index; + return __execute(_Index()); + } +private: + template <size_t ..._Indices> + _Rp + __execute(__tuple_indices<_Indices...>) + { + return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...); + } +}; + +template <class _Fp, class... _Args> +future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type> +async(launch __policy, _Fp&& __f, _Args&&... __args) +{ + typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF; + typedef typename _BF::_Rp _Rp; + future<_Rp> __r; + if (int(__policy) & int(launch::async)) + __r = _VSTD::__make_async_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)), + __decay_copy(_VSTD::forward<_Args>(__args))...)); + else if (int(__policy) & int(launch::deferred)) + __r = _VSTD::__make_deferred_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)), + __decay_copy(_VSTD::forward<_Args>(__args))...)); + return __r; +} + +template <class _Fp, class... _Args> +inline _LIBCPP_INLINE_VISIBILITY +future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type> +async(_Fp&& __f, _Args&&... __args) +{ + return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f), + _VSTD::forward<_Args>(__args)...); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// shared_future + +template <class _Rp> +class _LIBCPP_VISIBLE shared_future +{ + __assoc_state<_Rp>* __state_; + +public: + _LIBCPP_INLINE_VISIBILITY + shared_future() : __state_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY + shared_future(const shared_future& __rhs) : __state_(__rhs.__state_) + {if (__state_) __state_->__add_shared();} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future(future<_Rp>&& __f) : __state_(__f.__state_) + {__f.__state_ = nullptr;} + _LIBCPP_INLINE_VISIBILITY + shared_future(shared_future&& __rhs) : __state_(__rhs.__state_) + {__rhs.__state_ = nullptr;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~shared_future(); + shared_future& operator=(const shared_future& __rhs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future& operator=(shared_future&& __rhs) + { + shared_future(std::move(__rhs)).swap(*this); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + // retrieving the value + _LIBCPP_INLINE_VISIBILITY + const _Rp& get() const {return __state_->copy();} + + _LIBCPP_INLINE_VISIBILITY + void swap(shared_future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +shared_future<_Rp>::~shared_future() +{ + if (__state_) + __state_->__release_shared(); +} + +template <class _Rp> +shared_future<_Rp>& +shared_future<_Rp>::operator=(const shared_future& __rhs) +{ + if (__rhs.__state_) + __rhs.__state_->__add_shared(); + if (__state_) + __state_->__release_shared(); + __state_ = __rhs.__state_; + return *this; +} + +template <class _Rp> +class _LIBCPP_VISIBLE shared_future<_Rp&> +{ + __assoc_state<_Rp&>* __state_; + +public: + _LIBCPP_INLINE_VISIBILITY + shared_future() : __state_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY + shared_future(const shared_future& __rhs) : __state_(__rhs.__state_) + {if (__state_) __state_->__add_shared();} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future(future<_Rp&>&& __f) : __state_(__f.__state_) + {__f.__state_ = nullptr;} + _LIBCPP_INLINE_VISIBILITY + shared_future(shared_future&& __rhs) : __state_(__rhs.__state_) + {__rhs.__state_ = nullptr;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~shared_future(); + shared_future& operator=(const shared_future& __rhs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future& operator=(shared_future&& __rhs) + { + shared_future(std::move(__rhs)).swap(*this); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + // retrieving the value + _LIBCPP_INLINE_VISIBILITY + _Rp& get() const {return __state_->copy();} + + _LIBCPP_INLINE_VISIBILITY + void swap(shared_future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +shared_future<_Rp&>::~shared_future() +{ + if (__state_) + __state_->__release_shared(); +} + +template <class _Rp> +shared_future<_Rp&>& +shared_future<_Rp&>::operator=(const shared_future& __rhs) +{ + if (__rhs.__state_) + __rhs.__state_->__add_shared(); + if (__state_) + __state_->__release_shared(); + __state_ = __rhs.__state_; + return *this; +} + +template <> +class _LIBCPP_VISIBLE shared_future<void> +{ + __assoc_sub_state* __state_; + +public: + _LIBCPP_INLINE_VISIBILITY + shared_future() : __state_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY + shared_future(const shared_future& __rhs) : __state_(__rhs.__state_) + {if (__state_) __state_->__add_shared();} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future(future<void>&& __f) : __state_(__f.__state_) + {__f.__state_ = nullptr;} + _LIBCPP_INLINE_VISIBILITY + shared_future(shared_future&& __rhs) : __state_(__rhs.__state_) + {__rhs.__state_ = nullptr;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~shared_future(); + shared_future& operator=(const shared_future& __rhs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + shared_future& operator=(shared_future&& __rhs) + { + shared_future(std::move(__rhs)).swap(*this); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + // retrieving the value + _LIBCPP_INLINE_VISIBILITY + void get() const {__state_->copy();} + + _LIBCPP_INLINE_VISIBILITY + void swap(shared_future& __rhs) {_VSTD::swap(__state_, __rhs.__state_);} + + // functions to check state + _LIBCPP_INLINE_VISIBILITY + bool valid() const {return __state_ != nullptr;} + + _LIBCPP_INLINE_VISIBILITY + void wait() const {__state_->wait();} + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const + {return __state_->wait_for(__rel_time);} + template <class _Clock, class _Duration> + _LIBCPP_INLINE_VISIBILITY + future_status + wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const + {return __state_->wait_until(__abs_time);} +}; + +template <class _Rp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) +{ + __x.swap(__y); +} + +template <class _Rp> +inline _LIBCPP_INLINE_VISIBILITY +shared_future<_Rp> +future<_Rp>::share() +{ + return shared_future<_Rp>(_VSTD::move(*this)); +} + +template <class _Rp> +inline _LIBCPP_INLINE_VISIBILITY +shared_future<_Rp&> +future<_Rp&>::share() +{ + return shared_future<_Rp&>(_VSTD::move(*this)); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +inline _LIBCPP_INLINE_VISIBILITY +shared_future<void> +future<void>::share() +{ + return shared_future<void>(_VSTD::move(*this)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_FUTURE diff --git a/contrib/libc++/include/initializer_list b/contrib/libc++/include/initializer_list new file mode 100644 index 0000000..2f88514 --- /dev/null +++ b/contrib/libc++/include/initializer_list @@ -0,0 +1,105 @@ +// -*- C++ -*- +//===----------------------- initializer_list -----------------------------===// +// +// 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_INITIALIZER_LIST +#define _LIBCPP_INITIALIZER_LIST + +/* + initializer_list synopsis + +namespace std +{ + +template<class E> +class initializer_list +{ +public: + typedef E value_type; + typedef const E& reference; + typedef const E& const_reference; + typedef size_t size_type; + + typedef const E* iterator; + typedef const E* const_iterator; + + initializer_list() noexcept; + + size_t size() const noexcept; + const E* begin() const noexcept; + const E* end() const noexcept; +}; + +template<class E> const E* begin(initializer_list<E> il) noexcept; +template<class E> const E* end(initializer_list<E> il) noexcept; + +} // std + +*/ + +#include <__config> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not versioned +{ + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _Ep> +class _LIBCPP_VISIBLE initializer_list +{ + const _Ep* __begin_; + size_t __size_; + + _LIBCPP_ALWAYS_INLINE + initializer_list(const _Ep* __b, size_t __s) _NOEXCEPT + : __begin_(__b), + __size_(__s) + {} +public: + typedef _Ep value_type; + typedef const _Ep& reference; + typedef const _Ep& const_reference; + typedef size_t size_type; + + typedef const _Ep* iterator; + typedef const _Ep* const_iterator; + + _LIBCPP_ALWAYS_INLINE initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {} + + _LIBCPP_ALWAYS_INLINE size_t size() const _NOEXCEPT {return __size_;} + _LIBCPP_ALWAYS_INLINE const _Ep* begin() const _NOEXCEPT {return __begin_;} + _LIBCPP_ALWAYS_INLINE const _Ep* end() const _NOEXCEPT {return __begin_ + __size_;} +}; + +template<class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +const _Ep* +begin(initializer_list<_Ep> __il) _NOEXCEPT +{ + return __il.begin(); +} + +template<class _Ep> +inline _LIBCPP_INLINE_VISIBILITY +const _Ep* +end(initializer_list<_Ep> __il) _NOEXCEPT +{ + return __il.end(); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +} // std + +#endif // _LIBCPP_INITIALIZER_LIST diff --git a/contrib/libc++/include/iomanip b/contrib/libc++/include/iomanip new file mode 100644 index 0000000..0c58e19 --- /dev/null +++ b/contrib/libc++/include/iomanip @@ -0,0 +1,504 @@ +// -*- C++ -*- +//===--------------------------- iomanip ----------------------------------===// +// +// 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_IOMANIP +#define _LIBCPP_IOMANIP + +/* + iomanip synopsis + +// types T1, T2, ... are unspecified implementation types +T1 resetiosflags(ios_base::fmtflags mask); +T2 setiosflags (ios_base::fmtflags mask); +T3 setbase(int base); +template<charT> T4 setfill(charT c); +T5 setprecision(int n); +T6 setw(int n); +template <class moneyT> T7 get_money(moneyT& mon, bool intl = false); +template <class charT, class moneyT> T8 put_money(const moneyT& mon, bool intl = false); +template <class charT> T9 get_time(struct tm* tmb, const charT* fmt); +template <class charT> T10 put_time(const struct tm* tmb, const charT* fmt); + +} // std + +*/ + +#include <__config> +#include <istream> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// resetiosflags + +class __iom_t1 +{ + ios_base::fmtflags __mask_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t1(ios_base::fmtflags __m) : __mask_(__m) {} + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t1& __x) + { + __is.unsetf(__x.__mask_); + return __is; + } + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t1& __x) + { + __os.unsetf(__x.__mask_); + return __os; + } +}; + +inline _LIBCPP_INLINE_VISIBILITY +__iom_t1 +resetiosflags(ios_base::fmtflags __mask) +{ + return __iom_t1(__mask); +} + +// setiosflags + +class __iom_t2 +{ + ios_base::fmtflags __mask_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t2(ios_base::fmtflags __m) : __mask_(__m) {} + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t2& __x) + { + __is.setf(__x.__mask_); + return __is; + } + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t2& __x) + { + __os.setf(__x.__mask_); + return __os; + } +}; + +inline _LIBCPP_INLINE_VISIBILITY +__iom_t2 +setiosflags(ios_base::fmtflags __mask) +{ + return __iom_t2(__mask); +} + +// setbase + +class __iom_t3 +{ + int __base_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t3(int __b) : __base_(__b) {} + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t3& __x) + { + __is.setf(__x.__base_ == 8 ? ios_base::oct : + __x.__base_ == 10 ? ios_base::dec : + __x.__base_ == 16 ? ios_base::hex : + ios_base::fmtflags(0), ios_base::basefield); + return __is; + } + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t3& __x) + { + __os.setf(__x.__base_ == 8 ? ios_base::oct : + __x.__base_ == 10 ? ios_base::dec : + __x.__base_ == 16 ? ios_base::hex : + ios_base::fmtflags(0), ios_base::basefield); + return __os; + } +}; + +inline _LIBCPP_INLINE_VISIBILITY +__iom_t3 +setbase(int __base) +{ + return __iom_t3(__base); +} + +// setfill + +template<class _CharT> +class __iom_t4 +{ + _CharT __fill_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t4(_CharT __c) : __fill_(__c) {} + + template <class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t4& __x) + { + __os.fill(__x.__fill_); + return __os; + } +}; + +template<class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +__iom_t4<_CharT> +setfill(_CharT __c) +{ + return __iom_t4<_CharT>(__c); +} + +// setprecision + +class __iom_t5 +{ + int __n_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t5(int __n) : __n_(__n) {} + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t5& __x) + { + __is.precision(__x.__n_); + return __is; + } + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t5& __x) + { + __os.precision(__x.__n_); + return __os; + } +}; + +inline _LIBCPP_INLINE_VISIBILITY +__iom_t5 +setprecision(int __n) +{ + return __iom_t5(__n); +} + +// setw + +class __iom_t6 +{ + int __n_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __iom_t6(int __n) : __n_(__n) {} + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t6& __x) + { + __is.width(__x.__n_); + return __is; + } + + template <class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t6& __x) + { + __os.width(__x.__n_); + return __os; + } +}; + +inline _LIBCPP_INLINE_VISIBILITY +__iom_t6 +setw(int __n) +{ + return __iom_t6(__n); +} + +// get_money + +template <class _MoneyT> class __iom_t7; + +template <class _CharT, class _Traits, class _MoneyT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x); + +template <class _MoneyT> +class __iom_t7 +{ + _MoneyT& __mon_; + bool __intl_; +public: + _LIBCPP_INLINE_VISIBILITY + __iom_t7(_MoneyT& __mon, bool __intl) + : __mon_(__mon), __intl_(__intl) {} + + template <class _CharT, class _Traits, class _Mp> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_Mp>& __x); +}; + +template <class _CharT, class _Traits, class _MoneyT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_MoneyT>& __x) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __s(__is); + if (__s) + { + typedef istreambuf_iterator<_CharT, _Traits> _Ip; + typedef money_get<_CharT, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + const _Fp& __mf = use_facet<_Fp>(__is.getloc()); + __mf.get(_Ip(__is), _Ip(), __x.__intl_, __is, __err, __x.__mon_); + __is.setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template <class _MoneyT> +inline _LIBCPP_INLINE_VISIBILITY +__iom_t7<_MoneyT> +get_money(_MoneyT& __mon, bool __intl = false) +{ + return __iom_t7<_MoneyT>(__mon, __intl); +} + +// put_money + +template <class _MoneyT> class __iom_t8; + +template <class _CharT, class _Traits, class _MoneyT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x); + +template <class _MoneyT> +class __iom_t8 +{ + const _MoneyT& __mon_; + bool __intl_; +public: + _LIBCPP_INLINE_VISIBILITY + __iom_t8(const _MoneyT& __mon, bool __intl) + : __mon_(__mon), __intl_(__intl) {} + + template <class _CharT, class _Traits, class _Mp> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_Mp>& __x); +}; + +template <class _CharT, class _Traits, class _MoneyT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_MoneyT>& __x) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Op; + typedef money_put<_CharT, _Op> _Fp; + const _Fp& __mf = use_facet<_Fp>(__os.getloc()); + if (__mf.put(_Op(__os), __x.__intl_, __os, __os.fill(), __x.__mon_).failed()) + __os.setstate(ios_base::badbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template <class _MoneyT> +inline _LIBCPP_INLINE_VISIBILITY +__iom_t8<_MoneyT> +put_money(const _MoneyT& __mon, bool __intl = false) +{ + return __iom_t8<_MoneyT>(__mon, __intl); +} + +// get_time + +template <class _CharT> class __iom_t9; + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x); + +template <class _CharT> +class __iom_t9 +{ + tm* __tm_; + const _CharT* __fmt_; +public: + _LIBCPP_INLINE_VISIBILITY + __iom_t9(tm* __tm, const _CharT* __fmt) + : __tm_(__tm), __fmt_(__fmt) {} + + template <class _Cp, class _Traits> + friend + basic_istream<_Cp, _Traits>& + operator>>(basic_istream<_Cp, _Traits>& __is, const __iom_t9<_Cp>& __x); +}; + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t9<_CharT>& __x) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __s(__is); + if (__s) + { + typedef istreambuf_iterator<_CharT, _Traits> _Ip; + typedef time_get<_CharT, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + const _Fp& __tf = use_facet<_Fp>(__is.getloc()); + __tf.get(_Ip(__is), _Ip(), __is, __err, __x.__tm_, + __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)); + __is.setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +__iom_t9<_CharT> +get_time(tm* __tm, const _CharT* __fmt) +{ + return __iom_t9<_CharT>(__tm, __fmt); +} + +// put_time + +template <class _CharT> class __iom_t10; + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x); + +template <class _CharT> +class __iom_t10 +{ + const tm* __tm_; + const _CharT* __fmt_; +public: + _LIBCPP_INLINE_VISIBILITY + __iom_t10(const tm* __tm, const _CharT* __fmt) + : __tm_(__tm), __fmt_(__fmt) {} + + template <class _Cp, class _Traits> + friend + basic_ostream<_Cp, _Traits>& + operator<<(basic_ostream<_Cp, _Traits>& __os, const __iom_t10<_Cp>& __x); +}; + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t10<_CharT>& __x) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Op; + typedef time_put<_CharT, _Op> _Fp; + const _Fp& __tf = use_facet<_Fp>(__os.getloc()); + if (__tf.put(_Op(__os), __os, __os.fill(), __x.__tm_, + __x.__fmt_, __x.__fmt_ + _Traits::length(__x.__fmt_)).failed()) + __os.setstate(ios_base::badbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +__iom_t10<_CharT> +put_time(const tm* __tm, const _CharT* __fmt) +{ + return __iom_t10<_CharT>(__tm, __fmt); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_IOMANIP diff --git a/contrib/libc++/include/ios b/contrib/libc++/include/ios new file mode 100644 index 0000000..51d50870 --- /dev/null +++ b/contrib/libc++/include/ios @@ -0,0 +1,986 @@ +// -*- C++ -*- +//===---------------------------- ios -------------------------------------===// +// +// 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_IOS +#define _LIBCPP_IOS + +/* + ios synopsis + +#include <iosfwd> + +namespace std +{ + +typedef OFF_T streamoff; +typedef SZ_T streamsize; +template <class stateT> class fpos; + +class ios_base +{ +public: + class failure; + + typedef T1 fmtflags; + static const fmtflags boolalpha; + static const fmtflags dec; + static const fmtflags fixed; + static const fmtflags hex; + static const fmtflags internal; + static const fmtflags left; + static const fmtflags oct; + static const fmtflags right; + static const fmtflags scientific; + static const fmtflags showbase; + static const fmtflags showpoint; + static const fmtflags showpos; + static const fmtflags skipws; + static const fmtflags unitbuf; + static const fmtflags uppercase; + static const fmtflags adjustfield; + static const fmtflags basefield; + static const fmtflags floatfield; + + typedef T2 iostate; + static const iostate badbit; + static const iostate eofbit; + static const iostate failbit; + static const iostate goodbit; + + typedef T3 openmode; + static const openmode app; + static const openmode ate; + static const openmode binary; + static const openmode in; + static const openmode out; + static const openmode trunc; + + typedef T4 seekdir; + static const seekdir beg; + static const seekdir cur; + static const seekdir end; + + class Init; + + // 27.5.2.2 fmtflags state: + fmtflags flags() const; + fmtflags flags(fmtflags fmtfl); + fmtflags setf(fmtflags fmtfl); + fmtflags setf(fmtflags fmtfl, fmtflags mask); + void unsetf(fmtflags mask); + + streamsize precision() const; + streamsize precision(streamsize prec); + streamsize width() const; + streamsize width(streamsize wide); + + // 27.5.2.3 locales: + locale imbue(const locale& loc); + locale getloc() const; + + // 27.5.2.5 storage: + static int xalloc(); + long& iword(int index); + void*& pword(int index); + + // destructor + virtual ~ios_base(); + + // 27.5.2.6 callbacks; + enum event { erase_event, imbue_event, copyfmt_event }; + typedef void (*event_callback)(event, ios_base&, int index); + void register_callback(event_callback fn, int index); + + ios_base(const ios_base&) = delete; + ios_base& operator=(const ios_base&) = delete; + + static bool sync_with_stdio(bool sync = true); + +protected: + ios_base(); +}; + +template <class charT, class traits = char_traits<charT> > +class basic_ios + : public ios_base +{ +public: + // types: + typedef charT char_type; + typedef typename traits::int_type int_type; + typedef typename traits::pos_type pos_type; + typedef typename traits::off_type off_type; + typedef traits traits_type; + + operator unspecified-bool-type() const; + bool operator!() const; + iostate rdstate() const; + void clear(iostate state = goodbit); + void setstate(iostate state); + bool good() const; + bool eof() const; + bool fail() const; + bool bad() const; + + iostate exceptions() const; + void exceptions(iostate except); + + // 27.5.4.1 Constructor/destructor: + explicit basic_ios(basic_streambuf<charT,traits>* sb); + virtual ~basic_ios(); + + // 27.5.4.2 Members: + basic_ostream<charT,traits>* tie() const; + basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr); + + basic_streambuf<charT,traits>* rdbuf() const; + basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb); + + basic_ios& copyfmt(const basic_ios& rhs); + + char_type fill() const; + char_type fill(char_type ch); + + locale imbue(const locale& loc); + + char narrow(char_type c, char dfault) const; + char_type widen(char c) const; + + basic_ios(const basic_ios& ) = delete; + basic_ios& operator=(const basic_ios&) = delete; + +protected: + basic_ios(); + void init(basic_streambuf<charT,traits>* sb); + void move(basic_ios& rhs); + void swap(basic_ios& rhs); + void set_rdbuf(basic_streambuf<charT, traits>* sb); +}; + +// 27.5.5, manipulators: +ios_base& boolalpha (ios_base& str); +ios_base& noboolalpha(ios_base& str); +ios_base& showbase (ios_base& str); +ios_base& noshowbase (ios_base& str); +ios_base& showpoint (ios_base& str); +ios_base& noshowpoint(ios_base& str); +ios_base& showpos (ios_base& str); +ios_base& noshowpos (ios_base& str); +ios_base& skipws (ios_base& str); +ios_base& noskipws (ios_base& str); +ios_base& uppercase (ios_base& str); +ios_base& nouppercase(ios_base& str); +ios_base& unitbuf (ios_base& str); +ios_base& nounitbuf (ios_base& str); + +// 27.5.5.2 adjustfield: +ios_base& internal (ios_base& str); +ios_base& left (ios_base& str); +ios_base& right (ios_base& str); + +// 27.5.5.3 basefield: +ios_base& dec (ios_base& str); +ios_base& hex (ios_base& str); +ios_base& oct (ios_base& str); + +// 27.5.5.4 floatfield: +ios_base& fixed (ios_base& str); +ios_base& scientific (ios_base& str); +ios_base& hexfloat (ios_base& str); +ios_base& defaultfloat(ios_base& str); + +// 27.5.5.5 error reporting: +enum class io_errc +{ + stream = 1 +}; + +concept_map ErrorCodeEnum<io_errc> { }; +error_code make_error_code(io_errc e); +error_condition make_error_condition(io_errc e); +storage-class-specifier const error_category& iostream_category; + +} // std + +*/ + +#include <__config> +#include <iosfwd> +#include <__locale> +#include <system_error> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +typedef ptrdiff_t streamsize; + +class _LIBCPP_VISIBLE ios_base +{ +public: + class failure; + + typedef unsigned int fmtflags; + static const fmtflags boolalpha = 0x0001; + static const fmtflags dec = 0x0002; + static const fmtflags fixed = 0x0004; + static const fmtflags hex = 0x0008; + static const fmtflags internal = 0x0010; + static const fmtflags left = 0x0020; + static const fmtflags oct = 0x0040; + static const fmtflags right = 0x0080; + static const fmtflags scientific = 0x0100; + static const fmtflags showbase = 0x0200; + static const fmtflags showpoint = 0x0400; + static const fmtflags showpos = 0x0800; + static const fmtflags skipws = 0x1000; + static const fmtflags unitbuf = 0x2000; + static const fmtflags uppercase = 0x4000; + static const fmtflags adjustfield = left | right | internal; + static const fmtflags basefield = dec | oct | hex; + static const fmtflags floatfield = scientific | fixed; + + typedef unsigned int iostate; + typedef iostate io_state; + static const iostate badbit = 0x1; + static const iostate eofbit = 0x2; + static const iostate failbit = 0x4; + static const iostate goodbit = 0x0; + + typedef unsigned int openmode; + typedef openmode open_mode; + static const openmode app = 0x01; + static const openmode ate = 0x02; + static const openmode binary = 0x04; + static const openmode in = 0x08; + static const openmode out = 0x10; + static const openmode trunc = 0x20; + + enum seekdir {beg, cur, end}; + typedef seekdir seek_dir; + + typedef _VSTD::streamoff streamoff; + typedef _VSTD::streampos streampos; + + class Init; + + // 27.5.2.2 fmtflags state: + _LIBCPP_INLINE_VISIBILITY fmtflags flags() const; + _LIBCPP_INLINE_VISIBILITY fmtflags flags(fmtflags __fmtfl); + _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl); + _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl, fmtflags __mask); + _LIBCPP_INLINE_VISIBILITY void unsetf(fmtflags __mask); + + _LIBCPP_INLINE_VISIBILITY streamsize precision() const; + _LIBCPP_INLINE_VISIBILITY streamsize precision(streamsize __prec); + _LIBCPP_INLINE_VISIBILITY streamsize width() const; + _LIBCPP_INLINE_VISIBILITY streamsize width(streamsize __wide); + + // 27.5.2.3 locales: + locale imbue(const locale& __loc); + locale getloc() const; + + // 27.5.2.5 storage: + static int xalloc(); + long& iword(int __index); + void*& pword(int __index); + + // destructor + virtual ~ios_base(); + + // 27.5.2.6 callbacks; + enum event { erase_event, imbue_event, copyfmt_event }; + typedef void (*event_callback)(event, ios_base&, int __index); + void register_callback(event_callback __fn, int __index); + +private: + ios_base(const ios_base&); // = delete; + ios_base& operator=(const ios_base&); // = delete; + +public: + static bool sync_with_stdio(bool __sync = true); + + _LIBCPP_INLINE_VISIBILITY iostate rdstate() const; + void clear(iostate __state = goodbit); + _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state); + + _LIBCPP_INLINE_VISIBILITY bool good() const; + _LIBCPP_INLINE_VISIBILITY bool eof() const; + _LIBCPP_INLINE_VISIBILITY bool fail() const; + _LIBCPP_INLINE_VISIBILITY bool bad() const; + + _LIBCPP_INLINE_VISIBILITY iostate exceptions() const; + _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __except); + + void __set_badbit_and_consider_rethrow(); + void __set_failbit_and_consider_rethrow(); + +protected: + _LIBCPP_INLINE_VISIBILITY + ios_base() {// purposefully does no initialization + } + + void init(void* __sb); + _LIBCPP_ALWAYS_INLINE void* rdbuf() const {return __rdbuf_;} + + _LIBCPP_ALWAYS_INLINE + void rdbuf(void* __sb) + { + __rdbuf_ = __sb; + clear(); + } + + void __call_callbacks(event); + void copyfmt(const ios_base&); + void move(ios_base&); + void swap(ios_base&); + + _LIBCPP_ALWAYS_INLINE + void set_rdbuf(void* __sb) + { + __rdbuf_ = __sb; + } + +private: + // All data members must be scalars + fmtflags __fmtflags_; + streamsize __precision_; + streamsize __width_; + iostate __rdstate_; + iostate __exceptions_; + void* __rdbuf_; + void* __loc_; + event_callback* __fn_; + int* __index_; + size_t __event_size_; + size_t __event_cap_; + static int __xindex_; + long* __iarray_; + size_t __iarray_size_; + size_t __iarray_cap_; + void** __parray_; + size_t __parray_size_; + size_t __parray_cap_; +}; + +//enum class io_errc +_LIBCPP_DECLARE_STRONG_ENUM(io_errc) +{ + stream = 1 +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc) + +template <> +struct _LIBCPP_VISIBLE is_error_code_enum<io_errc> : public true_type { }; + +#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS +template <> +struct _LIBCPP_VISIBLE is_error_code_enum<io_errc::_> : public true_type { }; +#endif + +_LIBCPP_VISIBLE +const error_category& iostream_category(); + +inline _LIBCPP_INLINE_VISIBILITY +error_code +make_error_code(io_errc __e) +{ + return error_code(static_cast<int>(__e), iostream_category()); +} + +inline _LIBCPP_INLINE_VISIBILITY +error_condition +make_error_condition(io_errc __e) +{ + return error_condition(static_cast<int>(__e), iostream_category()); +} + +class _LIBCPP_EXCEPTION_ABI ios_base::failure + : public system_error +{ +public: + explicit failure(const string& __msg, const error_code& __ec = io_errc::stream); + explicit failure(const char* __msg, const error_code& __ec = io_errc::stream); + virtual ~failure() throw(); +}; + +class _LIBCPP_VISIBLE ios_base::Init +{ +public: + Init(); + ~Init(); +}; + +// fmtflags + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::fmtflags +ios_base::flags() const +{ + return __fmtflags_; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::fmtflags +ios_base::flags(fmtflags __fmtfl) +{ + fmtflags __r = __fmtflags_; + __fmtflags_ = __fmtfl; + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::fmtflags +ios_base::setf(fmtflags __fmtfl) +{ + fmtflags __r = __fmtflags_; + __fmtflags_ |= __fmtfl; + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +void +ios_base::unsetf(fmtflags __mask) +{ + __fmtflags_ &= ~__mask; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::fmtflags +ios_base::setf(fmtflags __fmtfl, fmtflags __mask) +{ + fmtflags __r = __fmtflags_; + unsetf(__mask); + __fmtflags_ |= __fmtfl & __mask; + return __r; +} + +// precision + +inline _LIBCPP_INLINE_VISIBILITY +streamsize +ios_base::precision() const +{ + return __precision_; +} + +inline _LIBCPP_INLINE_VISIBILITY +streamsize +ios_base::precision(streamsize __prec) +{ + streamsize __r = __precision_; + __precision_ = __prec; + return __r; +} + +// width + +inline _LIBCPP_INLINE_VISIBILITY +streamsize +ios_base::width() const +{ + return __width_; +} + +inline _LIBCPP_INLINE_VISIBILITY +streamsize +ios_base::width(streamsize __wide) +{ + streamsize __r = __width_; + __width_ = __wide; + return __r; +} + +// iostate + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::iostate +ios_base::rdstate() const +{ + return __rdstate_; +} + +inline _LIBCPP_INLINE_VISIBILITY +void +ios_base::setstate(iostate __state) +{ + clear(__rdstate_ | __state); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +ios_base::good() const +{ + return __rdstate_ == 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +ios_base::eof() const +{ + return __rdstate_ & eofbit; +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +ios_base::fail() const +{ + return __rdstate_ & (failbit | badbit); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +ios_base::bad() const +{ + return __rdstate_ & badbit; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base::iostate +ios_base::exceptions() const +{ + return __exceptions_; +} + +inline _LIBCPP_INLINE_VISIBILITY +void +ios_base::exceptions(iostate __except) +{ + __exceptions_ = __except; + clear(__rdstate_); +} + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_ios + : public ios_base +{ +public: + // types: + typedef _CharT char_type; + typedef _Traits traits_type; + + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + _LIBCPP_ALWAYS_INLINE + _LIBCPP_EXPLICIT + operator bool() const {return !fail();} + _LIBCPP_ALWAYS_INLINE bool operator!() const {return fail();} + _LIBCPP_ALWAYS_INLINE iostate rdstate() const {return ios_base::rdstate();} + _LIBCPP_ALWAYS_INLINE void clear(iostate __state = goodbit) {ios_base::clear(__state);} + _LIBCPP_ALWAYS_INLINE void setstate(iostate __state) {ios_base::setstate(__state);} + _LIBCPP_ALWAYS_INLINE bool good() const {return ios_base::good();} + _LIBCPP_ALWAYS_INLINE bool eof() const {return ios_base::eof();} + _LIBCPP_ALWAYS_INLINE bool fail() const {return ios_base::fail();} + _LIBCPP_ALWAYS_INLINE bool bad() const {return ios_base::bad();} + + _LIBCPP_ALWAYS_INLINE iostate exceptions() const {return ios_base::exceptions();} + _LIBCPP_ALWAYS_INLINE void exceptions(iostate __except) {ios_base::exceptions(__except);} + + // 27.5.4.1 Constructor/destructor: + _LIBCPP_INLINE_VISIBILITY + explicit basic_ios(basic_streambuf<char_type,traits_type>* __sb); + virtual ~basic_ios(); + + // 27.5.4.2 Members: + _LIBCPP_INLINE_VISIBILITY + basic_ostream<char_type, traits_type>* tie() const; + _LIBCPP_INLINE_VISIBILITY + basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr); + + _LIBCPP_INLINE_VISIBILITY + basic_streambuf<char_type, traits_type>* rdbuf() const; + _LIBCPP_INLINE_VISIBILITY + basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb); + + basic_ios& copyfmt(const basic_ios& __rhs); + + _LIBCPP_INLINE_VISIBILITY + char_type fill() const; + _LIBCPP_INLINE_VISIBILITY + char_type fill(char_type __ch); + + _LIBCPP_INLINE_VISIBILITY + locale imbue(const locale& __loc); + + _LIBCPP_INLINE_VISIBILITY + char narrow(char_type __c, char __dfault) const; + _LIBCPP_INLINE_VISIBILITY + char_type widen(char __c) const; + +protected: + _LIBCPP_ALWAYS_INLINE + basic_ios() {// purposefully does no initialization + } + _LIBCPP_INLINE_VISIBILITY + void init(basic_streambuf<char_type, traits_type>* __sb); + + _LIBCPP_INLINE_VISIBILITY + void move(basic_ios& __rhs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_ALWAYS_INLINE + void move(basic_ios&& __rhs) {move(__rhs);} +#endif + _LIBCPP_INLINE_VISIBILITY + void swap(basic_ios& __rhs); + _LIBCPP_INLINE_VISIBILITY + void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb); +private: + basic_ostream<char_type, traits_type>* __tie_; + char_type __fill_; +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type,traits_type>* __sb) +{ + init(__sb); +} + +template <class _CharT, class _Traits> +basic_ios<_CharT, _Traits>::~basic_ios() +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb) +{ + ios_base::init(__sb); + __tie_ = 0; + __fill_ = widen(' '); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>* +basic_ios<_CharT, _Traits>::tie() const +{ + return __tie_; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>* +basic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr) +{ + basic_ostream<char_type, traits_type>* __r = __tie_; + __tie_ = __tiestr; + return __r; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_streambuf<_CharT, _Traits>* +basic_ios<_CharT, _Traits>::rdbuf() const +{ + return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf()); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_streambuf<_CharT, _Traits>* +basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb) +{ + basic_streambuf<char_type, traits_type>* __r = rdbuf(); + ios_base::rdbuf(__sb); + return __r; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +locale +basic_ios<_CharT, _Traits>::imbue(const locale& __loc) +{ + locale __r = getloc(); + ios_base::imbue(__loc); + if (rdbuf()) + rdbuf()->pubimbue(__loc); + return __r; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +char +basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const +{ + return use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +_CharT +basic_ios<_CharT, _Traits>::widen(char __c) const +{ + return use_facet<ctype<char_type> >(getloc()).widen(__c); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +_CharT +basic_ios<_CharT, _Traits>::fill() const +{ + return __fill_; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +_CharT +basic_ios<_CharT, _Traits>::fill(char_type __ch) +{ + char_type __r = __fill_; + __fill_ = __ch; + return __r; +} + +template <class _CharT, class _Traits> +basic_ios<_CharT, _Traits>& +basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) +{ + if (this != &__rhs) + { + __call_callbacks(erase_event); + ios_base::copyfmt(__rhs); + __tie_ = __rhs.__tie_; + __fill_ = __rhs.__fill_; + __call_callbacks(copyfmt_event); + exceptions(__rhs.exceptions()); + } + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ios<_CharT, _Traits>::move(basic_ios& __rhs) +{ + ios_base::move(__rhs); + __tie_ = __rhs.__tie_; + __rhs.__tie_ = 0; + __fill_ = __rhs.__fill_; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) +{ + ios_base::swap(__rhs); + _VSTD::swap(__tie_, __rhs.__tie_); + _VSTD::swap(__fill_, __rhs.__fill_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb) +{ + ios_base::set_rdbuf(__sb); +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +boolalpha(ios_base& __str) +{ + __str.setf(ios_base::boolalpha); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +noboolalpha(ios_base& __str) +{ + __str.unsetf(ios_base::boolalpha); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +showbase(ios_base& __str) +{ + __str.setf(ios_base::showbase); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +noshowbase(ios_base& __str) +{ + __str.unsetf(ios_base::showbase); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +showpoint(ios_base& __str) +{ + __str.setf(ios_base::showpoint); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +noshowpoint(ios_base& __str) +{ + __str.unsetf(ios_base::showpoint); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +showpos(ios_base& __str) +{ + __str.setf(ios_base::showpos); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +noshowpos(ios_base& __str) +{ + __str.unsetf(ios_base::showpos); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +skipws(ios_base& __str) +{ + __str.setf(ios_base::skipws); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +noskipws(ios_base& __str) +{ + __str.unsetf(ios_base::skipws); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +uppercase(ios_base& __str) +{ + __str.setf(ios_base::uppercase); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +nouppercase(ios_base& __str) +{ + __str.unsetf(ios_base::uppercase); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +unitbuf(ios_base& __str) +{ + __str.setf(ios_base::unitbuf); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +nounitbuf(ios_base& __str) +{ + __str.unsetf(ios_base::unitbuf); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +internal(ios_base& __str) +{ + __str.setf(ios_base::internal, ios_base::adjustfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +left(ios_base& __str) +{ + __str.setf(ios_base::left, ios_base::adjustfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +right(ios_base& __str) +{ + __str.setf(ios_base::right, ios_base::adjustfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +dec(ios_base& __str) +{ + __str.setf(ios_base::dec, ios_base::basefield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +hex(ios_base& __str) +{ + __str.setf(ios_base::hex, ios_base::basefield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +oct(ios_base& __str) +{ + __str.setf(ios_base::oct, ios_base::basefield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +fixed(ios_base& __str) +{ + __str.setf(ios_base::fixed, ios_base::floatfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +scientific(ios_base& __str) +{ + __str.setf(ios_base::scientific, ios_base::floatfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +hexfloat(ios_base& __str) +{ + __str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield); + return __str; +} + +inline _LIBCPP_INLINE_VISIBILITY +ios_base& +defaultfloat(ios_base& __str) +{ + __str.unsetf(ios_base::floatfield); + return __str; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_IOS diff --git a/contrib/libc++/include/iosfwd b/contrib/libc++/include/iosfwd new file mode 100644 index 0000000..7e5ac73 --- /dev/null +++ b/contrib/libc++/include/iosfwd @@ -0,0 +1,194 @@ +// -*- C++ -*- +//===--------------------------- iosfwd -----------------------------------===// +// +// 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_IOSFWD +#define _LIBCPP_IOSFWD + +/* + iosfwd synopsis + +namespace std +{ + +template<class charT> struct char_traits; +template<class T> class allocator; + +class ios_base; +template <class charT, class traits = char_traits<charT> > class basic_ios; + +template <class charT, class traits = char_traits<charT> > class basic_streambuf; +template <class charT, class traits = char_traits<charT> > class basic_istream; +template <class charT, class traits = char_traits<charT> > class basic_ostream; +template <class charT, class traits = char_traits<charT> > class basic_iostream; + +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > + class basic_stringbuf; +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > + class basic_istringstream; +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > + class basic_ostringstream; +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > + class basic_stringstream; + +template <class charT, class traits = char_traits<charT> > class basic_filebuf; +template <class charT, class traits = char_traits<charT> > class basic_ifstream; +template <class charT, class traits = char_traits<charT> > class basic_ofstream; +template <class charT, class traits = char_traits<charT> > class basic_fstream; + +template <class charT, class traits = char_traits<charT> > class istreambuf_iterator; +template <class charT, class traits = char_traits<charT> > class ostreambuf_iterator; + +typedef basic_ios<char> ios; +typedef basic_ios<wchar_t> wios; + +typedef basic_streambuf<char> streambuf; +typedef basic_istream<char> istream; +typedef basic_ostream<char> ostream; +typedef basic_iostream<char> iostream; + +typedef basic_stringbuf<char> stringbuf; +typedef basic_istringstream<char> istringstream; +typedef basic_ostringstream<char> ostringstream; +typedef basic_stringstream<char> stringstream; + +typedef basic_filebuf<char> filebuf; +typedef basic_ifstream<char> ifstream; +typedef basic_ofstream<char> ofstream; +typedef basic_fstream<char> fstream; + +typedef basic_streambuf<wchar_t> wstreambuf; +typedef basic_istream<wchar_t> wistream; +typedef basic_ostream<wchar_t> wostream; +typedef basic_iostream<wchar_t> wiostream; + +typedef basic_stringbuf<wchar_t> wstringbuf; +typedef basic_istringstream<wchar_t> wistringstream; +typedef basic_ostringstream<wchar_t> wostringstream; +typedef basic_stringstream<wchar_t> wstringstream; + +typedef basic_filebuf<wchar_t> wfilebuf; +typedef basic_ifstream<wchar_t> wifstream; +typedef basic_ofstream<wchar_t> wofstream; +typedef basic_fstream<wchar_t> wfstream; + +template <class state> class fpos; +typedef fpos<char_traits<char>::state_type> streampos; +typedef fpos<char_traits<wchar_t>::state_type> wstreampos; + +} // std + +*/ + +#include <__config> +#include <wchar.h> // for mbstate_t + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class ios_base; + +template<class _CharT> struct _LIBCPP_VISIBLE char_traits; +template<class _Tp> class _LIBCPP_VISIBLE allocator; + +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_ios; + +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_streambuf; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_istream; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_ostream; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_iostream; + +template <class _CharT, class _Traits = char_traits<_CharT>, + class _Allocator = allocator<_CharT> > + class _LIBCPP_VISIBLE basic_stringbuf; +template <class _CharT, class _Traits = char_traits<_CharT>, + class _Allocator = allocator<_CharT> > + class _LIBCPP_VISIBLE basic_istringstream; +template <class _CharT, class _Traits = char_traits<_CharT>, + class _Allocator = allocator<_CharT> > + class _LIBCPP_VISIBLE basic_ostringstream; +template <class _CharT, class _Traits = char_traits<_CharT>, + class _Allocator = allocator<_CharT> > + class _LIBCPP_VISIBLE basic_stringstream; + +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_filebuf; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_ifstream; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_ofstream; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE basic_fstream; + +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE istreambuf_iterator; +template <class _CharT, class _Traits = char_traits<_CharT> > + class _LIBCPP_VISIBLE ostreambuf_iterator; + +typedef basic_ios<char> ios; +typedef basic_ios<wchar_t> wios; + +typedef basic_streambuf<char> streambuf; +typedef basic_istream<char> istream; +typedef basic_ostream<char> ostream; +typedef basic_iostream<char> iostream; + +typedef basic_stringbuf<char> stringbuf; +typedef basic_istringstream<char> istringstream; +typedef basic_ostringstream<char> ostringstream; +typedef basic_stringstream<char> stringstream; + +typedef basic_filebuf<char> filebuf; +typedef basic_ifstream<char> ifstream; +typedef basic_ofstream<char> ofstream; +typedef basic_fstream<char> fstream; + +typedef basic_streambuf<wchar_t> wstreambuf; +typedef basic_istream<wchar_t> wistream; +typedef basic_ostream<wchar_t> wostream; +typedef basic_iostream<wchar_t> wiostream; + +typedef basic_stringbuf<wchar_t> wstringbuf; +typedef basic_istringstream<wchar_t> wistringstream; +typedef basic_ostringstream<wchar_t> wostringstream; +typedef basic_stringstream<wchar_t> wstringstream; + +typedef basic_filebuf<wchar_t> wfilebuf; +typedef basic_ifstream<wchar_t> wifstream; +typedef basic_ofstream<wchar_t> wofstream; +typedef basic_fstream<wchar_t> wfstream; + +template <class _State> class _LIBCPP_VISIBLE fpos; +typedef fpos<mbstate_t> streampos; +typedef fpos<mbstate_t> wstreampos; +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS +typedef fpos<mbstate_t> u16streampos; +typedef fpos<mbstate_t> u32streampos; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +typedef long long streamoff; // for char_traits in <string> + +template <class _CharT, // for <stdexcept> + class _Traits = char_traits<_CharT>, + class _Allocator = allocator<_CharT> > + class _LIBCPP_VISIBLE basic_string; +typedef basic_string<char, char_traits<char>, allocator<char> > string; +typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_IOSFWD diff --git a/contrib/libc++/include/iostream b/contrib/libc++/include/iostream new file mode 100644 index 0000000..53cd146 --- /dev/null +++ b/contrib/libc++/include/iostream @@ -0,0 +1,60 @@ +// -*- C++ -*- +//===--------------------------- iostream ---------------------------------===// +// +// 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_IOSTREAM +#define _LIBCPP_IOSTREAM + +/* + iostream synopsis + +#include <ios> +#include <streambuf> +#include <istream> +#include <ostream> + +namespace std { + +extern istream cin; +extern ostream cout; +extern ostream cerr; +extern ostream clog; +extern wistream wcin; +extern wostream wcout; +extern wostream wcerr; +extern wostream wclog; + +} // std + +*/ + +#include <__config> +#include <ios> +#include <streambuf> +#include <istream> +#include <ostream> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +extern _LIBCPP_VISIBLE istream cin; +extern _LIBCPP_VISIBLE ostream cout; +extern _LIBCPP_VISIBLE ostream cerr; +extern _LIBCPP_VISIBLE ostream clog; +extern _LIBCPP_VISIBLE wistream wcin; +extern _LIBCPP_VISIBLE wostream wcout; +extern _LIBCPP_VISIBLE wostream wcerr; +extern _LIBCPP_VISIBLE wostream wclog; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_IOSTREAM diff --git a/contrib/libc++/include/istream b/contrib/libc++/include/istream new file mode 100644 index 0000000..7312425 --- /dev/null +++ b/contrib/libc++/include/istream @@ -0,0 +1,1712 @@ +// -*- C++ -*- +//===--------------------------- istream ----------------------------------===// +// +// 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_ISTREAM +#define _LIBCPP_ISTREAM + +/* + istream synopsis + +template <class charT, class traits = char_traits<charT> > +class basic_istream + : virtual public basic_ios<charT,traits> +{ +public: + // types (inherited from basic_ios (27.5.4)): + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // 27.7.1.1.1 Constructor/destructor: + explicit basic_istream(basic_streambuf<char_type, traits_type>* sb); + basic_istream(basic_istream&& rhs); + virtual ~basic_istream(); + + // 27.7.1.1.2 Assign/swap: + basic_istream& operator=(basic_istream&& rhs); + void swap(basic_istream& rhs); + + // 27.7.1.1.3 Prefix/suffix: + class sentry; + + // 27.7.1.2 Formatted input: + basic_istream& operator>>(basic_istream& (*pf)(basic_istream&)); + basic_istream& operator>>(basic_ios<char_type, traits_type>& + (*pf)(basic_ios<char_type, traits_type>&)); + basic_istream& operator>>(ios_base& (*pf)(ios_base&)); + basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb); + basic_istream& operator>>(bool& n); + basic_istream& operator>>(short& n); + basic_istream& operator>>(unsigned short& n); + basic_istream& operator>>(int& n); + basic_istream& operator>>(unsigned int& n); + basic_istream& operator>>(long& n); + basic_istream& operator>>(unsigned long& n); + basic_istream& operator>>(long long& n); + basic_istream& operator>>(unsigned long long& n); + basic_istream& operator>>(float& f); + basic_istream& operator>>(double& f); + basic_istream& operator>>(long double& f); + basic_istream& operator>>(void*& p); + + // 27.7.1.3 Unformatted input: + streamsize gcount() const; + int_type get(); + basic_istream& get(char_type& c); + basic_istream& get(char_type* s, streamsize n); + basic_istream& get(char_type* s, streamsize n, char_type delim); + basic_istream& get(basic_streambuf<char_type,traits_type>& sb); + basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim); + + basic_istream& getline(char_type* s, streamsize n); + basic_istream& getline(char_type* s, streamsize n, char_type delim); + + basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof()); + int_type peek(); + basic_istream& read (char_type* s, streamsize n); + streamsize readsome(char_type* s, streamsize n); + + basic_istream& putback(char_type c); + basic_istream& unget(); + int sync(); + + pos_type tellg(); + basic_istream& seekg(pos_type); + basic_istream& seekg(off_type, ios_base::seekdir); +}; + +// 27.7.1.2.3 character extraction templates: +template<class charT, class traits> + basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); + +template<class traits> + basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&); + +template<class traits> + basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&); + +template<class charT, class traits> + basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*); + +template<class traits> + basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*); + +template<class traits> + basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*); + +template <class charT, class traits> + void + swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y); + +typedef basic_istream<char> istream; +typedef basic_istream<wchar_t> wistream; + +template <class charT, class traits = char_traits<charT> > +class basic_iostream : + public basic_istream<charT,traits>, + public basic_ostream<charT,traits> +{ +public: + // types: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // constructor/destructor + explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb); + basic_iostream(basic_iostream&& rhs); + virtual ~basic_iostream(); + + // assign/swap + basic_iostream& operator=(basic_iostream&& rhs); + void swap(basic_iostream& rhs); +}; + +template <class charT, class traits> + void + swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y); + +typedef basic_iostream<char> iostream; +typedef basic_iostream<wchar_t> wiostream; + +template <class charT, class traits> + basic_istream<charT,traits>& + ws(basic_istream<charT,traits>& is); + +template <class charT, class traits, class T> + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>&& is, T& x); + +} // std + +*/ + +#include <__config> +#include <ostream> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_istream + : virtual public basic_ios<_CharT, _Traits> +{ + streamsize __gc_; +public: + // types (inherited from basic_ios (27.5.4)): + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // 27.7.1.1.1 Constructor/destructor: + explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb); + virtual ~basic_istream(); +protected: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_istream(basic_istream&& __rhs); +#endif + + // 27.7.1.1.2 Assign/swap: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_istream& operator=(basic_istream&& __rhs); +#endif + void swap(basic_istream& __rhs); +public: + + // 27.7.1.1.3 Prefix/suffix: + class sentry; + + // 27.7.1.2 Formatted input: + basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)); + basic_istream& operator>>(basic_ios<char_type, traits_type>& + (*__pf)(basic_ios<char_type, traits_type>&)); + basic_istream& operator>>(ios_base& (*__pf)(ios_base&)); + basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb); + basic_istream& operator>>(bool& __n); + basic_istream& operator>>(short& __n); + basic_istream& operator>>(unsigned short& __n); + basic_istream& operator>>(int& __n); + basic_istream& operator>>(unsigned int& __n); + basic_istream& operator>>(long& __n); + basic_istream& operator>>(unsigned long& __n); + basic_istream& operator>>(long long& __n); + basic_istream& operator>>(unsigned long long& __n); + basic_istream& operator>>(float& __f); + basic_istream& operator>>(double& __f); + basic_istream& operator>>(long double& __f); + basic_istream& operator>>(void*& __p); + + // 27.7.1.3 Unformatted input: + _LIBCPP_INLINE_VISIBILITY + streamsize gcount() const {return __gc_;} + int_type get(); + basic_istream& get(char_type& __c); + basic_istream& get(char_type* __s, streamsize __n); + basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); + basic_istream& get(basic_streambuf<char_type, traits_type>& __sb); + basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); + + basic_istream& getline(char_type* __s, streamsize __n); + basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm); + + basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof()); + int_type peek(); + basic_istream& read (char_type* __s, streamsize __n); + streamsize readsome(char_type* __s, streamsize __n); + + basic_istream& putback(char_type __c); + basic_istream& unget(); + int sync(); + + pos_type tellg(); + basic_istream& seekg(pos_type __pos); + basic_istream& seekg(off_type __off, ios_base::seekdir __dir); +}; + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_istream<_CharT, _Traits>::sentry +{ + bool __ok_; + + sentry(const sentry&); // = delete; + sentry& operator=(const sentry&); // = delete; + +public: + explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); +// ~sentry() = default; + + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT + operator bool() const {return __ok_;} +}; + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, + bool __noskipws) + : __ok_(false) +{ + if (__is.good()) + { + if (__is.tie()) + __is.tie()->flush(); + if (!__noskipws && (__is.flags() & ios_base::skipws)) + { + typedef istreambuf_iterator<_CharT, _Traits> _Ip; + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); + _Ip __i(__is); + _Ip __eof; + for (; __i != __eof; ++__i) + if (!__ct.is(__ct.space, *__i)) + break; + if (__i == __eof) + __is.setstate(ios_base::failbit | ios_base::eofbit); + } + __ok_ = __is.good(); + } + else + __is.setstate(ios_base::failbit); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb) + : __gc_(0) +{ + this->init(__sb); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) + : __gc_(__rhs.__gc_) +{ + __rhs.__gc_ = 0; + this->move(__rhs); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) +{ + swap(__rhs); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>::~basic_istream() +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs) +{ + _VSTD::swap(__gc_, __rhs.__gc_); + basic_ios<char_type, traits_type>::swap(__rhs); +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(long& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(long long& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(float& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(double& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(long double& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(bool& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(void*& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(short& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + long __temp; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp); + if (__temp < numeric_limits<short>::min()) + { + __err |= ios_base::failbit; + __n = numeric_limits<short>::min(); + } + else if (__temp > numeric_limits<short>::max()) + { + __err |= ios_base::failbit; + __n = numeric_limits<short>::max(); + } + else + __n = static_cast<short>(__temp); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(int& __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef istreambuf_iterator<char_type, traits_type> _Ip; + typedef num_get<char_type, _Ip> _Fp; + ios_base::iostate __err = ios_base::goodbit; + long __temp; + use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp); + if (__temp < numeric_limits<int>::min()) + { + __err |= ios_base::failbit; + __n = numeric_limits<int>::min(); + } + else if (__temp > numeric_limits<int>::max()) + { + __err |= ios_base::failbit; + __n = numeric_limits<int>::max(); + } + else + __n = static_cast<int>(__temp); + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&)) +{ + return __pf(*this); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>& + (*__pf)(basic_ios<char_type, traits_type>&)) +{ + __pf(*this); + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&)) +{ + __pf(*this); + return *this; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is); + if (__sen) + { + streamsize __n = __is.width(); + if (__n <= 0) + __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1; + streamsize __c = 0; + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); + ios_base::iostate __err = ios_base::goodbit; + while (__c < __n-1) + { + typename _Traits::int_type __i = __is.rdbuf()->sgetc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + { + __err |= ios_base::eofbit; + break; + } + _CharT __ch = _Traits::to_char_type(__i); + if (__ct.is(__ct.space, __ch)) + break; + *__s++ = __ch; + ++__c; + __is.rdbuf()->sbumpc(); + } + *__s = _CharT(); + __is.width(0); + if (__c == 0) + __err |= ios_base::failbit; + __is.setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template<class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<char, _Traits>& +operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) +{ + return __is >> (char*)__s; +} + +template<class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<char, _Traits>& +operator>>(basic_istream<char, _Traits>& __is, signed char* __s) +{ + return __is >> (char*)__s; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is); + if (__sen) + { + typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + __is.setstate(ios_base::eofbit | ios_base::failbit); + else + __c = _Traits::to_char_type(__i); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template<class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<char, _Traits>& +operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) +{ + return __is >> (char&)__c; +} + +template<class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<char, _Traits>& +operator>>(basic_istream<char, _Traits>& __is, signed char& __c) +{ + return __is >> (char&)__c; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this, true); + if (__s) + { + if (__sb) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + ios_base::iostate __err = ios_base::goodbit; + while (true) + { + typename traits_type::int_type __i = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__i, _Traits::eof())) + { + __err |= ios_base::eofbit; + break; + } + if (traits_type::eq_int_type( + __sb->sputc(traits_type::to_char_type(__i)), + traits_type::eof())) + break; + ++__gc_; + this->rdbuf()->sbumpc(); + } + if (__gc_ == 0) + __err |= ios_base::failbit; + this->setstate(__err); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + if (__gc_ == 0) + this->__set_failbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + else + this->setstate(ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +typename basic_istream<_CharT, _Traits>::int_type +basic_istream<_CharT, _Traits>::get() +{ + __gc_ = 0; + int_type __r = traits_type::eof(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this, true); + if (__s) + { + __r = this->rdbuf()->sbumpc(); + if (traits_type::eq_int_type(__r, traits_type::eof())) + this->setstate(ios_base::failbit | ios_base::eofbit); + else + __gc_ = 1; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __r; +} + +template<class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::get(char_type& __c) +{ + int_type __ch = get(); + if (__ch != traits_type::eof()) + __c = traits_type::to_char_type(__ch); + return *this; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + if (__n > 0) + { + ios_base::iostate __err = ios_base::goodbit; + while (__gc_ < __n-1) + { + int_type __i = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + __err |= ios_base::eofbit; + break; + } + char_type __ch = traits_type::to_char_type(__i); + if (traits_type::eq(__ch, __dlm)) + break; + *__s++ = __ch; + ++__gc_; + this->rdbuf()->sbumpc(); + } + *__s = char_type(); + if (__gc_ == 0) + __err |= ios_base::failbit; + this->setstate(__err); + } + else + this->setstate(ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n) +{ + return get(__s, __n, this->widen('\n')); +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, + char_type __dlm) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + ios_base::iostate __err = ios_base::goodbit; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + while (true) + { + typename traits_type::int_type __i = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + __err |= ios_base::eofbit; + break; + } + char_type __ch = traits_type::to_char_type(__i); + if (traits_type::eq(__ch, __dlm)) + break; + if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof())) + break; + ++__gc_; + this->rdbuf()->sbumpc(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + if (__gc_ == 0) + __err |= ios_base::failbit; + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb) +{ + return get(__sb, this->widen('\n')); +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + ios_base::iostate __err = ios_base::goodbit; + while (true) + { + typename traits_type::int_type __i = this->rdbuf()->sgetc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + __err |= ios_base::eofbit; + break; + } + char_type __ch = traits_type::to_char_type(__i); + if (traits_type::eq(__ch, __dlm)) + { + this->rdbuf()->sbumpc(); + ++__gc_; + break; + } + if (__gc_ >= __n-1) + { + __err |= ios_base::failbit; + break; + } + *__s++ = __ch; + this->rdbuf()->sbumpc(); + ++__gc_; + } + if (__n > 0) + *__s = char_type(); + if (__gc_ == 0) + __err |= ios_base::failbit; + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n) +{ + return getline(__s, __n, this->widen('\n')); +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + ios_base::iostate __err = ios_base::goodbit; + if (__n == numeric_limits<streamsize>::max()) + { + while (true) + { + typename traits_type::int_type __i = this->rdbuf()->sbumpc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + __err |= ios_base::eofbit; + break; + } + ++__gc_; + char_type __ch = traits_type::to_char_type(__i); + if (traits_type::eq(__ch, static_cast<char_type>(__dlm))) + break; + } + } + else + { + while (__gc_ < __n) + { + typename traits_type::int_type __i = this->rdbuf()->sbumpc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + __err |= ios_base::eofbit; + break; + } + ++__gc_; + char_type __ch = traits_type::to_char_type(__i); + if (traits_type::eq(__ch, static_cast<char_type>(__dlm))) + break; + } + } + this->setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +typename basic_istream<_CharT, _Traits>::int_type +basic_istream<_CharT, _Traits>::peek() +{ + __gc_ = 0; + int_type __r = traits_type::eof(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + __r = this->rdbuf()->sgetc(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __r; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + for (; __gc_ < __n; ++__gc_) + { + typename traits_type::int_type __i = this->rdbuf()->sbumpc(); + if (traits_type::eq_int_type(__i, traits_type::eof())) + { + this->setstate(ios_base::failbit | ios_base::eofbit); + break; + } + *__s++ = traits_type::to_char_type(__i); + } + } + else + this->setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +streamsize +basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) +{ + streamsize __c = this->rdbuf()->in_avail(); + switch (__c) + { + case -1: + this->setstate(ios_base::eofbit); + break; + case 0: + break; + default: + read(__s, _VSTD::min(__c, __n)); + break; + } + return __gc_; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::putback(char_type __c) +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof()) + this->setstate(ios_base::badbit); + } + else + this->setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::unget() +{ + __gc_ = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof()) + this->setstate(ios_base::badbit); + } + else + this->setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +int +basic_istream<_CharT, _Traits>::sync() +{ + int __r = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + { + if (this->rdbuf() == 0) + return -1; + if (this->rdbuf()->pubsync() == -1) + { + this->setstate(ios_base::badbit); + return -1; + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __r; +} + +template<class _CharT, class _Traits> +typename basic_istream<_CharT, _Traits>::pos_type +basic_istream<_CharT, _Traits>::tellg() +{ + pos_type __r(-1); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __r; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::seekg(pos_type __pos) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1)) + this->setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this, true); + if (__sen) + this->rdbuf()->pubseekoff(__off, __dir, ios_base::in); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +ws(basic_istream<_CharT, _Traits>& __is) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); + if (__sen) + { + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); + while (true) + { + typename _Traits::int_type __i = __is.rdbuf()->sgetc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + { + __is.setstate(ios_base::eofbit); + break; + } + if (!__ct.is(__ct.space, _Traits::to_char_type(__i))) + break; + __is.rdbuf()->sbumpc(); + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x) +{ + __is >> __x; + return __is; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_iostream + : public basic_istream<_CharT, _Traits>, + public basic_ostream<_CharT, _Traits> +{ +public: + // types: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // constructor/destructor + explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb); + virtual ~basic_iostream(); +protected: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_iostream(basic_iostream&& __rhs); +#endif + + // assign/swap +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_iostream& operator=(basic_iostream&& __rhs); +#endif + void swap(basic_iostream& __rhs); +public: +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb) + : basic_istream<_CharT, _Traits>(__sb) +{ +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs) + : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)) +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_iostream<_CharT, _Traits>& +basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) +{ + swap(__rhs); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +basic_iostream<_CharT, _Traits>::~basic_iostream() +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs) +{ + basic_istream<char_type, traits_type>::swap(__rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is); + if (__sen) + { + __str.clear(); + streamsize __n = __is.width(); + if (__n <= 0) + __n = __str.max_size(); + if (__n <= 0) + __n = numeric_limits<streamsize>::max(); + streamsize __c = 0; + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); + ios_base::iostate __err = ios_base::goodbit; + while (__c < __n) + { + typename _Traits::int_type __i = __is.rdbuf()->sgetc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + { + __err |= ios_base::eofbit; + break; + } + _CharT __ch = _Traits::to_char_type(__i); + if (__ct.is(__ct.space, __ch)) + break; + __str.push_back(__ch); + ++__c; + __is.rdbuf()->sbumpc(); + } + __is.width(0); + if (__c == 0) + __err |= ios_base::failbit; + __is.setstate(__err); + } + else + __is.setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template<class _CharT, class _Traits, class _Allocator> +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); + if (__sen) + { + __str.clear(); + ios_base::iostate __err = ios_base::goodbit; + streamsize __extr = 0; + while (true) + { + typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + { + __err |= ios_base::eofbit; + break; + } + ++__extr; + _CharT __ch = _Traits::to_char_type(__i); + if (_Traits::eq(__ch, __dlm)) + break; + __str.push_back(__ch); + if (__str.size() == __str.max_size()) + { + __err |= ios_base::failbit; + break; + } + } + if (__extr == 0) + __err |= ios_base::failbit; + __is.setstate(__err); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str) +{ + return getline(__is, __str, __is.widen('\n')); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) +{ + return getline(__is, __str, __dlm); +} + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Allocator>& __str) +{ + return getline(__is, __str, __is.widen('\n')); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, size_t _Size> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_istream<_CharT, _Traits>::sentry __sen(__is); + if (__sen) + { + basic_string<_CharT, _Traits> __str; + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); + streamsize __c = 0; + ios_base::iostate __err = ios_base::goodbit; + _CharT __zero = __ct.widen('0'); + _CharT __one = __ct.widen('1'); + while (__c < _Size) + { + typename _Traits::int_type __i = __is.rdbuf()->sgetc(); + if (_Traits::eq_int_type(__i, _Traits::eof())) + { + __err |= ios_base::eofbit; + break; + } + _CharT __ch = _Traits::to_char_type(__i); + if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one)) + break; + __str.push_back(__ch); + ++__c; + __is.rdbuf()->sbumpc(); + } + __x = bitset<_Size>(__str); + if (__c == 0) + __err |= ios_base::failbit; + __is.setstate(__err); + } + else + __is.setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __is.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __is; +} + +extern template class basic_istream<char>; +extern template class basic_istream<wchar_t>; +extern template class basic_iostream<char>; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_ISTREAM diff --git a/contrib/libc++/include/iterator b/contrib/libc++/include/iterator new file mode 100644 index 0000000..75fee4b --- /dev/null +++ b/contrib/libc++/include/iterator @@ -0,0 +1,1805 @@ +// -*- C++ -*- +//===-------------------------- iterator ----------------------------------===// +// +// 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_ITERATOR +#define _LIBCPP_ITERATOR + +/* + iterator synopsis + +namespace std +{ + +template<class Iterator> +struct iterator_traits +{ + typedef typename Iterator::difference_type difference_type; + typedef typename Iterator::value_type value_type; + typedef typename Iterator::pointer pointer; + typedef typename Iterator::reference reference; + typedef typename Iterator::iterator_category iterator_category; +}; + +template<class T> +struct iterator_traits<T*> +{ + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef random_access_iterator_tag iterator_category; +}; + +template<class T> +struct iterator_traits<const T*> +{ + typedef ptrdiff_t difference_type; + typedef T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef random_access_iterator_tag iterator_category; +}; + +template<class Category, class T, class Distance = ptrdiff_t, + class Pointer = T*, class Reference = T&> +struct iterator +{ + typedef T value_type; + typedef Distance difference_type; + typedef Pointer pointer; + typedef Reference reference; + typedef Category iterator_category; +}; + +struct input_iterator_tag {}; +struct output_iterator_tag {}; +struct forward_iterator_tag : public input_iterator_tag {}; +struct bidirectional_iterator_tag : public forward_iterator_tag {}; +struct random_access_iterator_tag : public bidirectional_iterator_tag {}; + +// extension: second argument not conforming to C++03 +template <class InputIterator> +void advance(InputIterator& i, + typename iterator_traits<InputIterator>::difference_type n); + +template <class InputIterator> +typename iterator_traits<InputIterator>::difference_type +distance(InputIterator first, InputIterator last); + +template <class Iterator> +class reverse_iterator + : public iterator<typename iterator_traits<Iterator>::iterator_category, + typename iterator_traits<Iterator>::value_type, + typename iterator_traits<Iterator>::difference_type, + typename iterator_traits<Iterator>::pointer, + typename iterator_traits<Iterator>::reference> +{ +protected: + Iterator current; +public: + typedef Iterator iterator_type; + typedef typename iterator_traits<Iterator>::difference_type difference_type; + typedef typename iterator_traits<Iterator>::reference reference; + typedef typename iterator_traits<Iterator>::pointer pointer; + + reverse_iterator(); + explicit reverse_iterator(Iterator x); + template <class U> reverse_iterator(const reverse_iterator<U>& u); + Iterator base() const; + reference operator*() const; + pointer operator->() const; + reverse_iterator& operator++(); + reverse_iterator operator++(int); + reverse_iterator& operator--(); + reverse_iterator operator--(int); + reverse_iterator operator+ (difference_type n) const; + reverse_iterator& operator+=(difference_type n); + reverse_iterator operator- (difference_type n) const; + reverse_iterator& operator-=(difference_type n); + reference operator[](difference_type n) const; +}; + +template <class Iterator1, class Iterator2> +bool +operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +bool +operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +bool +operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +bool +operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +bool +operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +bool +operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator1, class Iterator2> +typename reverse_iterator<Iterator1>::difference_type +operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); + +template <class Iterator> +reverse_iterator<Iterator> +operator+(typename reverse_iterator<Iterator>::difference_type n, const reverse_iterator<Iterator>& x); + +template <class Container> +class back_insert_iterator +{ +protected: + Container* container; +public: + typedef Container container_type; + typedef void value_type; + typedef void difference_type; + typedef back_insert_iterator<Cont>& reference; + typedef void pointer; + + explicit back_insert_iterator(Container& x); + back_insert_iterator& operator=(const typename Container::value_type& value); + back_insert_iterator& operator*(); + back_insert_iterator& operator++(); + back_insert_iterator operator++(int); +}; + +template <class Container> back_insert_iterator<Container> back_inserter(Container& x); + +template <class Container> +class front_insert_iterator +{ +protected: + Container* container; +public: + typedef Container container_type; + typedef void value_type; + typedef void difference_type; + typedef front_insert_iterator<Cont>& reference; + typedef void pointer; + + explicit front_insert_iterator(Container& x); + front_insert_iterator& operator=(const typename Container::value_type& value); + front_insert_iterator& operator*(); + front_insert_iterator& operator++(); + front_insert_iterator operator++(int); +}; + +template <class Container> front_insert_iterator<Container> front_inserter(Container& x); + +template <class Container> +class insert_iterator +{ +protected: + Container* container; + typename Container::iterator iter; +public: + typedef Container container_type; + typedef void value_type; + typedef void difference_type; + typedef insert_iterator<Cont>& reference; + typedef void pointer; + + insert_iterator(Container& x, typename Container::iterator i); + insert_iterator& operator=(const typename Container::value_type& value); + insert_iterator& operator*(); + insert_iterator& operator++(); + insert_iterator& operator++(int); +}; + +template <class Container, class Iterator> +insert_iterator<Container> inserter(Container& x, Iterator i); + +template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> +class istream_iterator + : public iterator<input_iterator_tag, T, Distance, const T*, const T&> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef basic_istream<charT,traits> istream_type; + + istream_iterator(); + istream_iterator(istream_type& s); + istream_iterator(const istream_iterator& x); + ~istream_iterator(); + + const T& operator*() const; + const T* operator->() const; + istream_iterator& operator++(); + istream_iterator operator++(int); +}; + +template <class T, class charT, class traits, class Distance> +bool operator==(const istream_iterator<T,charT,traits,Distance>& x, + const istream_iterator<T,charT,traits,Distance>& y); +template <class T, class charT, class traits, class Distance> +bool operator!=(const istream_iterator<T,charT,traits,Distance>& x, + const istream_iterator<T,charT,traits,Distance>& y); + +template <class T, class charT = char, class traits = char_traits<charT> > +class ostream_iterator + : public iterator<output_iterator_tag, void, void, void ,void> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef basic_ostream<charT,traits> ostream_type; + + ostream_iterator(ostream_type& s); + ostream_iterator(ostream_type& s, const charT* delimiter); + ostream_iterator(const ostream_iterator& x); + ~ostream_iterator(); + ostream_iterator& operator=(const T& value); + + ostream_iterator& operator*(); + ostream_iterator& operator++(); + ostream_iterator& operator++(int); +}; + +template<class charT, class traits = char_traits<charT> > +class istreambuf_iterator + : public iterator<input_iterator_tag, charT, + typename traits::off_type, unspecified, + charT> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits::int_type int_type; + typedef basic_streambuf<charT,traits> streambuf_type; + typedef basic_istream<charT,traits> istream_type; + + istreambuf_iterator() throw(); + istreambuf_iterator(istream_type& s) throw(); + istreambuf_iterator(streambuf_type* s) throw(); + istreambuf_iterator(a-private-type) throw(); + + charT operator*() const; + pointer operator->() const; + istreambuf_iterator& operator++(); + a-private-type operator++(int); + + bool equal(const istreambuf_iterator& b) const; +}; + +template <class charT, class traits> +bool operator==(const istreambuf_iterator<charT,traits>& a, + const istreambuf_iterator<charT,traits>& b); +template <class charT, class traits> +bool operator!=(const istreambuf_iterator<charT,traits>& a, + const istreambuf_iterator<charT,traits>& b); + +template <class charT, class traits = char_traits<charT> > +class ostreambuf_iterator + : public iterator<output_iterator_tag, void, void, void, void> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef basic_streambuf<charT,traits> streambuf_type; + typedef basic_ostream<charT,traits> ostream_type; + + ostreambuf_iterator(ostream_type& s) throw(); + ostreambuf_iterator(streambuf_type* s) throw(); + ostreambuf_iterator& operator=(charT c); + ostreambuf_iterator& operator*(); + ostreambuf_iterator& operator++(); + ostreambuf_iterator& operator++(int); + bool failed() const throw(); +}; + +template <class C> auto begin(C& c) -> decltype(c.begin()); +template <class C> auto begin(const C& c) -> decltype(c.begin()); +template <class C> auto end(C& c) -> decltype(c.end()); +template <class C> auto end(const C& c) -> decltype(c.end()); +template <class T, size_t N> T* begin(T (&array)[N]); +template <class T, size_t N> T* end(T (&array)[N]); + +} // std + +*/ + +#include <__config> +#include <type_traits> +#include <cstddef> +#include <iosfwd> +#ifdef _LIBCPP_DEBUG +#include <cassert> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct _LIBCPP_VISIBLE input_iterator_tag {}; +struct _LIBCPP_VISIBLE output_iterator_tag {}; +struct _LIBCPP_VISIBLE forward_iterator_tag : public input_iterator_tag {}; +struct _LIBCPP_VISIBLE bidirectional_iterator_tag : public forward_iterator_tag {}; +struct _LIBCPP_VISIBLE random_access_iterator_tag : public bidirectional_iterator_tag {}; + +template <class _Tp> +struct __has_iterator_category +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::iterator_category* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Iter, bool> struct ____iterator_traits {}; + +template <class _Iter> +struct ____iterator_traits<_Iter, true> +{ + typedef typename _Iter::difference_type difference_type; + typedef typename _Iter::value_type value_type; + typedef typename _Iter::pointer pointer; + typedef typename _Iter::reference reference; + typedef typename _Iter::iterator_category iterator_category; +}; + +template <class _Iter, bool> struct __iterator_traits {}; + +template <class _Iter> +struct __iterator_traits<_Iter, true> + : ____iterator_traits + < + _Iter, + is_convertible<typename _Iter::iterator_category, input_iterator_tag>::value || + is_convertible<typename _Iter::iterator_category, output_iterator_tag>::value + > +{}; + +// iterator_traits<Iterator> will only have the nested types if Iterator::iterator_category +// exists. Else iterator_traits<Iterator> will be an empty class. This is a +// conforming extension which allows some programs to compile and behave as +// the client expects instead of failing at compile time. + +template <class _Iter> +struct _LIBCPP_VISIBLE iterator_traits + : __iterator_traits<_Iter, __has_iterator_category<_Iter>::value> {}; + +template<class _Tp> +struct _LIBCPP_VISIBLE iterator_traits<_Tp*> +{ + typedef ptrdiff_t difference_type; + typedef typename remove_const<_Tp>::type value_type; + typedef _Tp* pointer; + typedef _Tp& reference; + typedef random_access_iterator_tag iterator_category; +}; + +template <class _Tp, class _Up, bool = __has_iterator_category<iterator_traits<_Tp> >::value> +struct __has_iterator_category_convertible_to + : public integral_constant<bool, is_convertible<typename iterator_traits<_Tp>::iterator_category, _Up>::value> +{}; + +template <class _Tp, class _Up> +struct __has_iterator_category_convertible_to<_Tp, _Up, false> : public false_type {}; + +template <class _Tp> +struct __is_input_iterator : public __has_iterator_category_convertible_to<_Tp, input_iterator_tag> {}; + +template <class _Tp> +struct __is_forward_iterator : public __has_iterator_category_convertible_to<_Tp, forward_iterator_tag> {}; + +template <class _Tp> +struct __is_bidirectional_iterator : public __has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag> {}; + +template <class _Tp> +struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {}; + +template<class _Category, class _Tp, class _Distance = ptrdiff_t, + class _Pointer = _Tp*, class _Reference = _Tp&> +struct _LIBCPP_VISIBLE iterator +{ + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + typedef _Category iterator_category; +}; + +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +void __advance(_InputIter& __i, + typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag) +{ + for (; __n > 0; --__n) + ++__i; +} + +template <class _BiDirIter> +inline _LIBCPP_INLINE_VISIBILITY +void __advance(_BiDirIter& __i, + typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag) +{ + if (__n >= 0) + for (; __n > 0; --__n) + ++__i; + else + for (; __n < 0; ++__n) + --__i; +} + +template <class _RandIter> +inline _LIBCPP_INLINE_VISIBILITY +void __advance(_RandIter& __i, + typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag) +{ + __i += __n; +} + +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +void advance(_InputIter& __i, + typename iterator_traits<_InputIter>::difference_type __n) +{ + __advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category()); +} + +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +typename iterator_traits<_InputIter>::difference_type +__distance(_InputIter __first, _InputIter __last, input_iterator_tag) +{ + typename iterator_traits<_InputIter>::difference_type __r(0); + for (; __first != __last; ++__first) + ++__r; + return __r; +} + +template <class _RandIter> +inline _LIBCPP_INLINE_VISIBILITY +typename iterator_traits<_RandIter>::difference_type +__distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) +{ + return __last - __first; +} + +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +typename iterator_traits<_InputIter>::difference_type +distance(_InputIter __first, _InputIter __last) +{ + return __distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); +} + +template <class _ForwardIter> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIter +next(_ForwardIter __x, + typename iterator_traits<_ForwardIter>::difference_type __n = 1, + typename enable_if<__is_forward_iterator<_ForwardIter>::value>::type* = 0) +{ + _VSTD::advance(__x, __n); + return __x; +} + +template <class _BidiretionalIter> +inline _LIBCPP_INLINE_VISIBILITY +_BidiretionalIter +prev(_BidiretionalIter __x, + typename iterator_traits<_BidiretionalIter>::difference_type __n = 1, + typename enable_if<__is_bidirectional_iterator<_BidiretionalIter>::value>::type* = 0) +{ + _VSTD::advance(__x, -__n); + return __x; +} + +template <class _Iter> +class _LIBCPP_VISIBLE reverse_iterator + : public iterator<typename iterator_traits<_Iter>::iterator_category, + typename iterator_traits<_Iter>::value_type, + typename iterator_traits<_Iter>::difference_type, + typename iterator_traits<_Iter>::pointer, + typename iterator_traits<_Iter>::reference> +{ +private: + mutable _Iter __t; +protected: + _Iter current; +public: + typedef _Iter iterator_type; + typedef typename iterator_traits<_Iter>::difference_type difference_type; + typedef typename iterator_traits<_Iter>::reference reference; + typedef typename iterator_traits<_Iter>::pointer pointer; + + _LIBCPP_INLINE_VISIBILITY reverse_iterator() : current() {} + _LIBCPP_INLINE_VISIBILITY explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY reverse_iterator(const reverse_iterator<_Up>& __u) + : __t(__u.base()), current(__u.base()) {} + _LIBCPP_INLINE_VISIBILITY _Iter base() const {return current;} + _LIBCPP_INLINE_VISIBILITY reference operator*() const {__t = current; return *--__t;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator++() {--current; return *this;} + _LIBCPP_INLINE_VISIBILITY reverse_iterator operator++(int) + {reverse_iterator __tmp(*this); --current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator--() {++current; return *this;} + _LIBCPP_INLINE_VISIBILITY reverse_iterator operator--(int) + {reverse_iterator __tmp(*this); ++current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY reverse_iterator operator+ (difference_type __n) const + {return reverse_iterator(current - __n);} + _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator+=(difference_type __n) + {current -= __n; return *this;} + _LIBCPP_INLINE_VISIBILITY reverse_iterator operator- (difference_type __n) const + {return reverse_iterator(current + __n);} + _LIBCPP_INLINE_VISIBILITY reverse_iterator& operator-=(difference_type __n) + {current += __n; return *this;} + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + {return current[-__n-1];} +}; + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() == __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() > __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() != __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() < __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() <= __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __x.base() >= __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +typename reverse_iterator<_Iter1>::difference_type +operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __y.base() - __x.base(); +} + +template <class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +reverse_iterator<_Iter> +operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) +{ + return reverse_iterator<_Iter>(__x.base() - __n); +} + +template <class _Container> +class _LIBCPP_VISIBLE back_insert_iterator + : public iterator<output_iterator_tag, + void, + void, + void, + back_insert_iterator<_Container>&> +{ +protected: + _Container* container; +public: + typedef _Container container_type; + + _LIBCPP_INLINE_VISIBILITY explicit back_insert_iterator(_Container& __x) : container(&__x) {} + _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(const typename _Container::value_type& __value_) + {container->push_back(__value_); return *this;} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator=(typename _Container::value_type&& __value_) + {container->push_back(_VSTD::move(__value_)); return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY back_insert_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY back_insert_iterator operator++(int) {return *this;} +}; + +template <class _Container> +inline _LIBCPP_INLINE_VISIBILITY +back_insert_iterator<_Container> +back_inserter(_Container& __x) +{ + return back_insert_iterator<_Container>(__x); +} + +template <class _Container> +class _LIBCPP_VISIBLE front_insert_iterator + : public iterator<output_iterator_tag, + void, + void, + void, + front_insert_iterator<_Container>&> +{ +protected: + _Container* container; +public: + typedef _Container container_type; + + _LIBCPP_INLINE_VISIBILITY explicit front_insert_iterator(_Container& __x) : container(&__x) {} + _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(const typename _Container::value_type& __value_) + {container->push_front(__value_); return *this;} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator=(typename _Container::value_type&& __value_) + {container->push_front(_VSTD::move(__value_)); return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY front_insert_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY front_insert_iterator operator++(int) {return *this;} +}; + +template <class _Container> +inline _LIBCPP_INLINE_VISIBILITY +front_insert_iterator<_Container> +front_inserter(_Container& __x) +{ + return front_insert_iterator<_Container>(__x); +} + +template <class _Container> +class _LIBCPP_VISIBLE insert_iterator + : public iterator<output_iterator_tag, + void, + void, + void, + insert_iterator<_Container>&> +{ +protected: + _Container* container; + typename _Container::iterator iter; +public: + typedef _Container container_type; + + _LIBCPP_INLINE_VISIBILITY insert_iterator(_Container& __x, typename _Container::iterator __i) + : container(&__x), iter(__i) {} + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(const typename _Container::value_type& __value_) + {iter = container->insert(iter, __value_); ++iter; return *this;} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator=(typename _Container::value_type&& __value_) + {iter = container->insert(iter, _VSTD::move(__value_)); ++iter; return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY insert_iterator& operator++(int) {return *this;} +}; + +template <class _Container> +inline _LIBCPP_INLINE_VISIBILITY +insert_iterator<_Container> +inserter(_Container& __x, typename _Container::iterator __i) +{ + return insert_iterator<_Container>(__x, __i); +} + +template <class _Tp, class _CharT = char, + class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t> +class _LIBCPP_VISIBLE istream_iterator + : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_istream<_CharT,_Traits> istream_type; +private: + istream_type* __in_stream_; + _Tp __value_; +public: + _LIBCPP_INLINE_VISIBILITY istream_iterator() : __in_stream_(0) {} + _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(&__s) + { + if (!(*__in_stream_ >> __value_)) + __in_stream_ = 0; + } + + _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;} + _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++() + { + if (!(*__in_stream_ >> __value_)) + __in_stream_ = 0; + return *this; + } + _LIBCPP_INLINE_VISIBILITY istream_iterator operator++(int) + {istream_iterator __t(*this); ++(*this); return __t;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const istream_iterator& __x, const istream_iterator& __y) + {return __x.__in_stream_ == __y.__in_stream_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const istream_iterator& __x, const istream_iterator& __y) + {return !(__x == __y);} +}; + +template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> > +class _LIBCPP_VISIBLE ostream_iterator + : public iterator<output_iterator_tag, void, void, void, void> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_ostream<_CharT,_Traits> ostream_type; +private: + ostream_type* __out_stream_; + const char_type* __delim_; +public: + _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) + : __out_stream_(&__s), __delim_(0) {} + _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) + : __out_stream_(&__s), __delim_(__delimiter) {} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_) + { + *__out_stream_ << __value_; + if (__delim_) + *__out_stream_ << __delim_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;} +}; + +template<class _CharT, class _Traits> +class _LIBCPP_VISIBLE istreambuf_iterator + : public iterator<input_iterator_tag, _CharT, + typename _Traits::off_type, _CharT*, + _CharT> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + typedef basic_streambuf<_CharT,_Traits> streambuf_type; + typedef basic_istream<_CharT,_Traits> istream_type; +private: + streambuf_type* __sbuf_; + + class __proxy + { + char_type __keep_; + streambuf_type* __sbuf_; + _LIBCPP_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s) + : __keep_(__c), __sbuf_(__s) {} + friend class istreambuf_iterator; + public: + _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;} + }; + + _LIBCPP_INLINE_VISIBILITY + void __test_for_eof() + { + if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof())) + __sbuf_ = 0; + } +public: + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator() throw() : __sbuf_(0) {} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) throw() + : __sbuf_(__s.rdbuf()) {__test_for_eof();} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) throw() + : __sbuf_(__s) {__test_for_eof();} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) throw() + : __sbuf_(__p.__sbuf_) {} + + _LIBCPP_INLINE_VISIBILITY char_type operator*() const + {return static_cast<char_type>(__sbuf_->sgetc());} + _LIBCPP_INLINE_VISIBILITY char_type* operator->() const {return nullptr;} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++() + { + if (traits_type::eq_int_type(__sbuf_->snextc(), traits_type::eof())) + __sbuf_ = 0; + return *this; + } + _LIBCPP_INLINE_VISIBILITY __proxy operator++(int) + { + char_type __c = __sbuf_->sgetc(); + ++(*this); + return __proxy(__c, __sbuf_); + } + + _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const + {return (__sbuf_ == 0) == (__b.__sbuf_ == 0);} +}; + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a, + const istreambuf_iterator<_CharT,_Traits>& __b) + {return __a.equal(__b);} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a, + const istreambuf_iterator<_CharT,_Traits>& __b) + {return !__a.equal(__b);} + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE ostreambuf_iterator + : public iterator<output_iterator_tag, void, void, void, void> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_streambuf<_CharT,_Traits> streambuf_type; + typedef basic_ostream<_CharT,_Traits> ostream_type; +private: + streambuf_type* __sbuf_; +public: + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) throw() + : __sbuf_(__s.rdbuf()) {} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) throw() + : __sbuf_(__s) {} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c) + { + if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof())) + __sbuf_ = 0; + return *this; + } + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;} + _LIBCPP_INLINE_VISIBILITY bool failed() const throw() {return __sbuf_ == 0;} +}; + +template <class _Iter> +class _LIBCPP_VISIBLE move_iterator +{ +private: + _Iter __i; +public: + typedef _Iter iterator_type; + typedef typename iterator_traits<iterator_type>::iterator_category iterator_category; + typedef typename iterator_traits<iterator_type>::value_type value_type; + typedef typename iterator_traits<iterator_type>::difference_type difference_type; + typedef typename iterator_traits<iterator_type>::pointer pointer; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + typedef value_type&& reference; +#else + typedef typename iterator_traits<iterator_type>::reference reference; +#endif + + _LIBCPP_INLINE_VISIBILITY move_iterator() : __i() {} + _LIBCPP_INLINE_VISIBILITY explicit move_iterator(_Iter __x) : __i(__x) {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY move_iterator(const move_iterator<_Up>& __u) + : __i(__u.base()) {} + _LIBCPP_INLINE_VISIBILITY _Iter base() const {return __i;} + _LIBCPP_INLINE_VISIBILITY reference operator*() const { + return static_cast<reference>(*__i); + } + _LIBCPP_INLINE_VISIBILITY pointer operator->() const { + typename iterator_traits<iterator_type>::reference __ref = *__i; + return &__ref; + } + _LIBCPP_INLINE_VISIBILITY move_iterator& operator++() {++__i; return *this;} + _LIBCPP_INLINE_VISIBILITY move_iterator operator++(int) + {move_iterator __tmp(*this); ++__i; return __tmp;} + _LIBCPP_INLINE_VISIBILITY move_iterator& operator--() {--__i; return *this;} + _LIBCPP_INLINE_VISIBILITY move_iterator operator--(int) + {move_iterator __tmp(*this); --__i; return __tmp;} + _LIBCPP_INLINE_VISIBILITY move_iterator operator+ (difference_type __n) const + {return move_iterator(__i + __n);} + _LIBCPP_INLINE_VISIBILITY move_iterator& operator+=(difference_type __n) + {__i += __n; return *this;} + _LIBCPP_INLINE_VISIBILITY move_iterator operator- (difference_type __n) const + {return move_iterator(__i - __n);} + _LIBCPP_INLINE_VISIBILITY move_iterator& operator-=(difference_type __n) + {__i -= __n; return *this;} + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + { + return static_cast<reference>(__i[__n]); + } +}; + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() == __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() < __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() != __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() > __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() >= __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() <= __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +typename move_iterator<_Iter1>::difference_type +operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() - __y.base(); +} + +template <class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +move_iterator<_Iter> +operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) +{ + return move_iterator<_Iter>(__x.base() + __n); +} + +template <class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +move_iterator<_Iter> +make_move_iterator(const _Iter& __i) +{ + return move_iterator<_Iter>(__i); +} + +// __wrap_iter + +template <class _Iter> class __wrap_iter; + +template <class _Iter1, class _Iter2> +bool +operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +bool +operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +bool +operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +bool +operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +bool +operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +bool +operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter1, class _Iter2> +typename __wrap_iter<_Iter1>::difference_type +operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + +template <class _Iter> +__wrap_iter<_Iter> +operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT; + +template <class _Ip, class _Op> _Op copy(_Ip, _Ip, _Op); +template <class _B1, class _B2> _B2 copy_backward(_B1, _B1, _B2); +template <class _Ip, class _Op> _Op move(_Ip, _Ip, _Op); +template <class _B1, class _B2> _B2 move_backward(_B1, _B1, _B2); + +template <class _Tp> +typename enable_if +< + is_trivially_copy_assignable<_Tp>::value, + _Tp* +>::type +__unwrap_iter(__wrap_iter<_Tp*>); + +template <class _Iter> +class __wrap_iter +{ +public: + typedef _Iter iterator_type; + typedef typename iterator_traits<iterator_type>::iterator_category iterator_category; + typedef typename iterator_traits<iterator_type>::value_type value_type; + typedef typename iterator_traits<iterator_type>::difference_type difference_type; + typedef typename iterator_traits<iterator_type>::pointer pointer; + typedef typename iterator_traits<iterator_type>::reference reference; +private: + iterator_type __i; +public: + _LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_i(this); +#endif + } + template <class _Up> _LIBCPP_INLINE_VISIBILITY __wrap_iter(const __wrap_iter<_Up>& __u, + typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT + : __i(__u.base()) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__iterator_copy(this, &__u); +#endif + } +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY + __wrap_iter(const __wrap_iter& __x) + : __i(__x.base()) + { + __get_db()->__iterator_copy(this, &__x); + } + _LIBCPP_INLINE_VISIBILITY + __wrap_iter& operator=(const __wrap_iter& __x) + { + if (this != &__x) + { + __get_db()->__iterator_copy(this, &__x); + __i = __x.__i; + } + return *this; + } + _LIBCPP_INLINE_VISIBILITY + ~__wrap_iter() + { + __get_db()->__erase_i(this); + } +#endif + _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable iterator"); +#endif + return *__i; + } + _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator++() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment non-incrementable iterator"); +#endif + ++__i; + return *this; + } + _LIBCPP_INLINE_VISIBILITY __wrap_iter operator++(int) _NOEXCEPT + {__wrap_iter __tmp(*this); ++(*this); return __tmp;} + _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator--() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__decrementable(this), + "Attempted to decrement non-decrementable iterator"); +#endif + --__i; + return *this; + } + _LIBCPP_INLINE_VISIBILITY __wrap_iter operator--(int) _NOEXCEPT + {__wrap_iter __tmp(*this); --(*this); return __tmp;} + _LIBCPP_INLINE_VISIBILITY __wrap_iter operator+ (difference_type __n) const _NOEXCEPT + {__wrap_iter __w(*this); __w += __n; return __w;} + _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator+=(difference_type __n) _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n), + "Attempted to add/subtract iterator outside of valid range"); +#endif + __i += __n; + return *this; + } + _LIBCPP_INLINE_VISIBILITY __wrap_iter operator- (difference_type __n) const _NOEXCEPT + {return *this + (-__n);} + _LIBCPP_INLINE_VISIBILITY __wrap_iter& operator-=(difference_type __n) _NOEXCEPT + {*this += -__n; return *this;} + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n), + "Attempted to subscript iterator outside of valid range"); +#endif + return __i[__n]; + } + + _LIBCPP_INLINE_VISIBILITY iterator_type base() const _NOEXCEPT {return __i;} + +private: + _LIBCPP_INLINE_VISIBILITY __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {} +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY __wrap_iter(const void* __p, iterator_type __x) : __i(__x) + { + __get_db()->__insert_ic(this, __p); + } +#endif + + template <class _Up> friend class __wrap_iter; + template <class _CharT, class _Traits, class _Alloc> friend class basic_string; + template <class _Tp, class _Alloc> friend class vector; + + template <class _Iter1, class _Iter2> + friend + bool + operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + bool + operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + bool + operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + bool + operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + bool + operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + bool + operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1, class _Iter2> + friend + typename __wrap_iter<_Iter1>::difference_type + operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; + + template <class _Iter1> + friend + __wrap_iter<_Iter1> + operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT; + + template <class _Ip, class _Op> friend _Op copy(_Ip, _Ip, _Op); + template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2); + template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op); + template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2); + + template <class _Tp> + friend + typename enable_if + < + is_trivially_copy_assignable<_Tp>::value, + _Tp* + >::type + __unwrap_iter(__wrap_iter<_Tp*>); +}; + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y), + "Attempted to compare incomparable iterators"); +#endif + return __x.base() == __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y), + "Attempted to compare incomparable iterators"); +#endif + return __x.base() < __y.base(); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ + return !(__x == __y); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ + return __y < __x; +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ + return !(__x < __y); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ + return !(__y < __x); +} + +template <class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +typename __wrap_iter<_Iter1>::difference_type +operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y), + "Attempted to subtract incompatible iterators"); +#endif + return __x.base() - __y.base(); +} + +template <class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +__wrap_iter<_Iter> +operator+(typename __wrap_iter<_Iter>::difference_type __n, + __wrap_iter<_Iter> __x) _NOEXCEPT +{ + __x += __n; + return __x; +} + +#ifdef _LIBCPP_DEBUG + +// __debug_iter + +template <class _Container, class _Iter> class __debug_iter; + +template <class _Container, class _Iter1, class _Iter2> +bool +operator==(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +bool +operator<(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +bool +operator!=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +bool +operator>(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +bool +operator>=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +bool +operator<=(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter1, class _Iter2> +typename __debug_iter<_Container, _Iter1>::difference_type +operator-(const __debug_iter<_Container, _Iter1>&, const __debug_iter<_Container, _Iter2>&); + +template <class _Container, class _Iter> +__debug_iter<_Container, _Iter> +operator+(typename __debug_iter<_Container, _Iter>::difference_type, const __debug_iter<_Container, _Iter>&); + +template <class _Container, class _Iter> +class __debug_iter +{ +public: + typedef _Iter iterator_type; + typedef _Container __container_type; + typedef typename iterator_traits<iterator_type>::iterator_category iterator_category; + typedef typename iterator_traits<iterator_type>::value_type value_type; + typedef typename iterator_traits<iterator_type>::difference_type difference_type; + typedef typename iterator_traits<iterator_type>::pointer pointer; + typedef typename iterator_traits<iterator_type>::reference reference; +private: + iterator_type __i; + __debug_iter* __next; + __container_type* __cont; + +public: + _LIBCPP_INLINE_VISIBILITY __debug_iter() : __next(0), __cont(0) {} + _LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter& __x) + : __i(__x.base()), __next(0), __cont(0) {__set_owner(__x.__cont);} + __debug_iter& operator=(const __debug_iter& __x); + template <class _Up> _LIBCPP_INLINE_VISIBILITY __debug_iter(const __debug_iter<_Container, _Up>& __u, + typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) + : __i(__u.base()), __next(0), __cont(0) {__set_owner(__u.__cont);} + _LIBCPP_INLINE_VISIBILITY ~__debug_iter() {__remove_owner();} + _LIBCPP_INLINE_VISIBILITY reference operator*() const {assert(__is_deref()); return *__i;} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return &(operator*());} + _LIBCPP_INLINE_VISIBILITY __debug_iter& operator++() {assert(__can_increment()); ++__i; return *this;} + _LIBCPP_INLINE_VISIBILITY __debug_iter operator++(int) + {__debug_iter __tmp(*this); operator++(); return __tmp;} + _LIBCPP_INLINE_VISIBILITY __debug_iter& operator--() {assert(__can_decrement()); --__i; return *this;} + _LIBCPP_INLINE_VISIBILITY __debug_iter operator--(int) + {__debug_iter __tmp(*this); operator--(); return __tmp;} + _LIBCPP_INLINE_VISIBILITY __debug_iter operator+ (difference_type __n) const + {__debug_iter __t(*this); __t += __n; return __t;} + __debug_iter& operator+=(difference_type __n); + _LIBCPP_INLINE_VISIBILITY __debug_iter operator- (difference_type __n) const + {__debug_iter __t(*this); __t -= __n; return __t;} + _LIBCPP_INLINE_VISIBILITY __debug_iter& operator-=(difference_type __n) + {*this += -__n; return *this;} + _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const + {return *(*this + __n);} + +private: + _LIBCPP_INLINE_VISIBILITY __debug_iter(const __container_type* __c, iterator_type __x) + : __i(__x), __next(0), __cont(0) {__set_owner(__c);} + _LIBCPP_INLINE_VISIBILITY iterator_type base() const {return __i;} + + void __set_owner(const __container_type* __c); + void __remove_owner(); + static void __remove_all(__container_type* __c); + static void swap(__container_type* __x, __container_type* __y); + + _LIBCPP_INLINE_VISIBILITY bool __is_deref() const + {return __is_deref(__is_random_access_iterator<iterator_type>());} + bool __is_deref(false_type) const; + bool __is_deref(true_type) const; + _LIBCPP_INLINE_VISIBILITY bool __can_decrement() const + {return __can_decrement(integral_constant<int, is_pointer<iterator_type>::value ? 2: + __is_random_access_iterator<iterator_type>::value ? 1 : 0>());} + bool __can_decrement(integral_constant<int, 0>) const; + bool __can_decrement(integral_constant<int, 1>) const; + bool __can_decrement(integral_constant<int, 2>) const; + _LIBCPP_INLINE_VISIBILITY bool __can_increment() const + {return __can_increment(integral_constant<int, is_pointer<iterator_type>::value ? 2: + __is_random_access_iterator<iterator_type>::value ? 1 : 0>());} + bool __can_increment(integral_constant<int, 0>) const; + bool __can_increment(integral_constant<int, 1>) const; + bool __can_increment(integral_constant<int, 2>) const; + + _LIBCPP_INLINE_VISIBILITY bool __can_add(difference_type __n) const + {return __can_add(__n, is_pointer<iterator_type>());} + bool __can_add(difference_type __n, false_type) const; + bool __can_add(difference_type __n, true_type) const; + + template <class _Cp, class _Up> friend class __debug_iter; + friend class _Container::__self; + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator==(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator<(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator!=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator>(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator>=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + bool + operator<=(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1, class _Iter2> + friend + typename __debug_iter<_Cp, _Iter1>::difference_type + operator-(const __debug_iter<_Cp, _Iter1>&, const __debug_iter<_Cp, _Iter2>&); + + template <class _Cp, class _Iter1> + friend + __debug_iter<_Cp, _Iter1> + operator+(typename __debug_iter<_Cp, _Iter1>::difference_type, const __debug_iter<_Cp, _Iter1>&); +}; + +template <class _Container, class _Iter> +__debug_iter<_Container, _Iter>& +__debug_iter<_Container, _Iter>::operator=(const __debug_iter& __x) +{ + if (this != &__x) + { + __remove_owner(); + __i = __x.__i; + __set_owner(__x.__cont); + } + return *this; +} + +template <class _Container, class _Iter> +void +__debug_iter<_Container, _Iter>::__set_owner(const __container_type* __c) +{ + __cont = const_cast<__container_type*>(__c); + __debug_iter*& __head = __cont->__get_iterator_list(this); + __next = __head; + __head = this; +} + +template <class _Container, class _Iter> +void +__debug_iter<_Container, _Iter>::__remove_owner() +{ + if (__cont) + { + __debug_iter*& __head = __cont->__get_iterator_list(this); + if (__head == this) + __head = __next; + else + { + __debug_iter* __prev = __head; + for (__debug_iter* __p = __head->__next; __p != this; __p = __p->__next) + __prev = __p; + __prev->__next = __next; + } + __cont = 0; + } +} + +template <class _Container, class _Iter> +void +__debug_iter<_Container, _Iter>::__remove_all(__container_type* __c) +{ + __debug_iter*& __head = __c->__get_iterator_list((__debug_iter*)0); + __debug_iter* __p = __head; + __head = 0; + while (__p) + { + __p->__cont = 0; + __debug_iter* __n = __p->__next; + __p->__next = 0; + __p = __n; + } +} + +template <class _Container, class _Iter> +void +__debug_iter<_Container, _Iter>::swap(__container_type* __x, __container_type* __y) +{ + __debug_iter*& __head_x = __x->__get_iterator_list((__debug_iter*)0); + __debug_iter*& __head_y = __y->__get_iterator_list((__debug_iter*)0); + __debug_iter* __p = __head_x; + __head_x = __head_y; + __head_y = __p; + for (__p = __head_x; __p; __p = __p->__next) + __p->__cont = __x; + for (__p = __head_y; __p; __p = __p->__next) + __p->__cont = __y; +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__is_deref(false_type) const +{ + if (__cont == 0) + return false; + return __i != __cont->end().base(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__is_deref(true_type) const +{ + if (__cont == 0) + return false; + return __i < __cont->end().base(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 0>) const +{ + if (__cont == 0) + return false; + return __i != __cont->begin().base(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 1>) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + return __b < __i && __i <= __b + __cont->size(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_decrement(integral_constant<int, 2>) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + return __b < __i && __i <= __b + __cont->size(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 0>) const +{ + if (__cont == 0) + return false; + return __i != __cont->end().base(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 1>) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + return __b <= __i && __i < __b + __cont->size(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_increment(integral_constant<int, 2>) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + return __b <= __i && __i < __b + __cont->size(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_add(difference_type __n, false_type) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + iterator_type __j = __i + __n; + return __b <= __j && __j <= __b + __cont->size(); +} + +template <class _Container, class _Iter> +bool +__debug_iter<_Container, _Iter>::__can_add(difference_type __n, true_type) const +{ + if (__cont == 0) + return false; + iterator_type __b = __cont->begin().base(); + iterator_type __j = __i + __n; + return __b <= __j && __j <= __b + __cont->size(); +} + +template <class _Container, class _Iter> +__debug_iter<_Container, _Iter>& +__debug_iter<_Container, _Iter>::operator+=(difference_type __n) +{ + assert(__can_add(__n)); + __i += __n; + return *this; +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + assert(__x.__cont && __x.__cont == __y.__cont); + return __x.base() == __y.base(); +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + return !(__x == __y); +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + assert(__x.__cont && __x.__cont == __y.__cont); + return __x.base() < __y.base(); +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + return __y < __x; +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + return !(__x < __y); +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + return !(__y < __x); +} + +template <class _Container, class _Iter1, class _Iter2> +inline _LIBCPP_INLINE_VISIBILITY +typename __debug_iter<_Container, _Iter1>::difference_type +operator-(const __debug_iter<_Container, _Iter1>& __x, const __debug_iter<_Container, _Iter2>& __y) +{ + assert(__x.__cont && __x.__cont == __y.__cont); + return __x.base() - __y.base(); +} + +template <class _Container, class _Iter> +inline _LIBCPP_INLINE_VISIBILITY +__debug_iter<_Container, _Iter> +operator+(typename __debug_iter<_Container, _Iter>::difference_type __n, + const __debug_iter<_Container, _Iter>& __x) +{ + return __x + __n; +} + +#endif // _LIBCPP_DEBUG + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +auto +begin(_Cp& __c) -> decltype(__c.begin()) +{ + return __c.begin(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +auto +begin(const _Cp& __c) -> decltype(__c.begin()) +{ + return __c.begin(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +auto +end(_Cp& __c) -> decltype(__c.end()) +{ + return __c.end(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +auto +end(const _Cp& __c) -> decltype(__c.end()) +{ + return __c.end(); +} + +#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +typename _Cp::iterator +begin(_Cp& __c) +{ + return __c.begin(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +typename _Cp::const_iterator +begin(const _Cp& __c) +{ + return __c.begin(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +typename _Cp::iterator +end(_Cp& __c) +{ + return __c.end(); +} + +template <class _Cp> +inline _LIBCPP_INLINE_VISIBILITY +typename _Cp::const_iterator +end(const _Cp& __c) +{ + return __c.end(); +} + +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN) + +template <class _Tp, size_t _Np> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +begin(_Tp (&__array)[_Np]) +{ + return __array; +} + +template <class _Tp, size_t _Np> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +end(_Tp (&__array)[_Np]) +{ + return __array + _Np; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_ITERATOR diff --git a/contrib/libc++/include/limits b/contrib/libc++/include/limits new file mode 100644 index 0000000..ea579ad --- /dev/null +++ b/contrib/libc++/include/limits @@ -0,0 +1,621 @@ +// -*- C++ -*- +//===---------------------------- limits ----------------------------------===// +// +// 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_LIMITS +#define _LIBCPP_LIMITS + +/* + limits synopsis + +namespace std +{ + +template<class T> +class numeric_limits +{ +public: + static const bool is_specialized = false; + static T min() noexcept; + static T max() noexcept; + static T lowest() noexcept; + + static const int digits = 0; + static const int digits10 = 0; + static const int max_digits10 = 0; + static const bool is_signed = false; + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = 0; + static T epsilon() noexcept; + static T round_error() noexcept; + + static const int min_exponent = 0; + static const int min_exponent10 = 0; + static const int max_exponent = 0; + static const int max_exponent10 = 0; + + static const bool has_infinity = false; + static const bool has_quiet_NaN = false; + static const bool has_signaling_NaN = false; + static const float_denorm_style has_denorm = denorm_absent; + static const bool has_denorm_loss = false; + static T infinity() noexcept; + static T quiet_NaN() noexcept; + static T signaling_NaN() noexcept; + static T denorm_min() noexcept; + + static const bool is_iec559 = false; + static const bool is_bounded = false; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_toward_zero; +}; + +enum float_round_style +{ + round_indeterminate = -1, + round_toward_zero = 0, + round_to_nearest = 1, + round_toward_infinity = 2, + round_toward_neg_infinity = 3 +}; + +enum float_denorm_style +{ + denorm_indeterminate = -1, + denorm_absent = 0, + denorm_present = 1 +}; + +template<> class numeric_limits<cv bool>; + +template<> class numeric_limits<cv char>; +template<> class numeric_limits<cv signed char>; +template<> class numeric_limits<cv unsigned char>; +template<> class numeric_limits<cv wchar_t>; +template<> class numeric_limits<cv char16_t>; +template<> class numeric_limits<cv char32_t>; + +template<> class numeric_limits<cv short>; +template<> class numeric_limits<cv int>; +template<> class numeric_limits<cv long>; +template<> class numeric_limits<cv long long>; +template<> class numeric_limits<cv unsigned short>; +template<> class numeric_limits<cv unsigned int>; +template<> class numeric_limits<cv unsigned long>; +template<> class numeric_limits<cv unsigned long long>; + +template<> class numeric_limits<cv float>; +template<> class numeric_limits<cv double>; +template<> class numeric_limits<cv long double>; + +} // std + +*/ + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#include <__config> +#include <type_traits> + +#include <__undef_min_max> + +#if defined(_MSC_VER) +#include "support/win32/limits_win32.h" +#endif // _MSC_VER + +_LIBCPP_BEGIN_NAMESPACE_STD + +enum float_round_style +{ + round_indeterminate = -1, + round_toward_zero = 0, + round_to_nearest = 1, + round_toward_infinity = 2, + round_toward_neg_infinity = 3 +}; + +enum float_denorm_style +{ + denorm_indeterminate = -1, + denorm_absent = 0, + denorm_present = 1 +}; + +template <class _Tp, bool = is_arithmetic<_Tp>::value> +class __libcpp_numeric_limits +{ +protected: + typedef _Tp type; + + static const bool is_specialized = false; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return type();} + + static const int digits = 0; + static const int digits10 = 0; + static const int max_digits10 = 0; + static const bool is_signed = false; + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = 0; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type();} + + static const int min_exponent = 0; + static const int min_exponent10 = 0; + static const int max_exponent = 0; + static const int max_exponent10 = 0; + + static const bool has_infinity = false; + static const bool has_quiet_NaN = false; + static const bool has_signaling_NaN = false; + static const float_denorm_style has_denorm = denorm_absent; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type();} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type();} + + static const bool is_iec559 = false; + static const bool is_bounded = false; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_toward_zero; +}; + +template <class _Tp, int digits, bool is_signed> +struct __libcpp_compute_min +{ + static const _Tp value = _Tp(_Tp(1) << digits); +}; + +template <class _Tp, int digits> +struct __libcpp_compute_min<_Tp, digits, false> +{ + static const _Tp value = _Tp(0); +}; + +template <class _Tp> +class __libcpp_numeric_limits<_Tp, true> +{ +protected: + typedef _Tp type; + + static const bool is_specialized = true; + + static const bool is_signed = type(-1) < type(0); + static const int digits = static_cast<int>(sizeof(type) * __CHAR_BIT__ - is_signed); + static const int digits10 = digits * 3 / 10; + static const int max_digits10 = 0; + static const type __min = __libcpp_compute_min<type, digits, is_signed>::value; + static const type __max = is_signed ? type(type(~0) ^ __min) : type(~0); + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __min;} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __max;} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return min();} + + static const bool is_integer = true; + static const bool is_exact = true; + static const int radix = 2; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type(0);} + + static const int min_exponent = 0; + static const int min_exponent10 = 0; + static const int max_exponent = 0; + static const int max_exponent10 = 0; + + static const bool has_infinity = false; + static const bool has_quiet_NaN = false; + static const bool has_signaling_NaN = false; + static const float_denorm_style has_denorm = denorm_absent; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type(0);} + + static const bool is_iec559 = false; + static const bool is_bounded = true; + static const bool is_modulo = true; + +#if __i386__ || __x86_64__ + static const bool traps = true; +#else + static const bool traps = false; +#endif + static const bool tinyness_before = false; + static const float_round_style round_style = round_toward_zero; +}; + +template <> +class __libcpp_numeric_limits<bool, true> +{ +protected: + typedef bool type; + + static const bool is_specialized = true; + + static const bool is_signed = false; + static const int digits = 1; + static const int digits10 = 0; + static const int max_digits10 = 0; + static const type __min = false; + static const type __max = true; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __min;} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __max;} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return min();} + + static const bool is_integer = true; + static const bool is_exact = true; + static const int radix = 2; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return type(0);} + + static const int min_exponent = 0; + static const int min_exponent10 = 0; + static const int max_exponent = 0; + static const int max_exponent10 = 0; + + static const bool has_infinity = false; + static const bool has_quiet_NaN = false; + static const bool has_signaling_NaN = false; + static const float_denorm_style has_denorm = denorm_absent; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return type(0);} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return type(0);} + + static const bool is_iec559 = false; + static const bool is_bounded = true; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_toward_zero; +}; + +template <> +class __libcpp_numeric_limits<float, true> +{ +protected: + typedef float type; + + static const bool is_specialized = true; + + static const bool is_signed = true; + static const int digits = __FLT_MANT_DIG__; + static const int digits10 = __FLT_DIG__; + static const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __FLT_MIN__;} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __FLT_MAX__;} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __FLT_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5F;} + + static const int min_exponent = __FLT_MIN_EXP__; + static const int min_exponent10 = __FLT_MIN_10_EXP__; + static const int max_exponent = __FLT_MAX_EXP__; + static const int max_exponent10 = __FLT_MAX_10_EXP__; + + static const bool has_infinity = true; + static const bool has_quiet_NaN = true; + static const bool has_signaling_NaN = true; + static const float_denorm_style has_denorm = denorm_present; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_valf();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nanf("");} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nansf("");} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __FLT_DENORM_MIN__;} + + static const bool is_iec559 = true; + static const bool is_bounded = true; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_to_nearest; +}; + +template <> +class __libcpp_numeric_limits<double, true> +{ +protected: + typedef double type; + + static const bool is_specialized = true; + + static const bool is_signed = true; + static const int digits = __DBL_MANT_DIG__; + static const int digits10 = __DBL_DIG__; + static const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __DBL_MIN__;} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __DBL_MAX__;} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __DBL_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5;} + + static const int min_exponent = __DBL_MIN_EXP__; + static const int min_exponent10 = __DBL_MIN_10_EXP__; + static const int max_exponent = __DBL_MAX_EXP__; + static const int max_exponent10 = __DBL_MAX_10_EXP__; + + static const bool has_infinity = true; + static const bool has_quiet_NaN = true; + static const bool has_signaling_NaN = true; + static const float_denorm_style has_denorm = denorm_present; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_val();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nan("");} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nans("");} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __DBL_DENORM_MIN__;} + + static const bool is_iec559 = true; + static const bool is_bounded = true; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_to_nearest; +}; + +template <> +class __libcpp_numeric_limits<long double, true> +{ +protected: + typedef long double type; + + static const bool is_specialized = true; + + static const bool is_signed = true; + static const int digits = __LDBL_MANT_DIG__; + static const int digits10 = __LDBL_DIG__; + static const int max_digits10 = 2+(digits * 30103)/100000; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __LDBL_MIN__;} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __LDBL_MAX__;} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return -max();} + + static const bool is_integer = false; + static const bool is_exact = false; + static const int radix = __FLT_RADIX__; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __LDBL_EPSILON__;} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return 0.5;} + + static const int min_exponent = __LDBL_MIN_EXP__; + static const int min_exponent10 = __LDBL_MIN_10_EXP__; + static const int max_exponent = __LDBL_MAX_EXP__; + static const int max_exponent10 = __LDBL_MAX_10_EXP__; + + static const bool has_infinity = true; + static const bool has_quiet_NaN = true; + static const bool has_signaling_NaN = true; + static const float_denorm_style has_denorm = denorm_present; + static const bool has_denorm_loss = false; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __builtin_huge_vall();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __builtin_nanl("");} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __builtin_nansl("");} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __LDBL_DENORM_MIN__;} + +#if (defined(__ppc__) || defined(__ppc64__)) + static const bool is_iec559 = false; +#else + static const bool is_iec559 = true; +#endif + static const bool is_bounded = true; + static const bool is_modulo = false; + + static const bool traps = false; + static const bool tinyness_before = false; + static const float_round_style round_style = round_to_nearest; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE numeric_limits + : private __libcpp_numeric_limits<typename remove_cv<_Tp>::type> +{ + typedef __libcpp_numeric_limits<typename remove_cv<_Tp>::type> __base; + typedef typename __base::type type; +public: + static const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + + static const int digits = __base::digits; + static const int digits10 = __base::digits10; + static const int max_digits10 = __base::max_digits10; + static const bool is_signed = __base::is_signed; + static const bool is_integer = __base::is_integer; + static const bool is_exact = __base::is_exact; + static const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + + static const int min_exponent = __base::min_exponent; + static const int min_exponent10 = __base::min_exponent10; + static const int max_exponent = __base::max_exponent; + static const int max_exponent10 = __base::max_exponent10; + + static const bool has_infinity = __base::has_infinity; + static const bool has_quiet_NaN = __base::has_quiet_NaN; + static const bool has_signaling_NaN = __base::has_signaling_NaN; + static const float_denorm_style has_denorm = __base::has_denorm; + static const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + + static const bool is_iec559 = __base::is_iec559; + static const bool is_bounded = __base::is_bounded; + static const bool is_modulo = __base::is_modulo; + + static const bool traps = __base::traps; + static const bool tinyness_before = __base::tinyness_before; + static const float_round_style round_style = __base::round_style; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE numeric_limits<const _Tp> + : private numeric_limits<_Tp> +{ + typedef numeric_limits<_Tp> __base; + typedef _Tp type; +public: + static const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + + static const int digits = __base::digits; + static const int digits10 = __base::digits10; + static const int max_digits10 = __base::max_digits10; + static const bool is_signed = __base::is_signed; + static const bool is_integer = __base::is_integer; + static const bool is_exact = __base::is_exact; + static const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + + static const int min_exponent = __base::min_exponent; + static const int min_exponent10 = __base::min_exponent10; + static const int max_exponent = __base::max_exponent; + static const int max_exponent10 = __base::max_exponent10; + + static const bool has_infinity = __base::has_infinity; + static const bool has_quiet_NaN = __base::has_quiet_NaN; + static const bool has_signaling_NaN = __base::has_signaling_NaN; + static const float_denorm_style has_denorm = __base::has_denorm; + static const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + + static const bool is_iec559 = __base::is_iec559; + static const bool is_bounded = __base::is_bounded; + static const bool is_modulo = __base::is_modulo; + + static const bool traps = __base::traps; + static const bool tinyness_before = __base::tinyness_before; + static const float_round_style round_style = __base::round_style; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE numeric_limits<volatile _Tp> + : private numeric_limits<_Tp> +{ + typedef numeric_limits<_Tp> __base; + typedef _Tp type; +public: + static const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + + static const int digits = __base::digits; + static const int digits10 = __base::digits10; + static const int max_digits10 = __base::max_digits10; + static const bool is_signed = __base::is_signed; + static const bool is_integer = __base::is_integer; + static const bool is_exact = __base::is_exact; + static const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + + static const int min_exponent = __base::min_exponent; + static const int min_exponent10 = __base::min_exponent10; + static const int max_exponent = __base::max_exponent; + static const int max_exponent10 = __base::max_exponent10; + + static const bool has_infinity = __base::has_infinity; + static const bool has_quiet_NaN = __base::has_quiet_NaN; + static const bool has_signaling_NaN = __base::has_signaling_NaN; + static const float_denorm_style has_denorm = __base::has_denorm; + static const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + + static const bool is_iec559 = __base::is_iec559; + static const bool is_bounded = __base::is_bounded; + static const bool is_modulo = __base::is_modulo; + + static const bool traps = __base::traps; + static const bool tinyness_before = __base::tinyness_before; + static const float_round_style round_style = __base::round_style; +}; + +template <class _Tp> +class _LIBCPP_VISIBLE numeric_limits<const volatile _Tp> + : private numeric_limits<_Tp> +{ + typedef numeric_limits<_Tp> __base; + typedef _Tp type; +public: + static const bool is_specialized = __base::is_specialized; + _LIBCPP_INLINE_VISIBILITY static type min() _NOEXCEPT {return __base::min();} + _LIBCPP_INLINE_VISIBILITY static type max() _NOEXCEPT {return __base::max();} + _LIBCPP_INLINE_VISIBILITY static type lowest() _NOEXCEPT {return __base::lowest();} + + static const int digits = __base::digits; + static const int digits10 = __base::digits10; + static const int max_digits10 = __base::max_digits10; + static const bool is_signed = __base::is_signed; + static const bool is_integer = __base::is_integer; + static const bool is_exact = __base::is_exact; + static const int radix = __base::radix; + _LIBCPP_INLINE_VISIBILITY static type epsilon() _NOEXCEPT {return __base::epsilon();} + _LIBCPP_INLINE_VISIBILITY static type round_error() _NOEXCEPT {return __base::round_error();} + + static const int min_exponent = __base::min_exponent; + static const int min_exponent10 = __base::min_exponent10; + static const int max_exponent = __base::max_exponent; + static const int max_exponent10 = __base::max_exponent10; + + static const bool has_infinity = __base::has_infinity; + static const bool has_quiet_NaN = __base::has_quiet_NaN; + static const bool has_signaling_NaN = __base::has_signaling_NaN; + static const float_denorm_style has_denorm = __base::has_denorm; + static const bool has_denorm_loss = __base::has_denorm_loss; + _LIBCPP_INLINE_VISIBILITY static type infinity() _NOEXCEPT {return __base::infinity();} + _LIBCPP_INLINE_VISIBILITY static type quiet_NaN() _NOEXCEPT {return __base::quiet_NaN();} + _LIBCPP_INLINE_VISIBILITY static type signaling_NaN() _NOEXCEPT {return __base::signaling_NaN();} + _LIBCPP_INLINE_VISIBILITY static type denorm_min() _NOEXCEPT {return __base::denorm_min();} + + static const bool is_iec559 = __base::is_iec559; + static const bool is_bounded = __base::is_bounded; + static const bool is_modulo = __base::is_modulo; + + static const bool traps = __base::traps; + static const bool tinyness_before = __base::tinyness_before; + static const float_round_style round_style = __base::round_style; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_LIMITS diff --git a/contrib/libc++/include/list b/contrib/libc++/include/list new file mode 100644 index 0000000..b486e83 --- /dev/null +++ b/contrib/libc++/include/list @@ -0,0 +1,2275 @@ +// -*- C++ -*- +//===---------------------------- list ------------------------------------===// +// +// 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_LIST +#define _LIBCPP_LIST + +/* + list synopsis + +namespace std +{ + +template <class T, class Alloc = allocator<T> > +class list +{ +public: + + // types: + typedef T value_type; + typedef Alloc allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef implementation-defined size_type; + typedef implementation-defined difference_type; + typedef reverse_iterator<iterator> reverse_iterator; + typedef reverse_iterator<const_iterator> const_reverse_iterator; + + list() + noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit list(const allocator_type& a); + explicit list(size_type n); + list(size_type n, const value_type& value); + list(size_type n, const value_type& value, const allocator_type& a); + template <class Iter> + list(Iter first, Iter last); + template <class Iter> + list(Iter first, Iter last, const allocator_type& a); + list(const list& x); + list(const list&, const allocator_type& a); + list(list&& x) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + list(list&&, const allocator_type& a); + list(initializer_list<value_type>); + list(initializer_list<value_type>, const allocator_type& a); + + ~list(); + + list& operator=(const list& x); + list& operator=(list&& x) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + list& operator=(initializer_list<value_type>); + template <class Iter> + void assign(Iter first, Iter last); + void assign(size_type n, const value_type& t); + void assign(initializer_list<value_type>); + + allocator_type get_allocator() const noexcept; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + template <class... Args> + void emplace_front(Args&&... args); + void pop_front(); + template <class... Args> + void emplace_back(Args&&... args); + void pop_back(); + void push_front(const value_type& x); + void push_front(value_type&& x); + void push_back(const value_type& x); + void push_back(value_type&& x); + 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 Iter> + iterator insert(const_iterator position, Iter first, Iter last); + iterator insert(const_iterator position, initializer_list<value_type> il); + + iterator erase(const_iterator position); + iterator erase(const_iterator position, const_iterator last); + + void resize(size_type sz); + void resize(size_type sz, const value_type& c); + + void swap(list&) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + void clear() noexcept; + + void splice(const_iterator position, list& x); + void splice(const_iterator position, list&& x); + void splice(const_iterator position, list& x, const_iterator i); + void splice(const_iterator position, list&& x, const_iterator i); + void splice(const_iterator position, list& x, const_iterator first, + const_iterator last); + void splice(const_iterator position, list&& x, const_iterator first, + const_iterator last); + + void remove(const value_type& value); + template <class Pred> void remove_if(Pred pred); + void unique(); + template <class BinaryPredicate> + void unique(BinaryPredicate binary_pred); + void merge(list& x); + void merge(list&& x); + template <class Compare> + void merge(list& x, Compare comp); + template <class Compare> + void merge(list&& x, Compare comp); + void sort(); + template <class Compare> + void sort(Compare comp); + void reverse() noexcept; +}; + +template <class T, class Alloc> + bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y); +template <class T, class Alloc> + bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y); +template <class T, class Alloc> + bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y); +template <class T, class Alloc> + bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y); +template <class T, class Alloc> + bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y); +template <class T, class Alloc> + bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y); + +template <class T, class Alloc> + void swap(list<T,Alloc>& x, list<T,Alloc>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> + +#include <memory> +#include <limits> +#include <initializer_list> +#include <iterator> +#include <algorithm> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _VoidPtr> struct __list_node; + +template <class _Tp, class _VoidPtr> +struct __list_node_base +{ + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__list_node<_Tp, _VoidPtr> > pointer; +#else + rebind<__list_node<_Tp, _VoidPtr> >::other pointer; +#endif + + pointer __prev_; + pointer __next_; + + _LIBCPP_INLINE_VISIBILITY + __list_node_base() + : __prev_(static_cast<pointer>(this)), + __next_(static_cast<pointer>(this)) + {} +}; + +template <class _Tp, class _VoidPtr> +struct __list_node + : public __list_node_base<_Tp, _VoidPtr> +{ + _Tp __value_; +}; + +template <class _Tp, class _Alloc> class list; +template <class _Tp, class _Alloc> class __list_imp; +template <class _Tp, class _VoidPtr> class __list_const_iterator; + +template <class _Tp, class _VoidPtr> +class _LIBCPP_VISIBLE __list_iterator +{ + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<__list_node<_Tp, _VoidPtr> > __node_pointer; +#else + rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer; +#endif + + __node_pointer __ptr_; + +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY + explicit __list_iterator(__node_pointer __p, const void* __c) _NOEXCEPT + : __ptr_(__p) + { + __get_db()->__insert_ic(this, __c); + } +#else + _LIBCPP_INLINE_VISIBILITY + explicit __list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {} +#endif + + + + template<class, class> friend class list; + template<class, class> friend class __list_imp; + template<class, class> friend class __list_const_iterator; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef value_type& reference; + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + typedef typename pointer_traits<pointer>::difference_type difference_type; + + _LIBCPP_INLINE_VISIBILITY + __list_iterator() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_i(this); +#endif + } + +#if _LIBCPP_DEBUG_LEVEL >= 2 + + _LIBCPP_INLINE_VISIBILITY + __list_iterator(const __list_iterator& __p) + : __ptr_(__p.__ptr_) + { + __get_db()->__iterator_copy(this, &__p); + } + + _LIBCPP_INLINE_VISIBILITY + ~__list_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __list_iterator& operator=(const __list_iterator& __p) + { + if (this != &__p) + { + __get_db()->__iterator_copy(this, &__p); + __ptr_ = __p.__ptr_; + } + return *this; + } + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable list::iterator"); +#endif + return __ptr_->__value_; + } + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &(operator*());} + + _LIBCPP_INLINE_VISIBILITY + __list_iterator& operator++() + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment non-incrementable list::iterator"); +#endif + __ptr_ = __ptr_->__next_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;} + + _LIBCPP_INLINE_VISIBILITY + __list_iterator& operator--() + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__decrementable(this), + "Attempted to decrement non-decrementable list::iterator"); +#endif + __ptr_ = __ptr_->__prev_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __list_iterator& __x, const __list_iterator& __y) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y), + "Attempted to compare non-comparable list::iterator"); +#endif + return __x.__ptr_ == __y.__ptr_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __list_iterator& __x, const __list_iterator& __y) + {return !(__x == __y);} +}; + +template <class _Tp, class _VoidPtr> +class _LIBCPP_VISIBLE __list_const_iterator +{ + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const __list_node<_Tp, _VoidPtr> > __node_pointer; +#else + rebind<const __list_node<_Tp, _VoidPtr> >::other __node_pointer; +#endif + + __node_pointer __ptr_; + +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY + explicit __list_const_iterator(__node_pointer __p, const void* __c) _NOEXCEPT + : __ptr_(__p) + { + __get_db()->__insert_ic(this, __c); + } +#else + _LIBCPP_INLINE_VISIBILITY + explicit __list_const_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {} +#endif + + template<class, class> friend class list; + template<class, class> friend class __list_imp; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef _Tp value_type; + typedef const value_type& reference; + typedef typename pointer_traits<_VoidPtr>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + typedef typename pointer_traits<pointer>::difference_type difference_type; + + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_i(this); +#endif + } + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator(__list_iterator<_Tp, _VoidPtr> __p) _NOEXCEPT + : __ptr_(__p.__ptr_) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__iterator_copy(this, &__p); +#endif + } + +#if _LIBCPP_DEBUG_LEVEL >= 2 + + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator(const __list_const_iterator& __p) + : __ptr_(__p.__ptr_) + { + __get_db()->__iterator_copy(this, &__p); + } + + _LIBCPP_INLINE_VISIBILITY + ~__list_const_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator& operator=(const __list_const_iterator& __p) + { + if (this != &__p) + { + __get_db()->__iterator_copy(this, &__p); + __ptr_ = __p.__ptr_; + } + return *this; + } + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY + reference operator*() const + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable list::const_iterator"); +#endif + return __ptr_->__value_; + } + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &(operator*());} + + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator& operator++() + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment non-incrementable list::const_iterator"); +#endif + __ptr_ = __ptr_->__next_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;} + + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator& operator--() + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__decrementable(this), + "Attempted to decrement non-decrementable list::const_iterator"); +#endif + __ptr_ = __ptr_->__prev_; + return *this; + } + _LIBCPP_INLINE_VISIBILITY + __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__comparable(&__x, &__y), + "Attempted to compare non-comparable list::const_iterator"); +#endif + return __x.__ptr_ == __y.__ptr_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y) + {return !(__x == __y);} +}; + +template <class _Tp, class _Alloc> +class __list_imp +{ + __list_imp(const __list_imp&); + __list_imp& operator=(const __list_imp&); +protected: + typedef _Tp value_type; + typedef _Alloc allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::void_pointer __void_pointer; + typedef __list_iterator<value_type, __void_pointer> iterator; + typedef __list_const_iterator<value_type, __void_pointer> const_iterator; + typedef __list_node_base<value_type, __void_pointer> __node_base; + typedef __list_node<value_type, __void_pointer> __node; + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__node> +#else + rebind_alloc<__node>::other +#endif + __node_allocator; + typedef allocator_traits<__node_allocator> __node_alloc_traits; + typedef typename __node_alloc_traits::pointer __node_pointer; + typedef typename __node_alloc_traits::const_pointer __node_const_pointer; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::difference_type difference_type; + + __node_base __end_; + __compressed_pair<size_type, __node_allocator> __size_alloc_; + + _LIBCPP_INLINE_VISIBILITY + size_type& __sz() _NOEXCEPT {return __size_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY + const size_type& __sz() const _NOEXCEPT + {return __size_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY + __node_allocator& __node_alloc() _NOEXCEPT + {return __size_alloc_.second();} + _LIBCPP_INLINE_VISIBILITY + const __node_allocator& __node_alloc() const _NOEXCEPT + {return __size_alloc_.second();} + + static void __unlink_nodes(__node_base& __f, __node_base& __l) _NOEXCEPT; + + __list_imp() + _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value); + __list_imp(const allocator_type& __a); + ~__list_imp(); + void clear() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __sz() == 0;} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(__end_.__next_, this); +#else + return iterator(__end_.__next_); +#endif + } + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + return const_iterator(__end_.__next_, this); +#else + return const_iterator(__end_.__next_); +#endif + } + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(static_cast<__node_pointer>(&__end_), this); +#else + return iterator(static_cast<__node_pointer>(&__end_)); +#endif + } + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + return const_iterator(static_cast<__node_const_pointer>(&__end_), this); +#else + return const_iterator(static_cast<__node_const_pointer>(&__end_)); +#endif + } + + void swap(__list_imp& __c) + _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value); + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __list_imp& __c) + {__copy_assign_alloc(__c, integral_constant<bool, + __node_alloc_traits::propagate_on_container_copy_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__list_imp& __c) + _NOEXCEPT_( + !__node_alloc_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<__node_allocator>::value) + {__move_assign_alloc(__c, integral_constant<bool, + __node_alloc_traits::propagate_on_container_move_assignment::value>());} + +private: + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y) + _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __node_alloc_traits::propagate_on_container_swap::value>());} + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<__node_allocator>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, false_type) + _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __list_imp& __c, true_type) + { + if (__node_alloc() != __c.__node_alloc()) + clear(); + __node_alloc() = __c.__node_alloc(); + } + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __list_imp& __c, false_type) + {} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__list_imp& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) + { + __node_alloc() = _VSTD::move(__c.__node_alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__list_imp& __c, false_type) + _NOEXCEPT + {} +}; + +// Unlink nodes [__f, __l] +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +__list_imp<_Tp, _Alloc>::__unlink_nodes(__node_base& __f, __node_base& __l) + _NOEXCEPT +{ + __f.__prev_->__next_ = __l.__next_; + __l.__next_->__prev_ = __f.__prev_; +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__list_imp<_Tp, _Alloc>::__list_imp() + _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) + : __size_alloc_(0) +{ +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a) + : __size_alloc_(0, __node_allocator(__a)) +{ +} + +template <class _Tp, class _Alloc> +__list_imp<_Tp, _Alloc>::~__list_imp() +{ + clear(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__erase_c(this); +#endif +} + +template <class _Tp, class _Alloc> +void +__list_imp<_Tp, _Alloc>::clear() _NOEXCEPT +{ + if (!empty()) + { + __node_allocator& __na = __node_alloc(); + __node_pointer __f = __end_.__next_; + __node_pointer __l = static_cast<__node_pointer>(&__end_); + __unlink_nodes(*__f, *__l->__prev_); + __sz() = 0; + while (__f != __l) + { + __node& __n = *__f; + __f = __f->__next_; + __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_)); + __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1); + } +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); + if (__i->__ptr_ != __l) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + } +} + +template <class _Tp, class _Alloc> +void +__list_imp<_Tp, _Alloc>::swap(__list_imp& __c) + _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) +{ + _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || + this->__node_alloc() == __c.__node_alloc(), + "list::swap: Either propagate_on_container_swap must be true" + " or the allocators must compare equal"); + using _VSTD::swap; + __swap_alloc(__node_alloc(), __c.__node_alloc()); + swap(__sz(), __c.__sz()); + swap(__end_, __c.__end_); + if (__sz() == 0) + __end_.__next_ = __end_.__prev_ = &static_cast<__node&>(__end_); + else + __end_.__prev_->__next_ = __end_.__next_->__prev_ + = &static_cast<__node&>(__end_); + if (__c.__sz() == 0) + __c.__end_.__next_ = __c.__end_.__prev_ + = &static_cast<__node&>(__c.__end_); + else + __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ + = &static_cast<__node&>(__c.__end_); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __libcpp_db* __db = __get_db(); + __c_node* __cn1 = __db->__find_c_and_lock(this); + __c_node* __cn2 = __db->__find_c(&__c); + std::swap(__cn1->beg_, __cn2->beg_); + std::swap(__cn1->end_, __cn2->end_); + std::swap(__cn1->cap_, __cn2->cap_); + for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;) + { + --__p; + const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); + if (__i->__ptr_ == static_cast<__node_pointer>(&__c.__end_)) + { + __cn2->__add(*__p); + if (--__cn1->end_ != __p) + memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*)); + } + else + (*__p)->__c_ = __cn1; + } + for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) + { + --__p; + const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); + if (__i->__ptr_ == static_cast<__node_pointer>(&__end_)) + { + __cn1->__add(*__p); + if (--__cn2->end_ != __p) + memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); + } + else + (*__p)->__c_ = __cn2; + } + __db->unlock(); +#endif +} + +template <class _Tp, class _Alloc = allocator<_Tp> > +class _LIBCPP_VISIBLE list + : private __list_imp<_Tp, _Alloc> +{ + typedef __list_imp<_Tp, _Alloc> base; + typedef typename base::__node __node; + typedef typename base::__node_allocator __node_allocator; + typedef typename base::__node_pointer __node_pointer; + typedef typename base::__node_alloc_traits __node_alloc_traits; + +public: + typedef _Tp value_type; + typedef _Alloc allocator_type; + static_assert((is_same<value_type, typename allocator_type::value_type>::value), + "Invalid allocator::value_type"); + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename base::pointer pointer; + typedef typename base::const_pointer const_pointer; + typedef typename base::size_type size_type; + typedef typename base::difference_type difference_type; + typedef typename base::iterator iterator; + typedef typename base::const_iterator const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + _LIBCPP_INLINE_VISIBILITY + list() + _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + } + _LIBCPP_INLINE_VISIBILITY + list(const allocator_type& __a) : base(__a) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + } + list(size_type __n); + list(size_type __n, const value_type& __x); + list(size_type __n, const value_type& __x, const allocator_type& __a); + template <class _InpIter> + list(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); + template <class _InpIter> + list(_InpIter __f, _InpIter __l, const allocator_type& __a, + typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); + + list(const list& __c); + list(const list& __c, const allocator_type& __a); + list& operator=(const list& __c); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + list(initializer_list<value_type> __il); + list(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + list(list&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); + list(list&& __c, const allocator_type& __a); + list& operator=(list&& __c) + _NOEXCEPT_( + __node_alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + list& operator=(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end()); return *this;} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + template <class _InpIter> + void assign(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); + void assign(size_type __n, const value_type& __x); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void assign(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + allocator_type get_allocator() const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return base::__sz();} + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return base::empty();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + {return numeric_limits<difference_type>::max();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return base::begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return base::begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return base::end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return base::end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return base::begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return base::end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + reference front() + { + _LIBCPP_ASSERT(!empty(), "list::front called on empty list"); + return base::__end_.__next_->__value_; + } + _LIBCPP_INLINE_VISIBILITY + const_reference front() const + { + _LIBCPP_ASSERT(!empty(), "list::front called on empty list"); + return base::__end_.__next_->__value_; + } + _LIBCPP_INLINE_VISIBILITY + reference back() + { + _LIBCPP_ASSERT(!empty(), "list::back called on empty list"); + return base::__end_.__prev_->__value_; + } + _LIBCPP_INLINE_VISIBILITY + const_reference back() const + { + _LIBCPP_ASSERT(!empty(), "list::back called on empty list"); + return base::__end_.__prev_->__value_; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void push_front(value_type&& __x); + void push_back(value_type&& __x); +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> + void emplace_front(_Args&&... __args); + template <class... _Args> + void emplace_back(_Args&&... __args); + template <class... _Args> + iterator emplace(const_iterator __p, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS + iterator insert(const_iterator __p, value_type&& __x); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + void push_front(const value_type& __x); + void push_back(const value_type& __x); + + iterator insert(const_iterator __p, const value_type& __x); + iterator insert(const_iterator __p, size_type __n, const value_type& __x); + template <class _InpIter> + iterator insert(const_iterator __p, _InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, initializer_list<value_type> __il) + {return insert(__p, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + void swap(list& __c) + _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<__node_allocator>::value) + {base::swap(__c);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {base::clear();} + + void pop_front(); + void pop_back(); + + iterator erase(const_iterator __p); + iterator erase(const_iterator __f, const_iterator __l); + + void resize(size_type __n); + void resize(size_type __n, const value_type& __x); + + void splice(const_iterator __p, list& __c); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void splice(const_iterator __p, list&& __c) {splice(__p, __c);} +#endif + void splice(const_iterator __p, list& __c, const_iterator __i); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void splice(const_iterator __p, list&& __c, const_iterator __i) + {splice(__p, __c, __i);} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l) + {splice(__p, __c, __f, __l);} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + void remove(const value_type& __x); + template <class _Pred> void remove_if(_Pred __pred); + void unique(); + template <class _BinaryPred> + void unique(_BinaryPred __binary_pred); + void merge(list& __c); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void merge(list&& __c) {merge(__c);} +#endif + template <class _Comp> + void merge(list& __c, _Comp __comp); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Comp> + _LIBCPP_INLINE_VISIBILITY + void merge(list&& __c, _Comp __comp) {merge(__c, __comp);} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void sort(); + template <class _Comp> + void sort(_Comp __comp); + + void reverse() _NOEXCEPT; + + bool __invariants() const; + +#if _LIBCPP_DEBUG_LEVEL >= 2 + + bool __dereferenceable(const const_iterator* __i) const; + bool __decrementable(const const_iterator* __i) const; + bool __addable(const const_iterator* __i, ptrdiff_t __n) const; + bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + +private: + static void __link_nodes(__node& __p, __node& __f, __node& __l); + iterator __iterator(size_type __n); + template <class _Comp> + static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp); + + void __move_assign(list& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value); + void __move_assign(list& __c, false_type); +}; + +// Link in nodes [__f, __l] just prior to __p +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +list<_Tp, _Alloc>::__link_nodes(__node& __p, __node& __f, __node& __l) +{ + __p.__prev_->__next_ = &__f; + __f.__prev_ = __p.__prev_; + __p.__prev_ = &__l; + __l.__next_ = &__p; +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::__iterator(size_type __n) +{ + return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n) + : _VSTD::prev(end(), base::__sz() - __n); +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(size_type __n) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (; __n > 0; --__n) +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + emplace_back(); +#else + push_back(value_type()); +#endif +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(size_type __n, const value_type& __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (; __n > 0; --__n) + push_back(__x); +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(size_type __n, const value_type& __x, const allocator_type& __a) + : base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (; __n > 0; --__n) + push_back(__x); +} + +template <class _Tp, class _Alloc> +template <class _InpIter> +list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type*) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (; __f != __l; ++__f) + push_back(*__f); +} + +template <class _Tp, class _Alloc> +template <class _InpIter> +list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a, + typename enable_if<__is_input_iterator<_InpIter>::value>::type*) + : base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (; __f != __l; ++__f) + push_back(*__f); +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(const list& __c) + : base(allocator_type( + __node_alloc_traits::select_on_container_copy_construction( + __c.__node_alloc()))) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) + push_back(*__i); +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(const list& __c, const allocator_type& __a) + : base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) + push_back(*__i); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a) + : base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (typename initializer_list<value_type>::const_iterator __i = __il.begin(), + __e = __il.end(); __i != __e; ++__i) + push_back(*__i); +} + +template <class _Tp, class _Alloc> +list<_Tp, _Alloc>::list(initializer_list<value_type> __il) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + for (typename initializer_list<value_type>::const_iterator __i = __il.begin(), + __e = __il.end(); __i != __e; ++__i) + push_back(*__i); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +list<_Tp, _Alloc>& +list<_Tp, _Alloc>::operator=(const list& __c) +{ + if (this != &__c) + { + base::__copy_assign_alloc(__c); + assign(__c.begin(), __c.end()); + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +list<_Tp, _Alloc>::list(list&& __c) + _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value) + : base(allocator_type(_VSTD::move(__c.__node_alloc()))) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + splice(end(), __c); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a) + : base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + if (__a == __c.get_allocator()) + splice(end(), __c); + else + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__c.begin()), _Ip(__c.end())); + } +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +list<_Tp, _Alloc>& +list<_Tp, _Alloc>::operator=(list&& __c) + _NOEXCEPT_( + __node_alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value) +{ + __move_assign(__c, integral_constant<bool, + __node_alloc_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::__move_assign(list& __c, false_type) +{ + if (base::__node_alloc() != __c.__node_alloc()) + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__c.begin()), _Ip(__c.end())); + } + else + __move_assign(__c, true_type()); +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::__move_assign(list& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) +{ + clear(); + base::__move_assign_alloc(__c); + splice(end(), __c); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +template <class _InpIter> +void +list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type*) +{ + iterator __i = begin(); + iterator __e = end(); + for (; __f != __l && __i != __e; ++__f, ++__i) + *__i = *__f; + if (__i == __e) + insert(__e, __f, __l); + else + erase(__i, __e); +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x) +{ + iterator __i = begin(); + iterator __e = end(); + for (; __n > 0 && __i != __e; --__n, ++__i) + *__i = __x; + if (__i == __e) + insert(__e, __n, __x); + else + erase(__i, __e); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +_Alloc +list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT +{ + return allocator_type(base::__node_alloc()); +} + +template <class _Tp, class _Alloc> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::insert(iterator, x) called with an iterator not" + " referring to this list"); +#endif + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold); + ++base::__sz(); + return iterator(__hold.release()); +} + +template <class _Tp, class _Alloc> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::insert(iterator, n, x) called with an iterator not" + " referring to this list"); + iterator __r(const_cast<__node_pointer>(__p.__ptr_), this); +#else + iterator __r(const_cast<__node_pointer>(__p.__ptr_)); +#endif + if (__n > 0) + { + size_type __ds = 0; + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + ++__ds; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __r = iterator(__hold.get(), this); +#else + __r = iterator(__hold.get()); +#endif + __hold.release(); + iterator __e = __r; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (--__n; __n != 0; --__n, ++__e, ++__ds) + { + __hold.reset(__node_alloc_traits::allocate(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + __e.__ptr_->__next_ = __hold.get(); + __hold->__prev_ = __e.__ptr_; + __hold.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (true) + { + __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); + __node_pointer __prev = __e.__ptr_->__prev_; + __node_alloc_traits::deallocate(__na, __e.__ptr_, 1); + if (__prev == 0) + break; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __e = iterator(__prev, this); +#else + __e = iterator(__prev); +#endif + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_); + base::__sz() += __ds; + } + return __r; +} + +template <class _Tp, class _Alloc> +template <class _InpIter> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l, + typename enable_if<__is_input_iterator<_InpIter>::value>::type*) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::insert(iterator, range) called with an iterator not" + " referring to this list"); + iterator __r(const_cast<__node_pointer>(__p.__ptr_), this); +#else + iterator __r(const_cast<__node_pointer>(__p.__ptr_)); +#endif + if (__f != __l) + { + size_type __ds = 0; + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); + ++__ds; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __r = iterator(__hold.get(), this); +#else + __r = iterator(__hold.get()); +#endif + __hold.release(); + iterator __e = __r; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (++__f; __f != __l; ++__f, ++__e, ++__ds) + { + __hold.reset(__node_alloc_traits::allocate(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); + __e.__ptr_->__next_ = __hold.get(); + __hold->__prev_ = __e.__ptr_; + __hold.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (true) + { + __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); + __node_pointer __prev = __e.__ptr_->__prev_; + __node_alloc_traits::deallocate(__na, __e.__ptr_, 1); + if (__prev == 0) + break; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __e = iterator(__prev, this); +#else + __e = iterator(__prev); +#endif + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __link_nodes(const_cast<__node&>(*__p.__ptr_), *__r.__ptr_, *__e.__ptr_); + base::__sz() += __ds; + } + return __r; +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::push_front(const value_type& __x) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + __link_nodes(*base::__end_.__next_, *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::push_back(const value_type& __x) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::push_front(value_type&& __x) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); + __link_nodes(*base::__end_.__next_, *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::push_back(value_type&& __x) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); + __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +template <class... _Args> +void +list<_Tp, _Alloc>::emplace_front(_Args&&... __args) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); + __link_nodes(*base::__end_.__next_, *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +template <class _Tp, class _Alloc> +template <class... _Args> +void +list<_Tp, _Alloc>::emplace_back(_Args&&... __args) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); + __link_nodes(static_cast<__node&>(base::__end_), *__hold, *__hold); + ++base::__sz(); + __hold.release(); +} + +template <class _Tp, class _Alloc> +template <class... _Args> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args) +{ + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); + __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold); + ++base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(__hold.release(), this); +#else + return iterator(__hold.release()); +#endif +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Alloc> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::insert(iterator, x) called with an iterator not" + " referring to this list"); +#endif + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); + __link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold); + ++base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(__hold.release(), this); +#else + return iterator(__hold.release()); +#endif +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::pop_front() +{ + _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list"); + __node_allocator& __na = base::__node_alloc(); + __node& __n = *base::__end_.__next_; + base::__unlink_nodes(__n, __n); + --base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ == &__n) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_)); + __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1); +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::pop_back() +{ + _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list"); + __node_allocator& __na = base::__node_alloc(); + __node& __n = *base::__end_.__prev_; + base::__unlink_nodes(__n, __n); + --base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ == &__n) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_)); + __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1); +} + +template <class _Tp, class _Alloc> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::erase(const_iterator __p) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::erase(iterator) called with an iterator not" + " referring to this list"); +#endif + __node_allocator& __na = base::__node_alloc(); + __node& __n = const_cast<__node&>(*__p.__ptr_); + __node_pointer __r = __n.__next_; + base::__unlink_nodes(__n, __n); + --base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ == &__n) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_)); + __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1); +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(__r, this); +#else + return iterator(__r); +#endif +} + +template <class _Tp, class _Alloc> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == this, + "list::erase(iterator, iterator) called with an iterator not" + " referring to this list"); +#endif + if (__f != __l) + { + __node_allocator& __na = base::__node_alloc(); + base::__unlink_nodes(const_cast<__node&>(*__f.__ptr_), *__l.__ptr_->__prev_); + while (__f != __l) + { + __node& __n = const_cast<__node&>(*__f.__ptr_); + ++__f; + --base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ == &__n) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __node_alloc_traits::destroy(__na, _VSTD::addressof(__n.__value_)); + __node_alloc_traits::deallocate(__na, _VSTD::addressof(__n), 1); + } + } +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(const_cast<__node_pointer>(__l.__ptr_), this); +#else + return iterator(const_cast<__node_pointer>(__l.__ptr_)); +#endif +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::resize(size_type __n) +{ + if (__n < base::__sz()) + erase(__iterator(__n), end()); + else if (__n > base::__sz()) + { + __n -= base::__sz(); + size_type __ds = 0; + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_)); + ++__ds; +#if _LIBCPP_DEBUG_LEVEL >= 2 + iterator __r = iterator(__hold.release(), this); +#else + iterator __r = iterator(__hold.release()); +#endif + iterator __e = __r; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (--__n; __n != 0; --__n, ++__e, ++__ds) + { + __hold.reset(__node_alloc_traits::allocate(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_)); + __e.__ptr_->__next_ = __hold.get(); + __hold->__prev_ = __e.__ptr_; + __hold.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (true) + { + __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); + __node_pointer __prev = __e.__ptr_->__prev_; + __node_alloc_traits::deallocate(__na, __e.__ptr_, 1); + if (__prev == 0) + break; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __e = iterator(__prev, this); +#else + __e = iterator(__prev); +#endif + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_); + base::__sz() += __ds; + } +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x) +{ + if (__n < base::__sz()) + erase(__iterator(__n), end()); + else if (__n > base::__sz()) + { + __n -= base::__sz(); + size_type __ds = 0; + __node_allocator& __na = base::__node_alloc(); + typedef __allocator_destructor<__node_allocator> _Dp; + unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); + __hold->__prev_ = 0; + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + ++__ds; +#if _LIBCPP_DEBUG_LEVEL >= 2 + iterator __r = iterator(__hold.release(), this); +#else + iterator __r = iterator(__hold.release()); +#endif + iterator __e = __r; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (--__n; __n != 0; --__n, ++__e, ++__ds) + { + __hold.reset(__node_alloc_traits::allocate(__na, 1)); + __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); + __e.__ptr_->__next_ = __hold.get(); + __hold->__prev_ = __e.__ptr_; + __hold.release(); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + while (true) + { + __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); + __node_pointer __prev = __e.__ptr_->__prev_; + __node_alloc_traits::deallocate(__na, __e.__ptr_, 1); + if (__prev == 0) + break; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __e = iterator(__prev, this); +#else + __e = iterator(__prev); +#endif + } + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __link_nodes(static_cast<__node&>(base::__end_), *__r.__ptr_, *__e.__ptr_); + base::__sz() += __ds; + } +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::splice(const_iterator __p, list& __c) +{ + _LIBCPP_ASSERT(this != &__c, + "list::splice(iterator, list) called with this == &list"); +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::splice(iterator, list) called with an iterator not" + " referring to this list"); +#endif + if (!__c.empty()) + { + __node& __f = *__c.__end_.__next_; + __node& __l = *__c.__end_.__prev_; + base::__unlink_nodes(__f, __l); + __link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __l); + base::__sz() += __c.__sz(); + __c.__sz() = 0; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __libcpp_db* __db = __get_db(); + __c_node* __cn1 = __db->__find_c_and_lock(this); + __c_node* __cn2 = __db->__find_c(&__c); + for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_)) + { + __cn1->__add(*__p); + (*__p)->__c_ = __cn1; + if (--__cn2->end_ != __p) + memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); + } + } + __db->unlock(); +#endif + } +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::splice(iterator, list, iterator) called with first iterator not" + " referring to this list"); + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__i) == &__c, + "list::splice(iterator, list, iterator) called with second iterator not" + " referring to list argument"); + _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(&__i), + "list::splice(iterator, list, iterator) called with second iterator not" + " derefereceable"); +#endif + if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_) + { + __node& __f = const_cast<__node&>(*__i.__ptr_); + base::__unlink_nodes(__f, __f); + __link_nodes(const_cast<__node&>(*__p.__ptr_), __f, __f); + --__c.__sz(); + ++base::__sz(); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __libcpp_db* __db = __get_db(); + __c_node* __cn1 = __db->__find_c_and_lock(this); + __c_node* __cn2 = __db->__find_c(&__c); + for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) + { + --__p; + iterator* __j = static_cast<iterator*>((*__p)->__i_); + if (__j->__ptr_ == &__f) + { + __cn1->__add(*__p); + (*__p)->__c_ = __cn1; + if (--__cn2->end_ != __p) + memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); + } + } + __db->unlock(); +#endif + } +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, + "list::splice(iterator, list, iterator, iterator) called with first iterator not" + " referring to this list"); + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == &__c, + "list::splice(iterator, list, iterator, iterator) called with second iterator not" + " referring to list argument"); + if (this == &__c) + { + for (const_iterator __i = __f; __i != __l; ++__i) + _LIBCPP_ASSERT(__i != __p, + "list::splice(iterator, list, iterator, iterator)" + " called with the first iterator within the range" + " of the second and third iterators"); + } +#endif + if (__f != __l) + { + if (this != &__c) + { + size_type __s = _VSTD::distance(__f, __l); + __c.__sz() -= __s; + base::__sz() += __s; + } + __node& __first = const_cast<__node&>(*__f.__ptr_); + --__l; + __node& __last = const_cast<__node&>(*__l.__ptr_); + base::__unlink_nodes(__first, __last); + __link_nodes(const_cast<__node&>(*__p.__ptr_), __first, __last); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __libcpp_db* __db = __get_db(); + __c_node* __cn1 = __db->__find_c_and_lock(this); + __c_node* __cn2 = __db->__find_c(&__c); + for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) + { + --__p; + iterator* __j = static_cast<iterator*>((*__p)->__i_); + for (__node_pointer __k = const_cast<__node_pointer>(__f.__ptr_); + __k != __l.__ptr_; __k = __k->__next_) + { + if (__j->__ptr_ == __k) + { + __cn1->__add(*__p); + (*__p)->__c_ = __cn1; + if (--__cn2->end_ != __p) + memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); + } + } + } + __db->unlock(); +#endif + } +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::remove(const value_type& __x) +{ + for (iterator __i = begin(), __e = end(); __i != __e;) + { + if (*__i == __x) + { + iterator __j = _VSTD::next(__i); + for (; __j != __e && *__j == __x; ++__j) + ; + __i = erase(__i, __j); + } + else + ++__i; + } +} + +template <class _Tp, class _Alloc> +template <class _Pred> +void +list<_Tp, _Alloc>::remove_if(_Pred __pred) +{ + for (iterator __i = begin(), __e = end(); __i != __e;) + { + if (__pred(*__i)) + { + iterator __j = _VSTD::next(__i); + for (; __j != __e && __pred(*__j); ++__j) + ; + __i = erase(__i, __j); + } + else + ++__i; + } +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +list<_Tp, _Alloc>::unique() +{ + unique(__equal_to<value_type>()); +} + +template <class _Tp, class _Alloc> +template <class _BinaryPred> +void +list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred) +{ + for (iterator __i = begin(), __e = end(); __i != __e;) + { + iterator __j = _VSTD::next(__i); + for (; __j != __e && __binary_pred(*__i, *__j); ++__j) + ; + if (++__i != __j) + __i = erase(__i, __j); + } +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +list<_Tp, _Alloc>::merge(list& __c) +{ + merge(__c, __less<value_type>()); +} + +template <class _Tp, class _Alloc> +template <class _Comp> +void +list<_Tp, _Alloc>::merge(list& __c, _Comp __comp) +{ + if (this != &__c) + { + iterator __f1 = begin(); + iterator __e1 = end(); + iterator __f2 = __c.begin(); + iterator __e2 = __c.end(); + while (__f1 != __e1 && __f2 != __e2) + { + if (__comp(*__f2, *__f1)) + { + size_type __ds = 1; + iterator __m2 = _VSTD::next(__f2); + for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, ++__ds) + ; + base::__sz() += __ds; + __c.__sz() -= __ds; + __node& __f = *__f2.__ptr_; + __node& __l = *__m2.__ptr_->__prev_; + __f2 = __m2; + base::__unlink_nodes(__f, __l); + __m2 = _VSTD::next(__f1); + __link_nodes(*__f1.__ptr_, __f, __l); + __f1 = __m2; + } + else + ++__f1; + } + splice(__e1, __c); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __libcpp_db* __db = __get_db(); + __c_node* __cn1 = __db->__find_c_and_lock(this); + __c_node* __cn2 = __db->__find_c(&__c); + for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) + { + --__p; + iterator* __i = static_cast<iterator*>((*__p)->__i_); + if (__i->__ptr_ != static_cast<__node_pointer>(&__c.__end_)) + { + __cn1->__add(*__p); + (*__p)->__c_ = __cn1; + if (--__cn2->end_ != __p) + memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); + } + } + __db->unlock(); +#endif + } +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +list<_Tp, _Alloc>::sort() +{ + sort(__less<value_type>()); +} + +template <class _Tp, class _Alloc> +template <class _Comp> +inline _LIBCPP_INLINE_VISIBILITY +void +list<_Tp, _Alloc>::sort(_Comp __comp) +{ + __sort(begin(), end(), base::__sz(), __comp); +} + +template <class _Tp, class _Alloc> +template <class _Comp> +typename list<_Tp, _Alloc>::iterator +list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp) +{ + switch (__n) + { + case 0: + case 1: + return __f1; + case 2: + if (__comp(*--__e2, *__f1)) + { + __node& __f = *__e2.__ptr_; + base::__unlink_nodes(__f, __f); + __link_nodes(*__f1.__ptr_, __f, __f); + return __e2; + } + return __f1; + } + size_type __n2 = __n / 2; + iterator __e1 = _VSTD::next(__f1, __n2); + iterator __r = __f1 = __sort(__f1, __e1, __n2, __comp); + iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp); + if (__comp(*__f2, *__f1)) + { + iterator __m2 = _VSTD::next(__f2); + for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2) + ; + __node& __f = *__f2.__ptr_; + __node& __l = *__m2.__ptr_->__prev_; + __r = __f2; + __e1 = __f2 = __m2; + base::__unlink_nodes(__f, __l); + __m2 = _VSTD::next(__f1); + __link_nodes(*__f1.__ptr_, __f, __l); + __f1 = __m2; + } + else + ++__f1; + while (__f1 != __e1 && __f2 != __e2) + { + if (__comp(*__f2, *__f1)) + { + iterator __m2 = _VSTD::next(__f2); + for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2) + ; + __node& __f = *__f2.__ptr_; + __node& __l = *__m2.__ptr_->__prev_; + if (__e1 == __f2) + __e1 = __m2; + __f2 = __m2; + base::__unlink_nodes(__f, __l); + __m2 = _VSTD::next(__f1); + __link_nodes(*__f1.__ptr_, __f, __l); + __f1 = __m2; + } + else + ++__f1; + } + return __r; +} + +template <class _Tp, class _Alloc> +void +list<_Tp, _Alloc>::reverse() _NOEXCEPT +{ + if (base::__sz() > 1) + { + iterator __e = end(); + for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;) + { + _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_); + __i.__ptr_ = __i.__ptr_->__prev_; + } + _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_); + } +} + +template <class _Tp, class _Alloc> +bool +list<_Tp, _Alloc>::__invariants() const +{ + return size() == _VSTD::distance(begin(), end()); +} + +#if _LIBCPP_DEBUG_LEVEL >= 2 + +template <class _Tp, class _Alloc> +bool +list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const +{ + return __i->__ptr_ != &this->__end_; +} + +template <class _Tp, class _Alloc> +bool +list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const +{ + return !empty() && __i->__ptr_ != base::__end_.__next_; +} + +template <class _Tp, class _Alloc> +bool +list<_Tp, _Alloc>::__addable(const const_iterator* __i, ptrdiff_t __n) const +{ + return false; +} + +template <class _Tp, class _Alloc> +bool +list<_Tp, _Alloc>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const +{ + return false; +} + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_LIST diff --git a/contrib/libc++/include/locale b/contrib/libc++/include/locale new file mode 100644 index 0000000..bec27f6 --- /dev/null +++ b/contrib/libc++/include/locale @@ -0,0 +1,4524 @@ +// -*- C++ -*- +//===-------------------------- locale ------------------------------------===// +// +// 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_LOCALE +#define _LIBCPP_LOCALE + +/* + locale synopsis + +namespace std +{ + +class locale +{ +public: + // types: + class facet; + class id; + + typedef int category; + static const category // values assigned here are for exposition only + none = 0x000, + collate = 0x010, + ctype = 0x020, + monetary = 0x040, + numeric = 0x080, + time = 0x100, + messages = 0x200, + all = collate | ctype | monetary | numeric | time | messages; + + // construct/copy/destroy: + locale() noexcept; + locale(const locale& other) noexcept; + explicit locale(const char* std_name); + explicit locale(const string& std_name); + locale(const locale& other, const char* std_name, category); + locale(const locale& other, const string& std_name, category); + template <class Facet> locale(const locale& other, Facet* f); + locale(const locale& other, const locale& one, category); + + ~locale(); // not virtual + + const locale& operator=(const locale& other) noexcept; + + template <class Facet> locale combine(const locale& other) const; + + // locale operations: + basic_string<char> name() const; + bool operator==(const locale& other) const; + bool operator!=(const locale& other) const; + template <class charT, class Traits, class Allocator> + bool operator()(const basic_string<charT,Traits,Allocator>& s1, + const basic_string<charT,Traits,Allocator>& s2) const; + + // global locale objects: + static locale global(const locale&); + static const locale& classic(); +}; + +template <class Facet> const Facet& use_facet(const locale&); +template <class Facet> bool has_facet(const locale&) noexcept; + +// 22.3.3, convenience interfaces: +template <class charT> bool isspace (charT c, const locale& loc); +template <class charT> bool isprint (charT c, const locale& loc); +template <class charT> bool iscntrl (charT c, const locale& loc); +template <class charT> bool isupper (charT c, const locale& loc); +template <class charT> bool islower (charT c, const locale& loc); +template <class charT> bool isalpha (charT c, const locale& loc); +template <class charT> bool isdigit (charT c, const locale& loc); +template <class charT> bool ispunct (charT c, const locale& loc); +template <class charT> bool isxdigit(charT c, const locale& loc); +template <class charT> bool isalnum (charT c, const locale& loc); +template <class charT> bool isgraph (charT c, const locale& loc); +template <class charT> charT toupper(charT c, const locale& loc); +template <class charT> charT tolower(charT c, const locale& loc); + +template<class Codecvt, class Elem = wchar_t, + class Wide_alloc = allocator<Elem>, + class Byte_alloc = allocator<char>> +class wstring_convert +{ +public: + typedef basic_string<char, char_traits<char>, Byte_alloc> byte_string; + typedef basic_string<Elem, char_traits<Elem>, Wide_alloc> wide_string; + typedef typename Codecvt::state_type state_type; + typedef typename wide_string::traits_type::int_type int_type; + + wstring_convert(Codecvt* pcvt = new Codecvt); + wstring_convert(Codecvt* pcvt, state_type state); + wstring_convert(const byte_string& byte_err, + const wide_string& wide_err = wide_string()); + ~wstring_convert(); + + wide_string from_bytes(char byte); + wide_string from_bytes(const char* ptr); + wide_string from_bytes(const byte_string& str); + wide_string from_bytes(const char* first, const char* last); + + byte_string to_bytes(Elem wchar); + byte_string to_bytes(const Elem* wptr); + byte_string to_bytes(const wide_string& wstr); + byte_string to_bytes(const Elem* first, const Elem* last); + + size_t converted() const; + state_type state() const; +}; + +template <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>> +class wbuffer_convert + : public basic_streambuf<Elem, Tr> +{ +public: + typedef typename Tr::state_type state_type; + + wbuffer_convert(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt, + state_type state = state_type()); + + streambuf* rdbuf() const; + streambuf* rdbuf(streambuf* bytebuf); + + state_type state() const; +}; + +// 22.4.1 and 22.4.1.3, ctype: +class ctype_base; +template <class charT> class ctype; +template <> class ctype<char>; // specialization +template <class charT> class ctype_byname; +template <> class ctype_byname<char>; // specialization + +class codecvt_base; +template <class internT, class externT, class stateT> class codecvt; +template <class internT, class externT, class stateT> class codecvt_byname; + +// 22.4.2 and 22.4.3, numeric: +template <class charT, class InputIterator> class num_get; +template <class charT, class OutputIterator> class num_put; +template <class charT> class numpunct; +template <class charT> class numpunct_byname; + +// 22.4.4, col lation: +template <class charT> class collate; +template <class charT> class collate_byname; + +// 22.4.5, date and time: +class time_base; +template <class charT, class InputIterator> class time_get; +template <class charT, class InputIterator> class time_get_byname; +template <class charT, class OutputIterator> class time_put; +template <class charT, class OutputIterator> class time_put_byname; + +// 22.4.6, money: +class money_base; +template <class charT, class InputIterator> class money_get; +template <class charT, class OutputIterator> class money_put; +template <class charT, bool Intl> class moneypunct; +template <class charT, bool Intl> class moneypunct_byname; + +// 22.4.7, message retrieval: +class messages_base; +template <class charT> class messages; +template <class charT> class messages_byname; + +} // std + +*/ + +#include <__config> +#include <__locale> +#include <algorithm> +#include <memory> +#include <ios> +#include <streambuf> +#include <iterator> +#include <limits> +#if !__APPLE__ +#include <cstdarg> +#endif +#include <cstdlib> +#include <ctime> +#if _WIN32 +#include <support/win32/locale_win32.h> +#else // _WIN32 +#include <nl_types.h> +#endif // !_WIN32 + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if __APPLE__ || __FreeBSD__ +# define _LIBCPP_GET_C_LOCALE 0 +#else +# define _LIBCPP_GET_C_LOCALE __cloc() + // Get the C locale object + locale_t __cloc(); +#define __cloc_defined +#endif + +typedef _VSTD::remove_pointer<locale_t>::type __locale_struct; +typedef _VSTD::unique_ptr<__locale_struct, decltype(&freelocale)> __locale_unique_ptr; +#ifndef _LIBCPP_LOCALE__L_EXTENSIONS +typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii; +#endif + +// OSX has nice foo_l() functions that let you turn off use of the global +// locale. Linux, not so much. The following functions avoid the locale when +// that's possible and otherwise do the wrong thing. FIXME. +#ifdef __linux__ + +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS +decltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>())) +inline _LIBCPP_INLINE_VISIBILITY +__mb_cur_max_l(locale_t __l) +{ + return MB_CUR_MAX_L(__l); +} +#else // _LIBCPP_LOCALE__L_EXTENSIONS +_LIBCPP_ALWAYS_INLINE inline +decltype(MB_CUR_MAX) __mb_cur_max_l(locale_t __l) +{ + __locale_raii __current(uselocale(__l), uselocale); + return MB_CUR_MAX; +} +#endif // _LIBCPP_LOCALE__L_EXTENSIONS + +_LIBCPP_ALWAYS_INLINE inline +wint_t __btowc_l(int __c, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return btowc_l(__c, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return btowc(__c); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +int __wctob_l(wint_t __c, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wctob_l(__c, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wctob(__c); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc, + size_t __len, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wcsnrtombs_l(__dest, __src, __nwc, __len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wcsnrtombs(__dest, __src, __nwc, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wcrtomb_l(__s, __wc, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wcrtomb(__s, __wc, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms, + size_t __len, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbsnrtowcs_l(__dest, __src, __nms, __len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbsnrtowcs(__dest, __src, __nms, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, + mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbrtowc_l(__pwc, __s, __n, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbrtowc(__pwc, __s, __n, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbtowc_l(__pwc, __pmb, __max, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbtowc(__pwc, __pmb, __max); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbrlen_l(__s, __n, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbrlen(__s, __n, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +lconv *__localeconv_l(locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return localeconv_l(__l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return localeconv(); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, + mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbsrtowcs_l(__dest, __src, __len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbsrtowcs(__dest, __src, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +int __sprintf_l(char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsprintf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsprintf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsnprintf_l(__s, __n, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsnprintf(__s, __n, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __asprintf_l(char **__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vasprintf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vasprintf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsscanf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsscanf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +#endif // __linux__ + +// __scan_keyword +// Scans [__b, __e) until a match is found in the basic_strings range +// [__kb, __ke) or until it can be shown that there is no match in [__kb, __ke). +// __b will be incremented (visibly), consuming CharT until a match is found +// or proved to not exist. A keyword may be "", in which will match anything. +// If one keyword is a prefix of another, and the next CharT in the input +// might match another keyword, the algorithm will attempt to find the longest +// matching keyword. If the longer matching keyword ends up not matching, then +// no keyword match is found. If no keyword match is found, __ke is returned +// and failbit is set in __err. +// Else an iterator pointing to the matching keyword is found. If more than +// one keyword matches, an iterator to the first matching keyword is returned. +// If on exit __b == __e, eofbit is set in __err. If __case_senstive is false, +// __ct is used to force to lower case before comparing characters. +// Examples: +// Keywords: "a", "abb" +// If the input is "a", the first keyword matches and eofbit is set. +// If the input is "abc", no match is found and "ab" are consumed. +template <class _InputIterator, class _ForwardIterator, class _Ctype> +_LIBCPP_HIDDEN +_ForwardIterator +__scan_keyword(_InputIterator& __b, _InputIterator __e, + _ForwardIterator __kb, _ForwardIterator __ke, + const _Ctype& __ct, ios_base::iostate& __err, + bool __case_sensitive = true) +{ + typedef typename iterator_traits<_InputIterator>::value_type _CharT; + size_t __nkw = static_cast<size_t>(_VSTD::distance(__kb, __ke)); + const unsigned char __doesnt_match = '\0'; + const unsigned char __might_match = '\1'; + const unsigned char __does_match = '\2'; + unsigned char __statbuf[100]; + unsigned char* __status = __statbuf; + unique_ptr<unsigned char, void(*)(void*)> __stat_hold(0, free); + if (__nkw > sizeof(__statbuf)) + { + __status = (unsigned char*)malloc(__nkw); + if (__status == 0) + __throw_bad_alloc(); + __stat_hold.reset(__status); + } + size_t __n_might_match = __nkw; // At this point, any keyword might match + size_t __n_does_match = 0; // but none of them definitely do + // Initialize all statuses to __might_match, except for "" keywords are __does_match + unsigned char* __st = __status; + for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) + { + if (!__ky->empty()) + *__st = __might_match; + else + { + *__st = __does_match; + --__n_might_match; + ++__n_does_match; + } + } + // While there might be a match, test keywords against the next CharT + for (size_t __indx = 0; __b != __e && __n_might_match > 0; ++__indx) + { + // Peek at the next CharT but don't consume it + _CharT __c = *__b; + if (!__case_sensitive) + __c = __ct.toupper(__c); + bool __consume = false; + // For each keyword which might match, see if the __indx character is __c + // If a match if found, consume __c + // If a match is found, and that is the last character in the keyword, + // then that keyword matches. + // If the keyword doesn't match this character, then change the keyword + // to doesn't match + __st = __status; + for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) + { + if (*__st == __might_match) + { + _CharT __kc = (*__ky)[__indx]; + if (!__case_sensitive) + __kc = __ct.toupper(__kc); + if (__c == __kc) + { + __consume = true; + if (__ky->size() == __indx+1) + { + *__st = __does_match; + --__n_might_match; + ++__n_does_match; + } + } + else + { + *__st = __doesnt_match; + --__n_might_match; + } + } + } + // consume if we matched a character + if (__consume) + { + ++__b; + // If we consumed a character and there might be a matched keyword that + // was marked matched on a previous iteration, then such keywords + // which are now marked as not matching. + if (__n_might_match + __n_does_match > 1) + { + __st = __status; + for (_ForwardIterator __ky = __kb; __ky != __ke; ++__ky, ++__st) + { + if (*__st == __does_match && __ky->size() != __indx+1) + { + *__st = __doesnt_match; + --__n_does_match; + } + } + } + } + } + // We've exited the loop because we hit eof and/or we have no more "might matches". + if (__b == __e) + __err |= ios_base::eofbit; + // Return the first matching result + for (__st = __status; __kb != __ke; ++__kb, ++__st) + if (*__st == __does_match) + break; + if (__kb == __ke) + __err |= ios_base::failbit; + return __kb; +} + +struct __num_get_base +{ + static const int __num_get_buf_sz = 40; + + static int __get_base(ios_base&); + static const char __src[33]; +}; + +void __check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end, + ios_base::iostate& __err); + +template <class _CharT> +struct __num_get + : protected __num_get_base +{ + static string __stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep); + static string __stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point, + _CharT& __thousands_sep); + static int __stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end, + unsigned& __dc, _CharT __thousands_sep, const string& __grouping, + unsigned* __g, unsigned*& __g_end, _CharT* __atoms); + static int __stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp, + char* __a, char*& __a_end, + _CharT __decimal_point, _CharT __thousands_sep, + const string& __grouping, unsigned* __g, + unsigned*& __g_end, unsigned& __dc, _CharT* __atoms); +}; + +template <class _CharT> +string +__num_get<_CharT>::__stage2_int_prep(ios_base& __iob, _CharT* __atoms, _CharT& __thousands_sep) +{ + locale __loc = __iob.getloc(); + use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 26, __atoms); + const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc); + __thousands_sep = __np.thousands_sep(); + return __np.grouping(); +} + +template <class _CharT> +string +__num_get<_CharT>::__stage2_float_prep(ios_base& __iob, _CharT* __atoms, _CharT& __decimal_point, + _CharT& __thousands_sep) +{ + locale __loc = __iob.getloc(); + use_facet<ctype<_CharT> >(__loc).widen(__src, __src + 32, __atoms); + const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc); + __decimal_point = __np.decimal_point(); + __thousands_sep = __np.thousands_sep(); + return __np.grouping(); +} + +template <class _CharT> +int +__num_get<_CharT>::__stage2_int_loop(_CharT __ct, int __base, char* __a, char*& __a_end, + unsigned& __dc, _CharT __thousands_sep, const string& __grouping, + unsigned* __g, unsigned*& __g_end, _CharT* __atoms) +{ + if (__a_end == __a && (__ct == __atoms[24] || __ct == __atoms[25])) + { + *__a_end++ = __ct == __atoms[24] ? '+' : '-'; + __dc = 0; + return 0; + } + if (__grouping.size() != 0 && __ct == __thousands_sep) + { + if (__g_end-__g < __num_get_buf_sz) + { + *__g_end++ = __dc; + __dc = 0; + } + return 0; + } + ptrdiff_t __f = find(__atoms, __atoms + 26, __ct) - __atoms; + if (__f >= 24) + return -1; + switch (__base) + { + case 8: + case 10: + if (__f >= __base) + return -1; + break; + case 16: + if (__f < 22) + break; + if (__a_end != __a && __a_end - __a <= 2 && __a_end[-1] == '0') + { + __dc = 0; + *__a_end++ = __src[__f]; + return 0; + } + return -1; + } + if (__a_end-__a < __num_get_buf_sz - 1) + *__a_end++ = __src[__f]; + ++__dc; + return 0; +} + +template <class _CharT> +int +__num_get<_CharT>::__stage2_float_loop(_CharT __ct, bool& __in_units, char& __exp, char* __a, char*& __a_end, + _CharT __decimal_point, _CharT __thousands_sep, const string& __grouping, + unsigned* __g, unsigned*& __g_end, unsigned& __dc, _CharT* __atoms) +{ + if (__ct == __decimal_point) + { + if (!__in_units) + return -1; + __in_units = false; + *__a_end++ = '.'; + if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz) + *__g_end++ = __dc; + return 0; + } + if (__ct == __thousands_sep && __grouping.size() != 0) + { + if (!__in_units) + return -1; + if (__g_end-__g < __num_get_buf_sz) + { + *__g_end++ = __dc; + __dc = 0; + } + return 0; + } + ptrdiff_t __f = find(__atoms, __atoms + 32, __ct) - __atoms; + if (__f >= 32) + return -1; + char __x = __src[__f]; + if (__x == '-' || __x == '+') + { + if (__a_end == __a || (__a_end[-1] & 0xDF) == __exp) + { + *__a_end++ = __x; + return 0; + } + return -1; + } + if (__a_end-__a < __num_get_buf_sz - 1) + *__a_end++ = __x; + if (__x == 'x' || __x == 'X') + __exp = 'P'; + else if ((__x & 0xDF) == __exp) + { + __in_units = false; + if (__grouping.size() != 0 && __g_end-__g < __num_get_buf_sz) + *__g_end++ = __dc; + } + if (__f >= 22) + return 0; + ++__dc; + return 0; +} + +extern template struct __num_get<char>; +extern template struct __num_get<wchar_t>; + +template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE num_get + : public locale::facet, + private __num_get<_CharT> +{ +public: + typedef _CharT char_type; + typedef _InputIterator iter_type; + + _LIBCPP_ALWAYS_INLINE + explicit num_get(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, bool& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long long& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned short& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned int& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned long& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned long long& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, float& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, double& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long double& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, void*& __v) const + { + return do_get(__b, __e, __iob, __err, __v); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~num_get() {} + + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, bool& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long long& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned short& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned int& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned long& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, unsigned long long& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, float& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, double& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, long double& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, void*& __v) const; +}; + +template <class _CharT, class _InputIterator> +locale::id +num_get<_CharT, _InputIterator>::id; + +template <class _Tp> +_Tp +__num_get_signed_integral(const char* __a, const char* __a_end, + ios_base::iostate& __err, int __base) +{ + if (__a != __a_end) + { + int __save_errno = errno; + errno = 0; + char *__p2; + long long __ll = strtoll_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); + int __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; + if (__p2 != __a_end) + { + __err = ios_base::failbit; + return 0; + } + else if (__current_errno == ERANGE || + __ll < numeric_limits<_Tp>::min() || + numeric_limits<_Tp>::max() < __ll) + { + __err = ios_base::failbit; + if (__ll > 0) + return numeric_limits<_Tp>::max(); + else + return numeric_limits<_Tp>::min(); + } + return static_cast<_Tp>(__ll); + } + __err = ios_base::failbit; + return 0; +} + +template <class _Tp> +_Tp +__num_get_unsigned_integral(const char* __a, const char* __a_end, + ios_base::iostate& __err, int __base) +{ + if (__a != __a_end) + { + if (*__a == '-') + { + __err = ios_base::failbit; + return 0; + } + int __save_errno = errno; + errno = 0; + char *__p2; + unsigned long long __ll = strtoull_l(__a, &__p2, __base, _LIBCPP_GET_C_LOCALE); + int __current_errno = errno; + if (__current_errno == 0) + errno = __save_errno; + if (__p2 != __a_end) + { + __err = ios_base::failbit; + return 0; + } + else if (__current_errno == ERANGE || + numeric_limits<_Tp>::max() < __ll) + { + __err = ios_base::failbit; + return numeric_limits<_Tp>::max(); + } + return static_cast<_Tp>(__ll); + } + __err = ios_base::failbit; + return 0; +} + +template <class _Tp> +_Tp +__num_get_float(const char* __a, const char* __a_end, ios_base::iostate& __err) +{ + if (__a != __a_end) + { + char *__p2; + long double __ld = strtold_l(__a, &__p2, _LIBCPP_GET_C_LOCALE); + if (__p2 != __a_end) + { + __err = ios_base::failbit; + return 0; + } + return static_cast<_Tp>(__ld); + } + __err = ios_base::failbit; + return 0; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + bool& __v) const +{ + if ((__iob.flags() & ios_base::boolalpha) == 0) + { + long __lv = -1; + __b = do_get(__b, __e, __iob, __err, __lv); + switch (__lv) + { + case 0: + __v = false; + break; + case 1: + __v = true; + break; + default: + __v = true; + __err = ios_base::failbit; + break; + } + return __b; + } + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__iob.getloc()); + const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__iob.getloc()); + typedef typename numpunct<_CharT>::string_type string_type; + const string_type __names[2] = {__np.truename(), __np.falsename()}; + const string_type* __i = __scan_keyword(__b, __e, __names, __names+2, + __ct, __err); + __v = __i == __names; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + long& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_signed_integral<long>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + long long& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_signed_integral<long long>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + unsigned short& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_unsigned_integral<unsigned short>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + unsigned int& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_unsigned_integral<unsigned int>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + unsigned long& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_unsigned_integral<unsigned long>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + unsigned long long& __v) const +{ + // Stage 1 + int __base = this->__get_base(__iob); + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep; + string __grouping = this->__stage2_int_prep(__iob, __atoms, __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, __g, __g_end, + __atoms)) + break; + if (__grouping.size() != 0 && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_unsigned_integral<unsigned long long>(__a, __a_end, __err, __base); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + float& __v) const +{ + // Stage 1, nothing to do + // Stage 2 + char_type __atoms[32]; + char_type __decimal_point; + char_type __thousands_sep; + string __grouping = this->__stage2_float_prep(__iob, __atoms, + __decimal_point, + __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + bool __in_units = true; + char __exp = 'E'; + for (; __b != __e; ++__b) + if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, + __decimal_point, __thousands_sep, + __grouping, __g, __g_end, + __dc, __atoms)) + break; + if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_float<float>(__a, __a_end, __err); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + double& __v) const +{ + // Stage 1, nothing to do + // Stage 2 + char_type __atoms[32]; + char_type __decimal_point; + char_type __thousands_sep; + string __grouping = this->__stage2_float_prep(__iob, __atoms, + __decimal_point, + __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + bool __in_units = true; + char __exp = 'E'; + for (; __b != __e; ++__b) + if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, + __decimal_point, __thousands_sep, + __grouping, __g, __g_end, + __dc, __atoms)) + break; + if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_float<double>(__a, __a_end, __err); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + long double& __v) const +{ + // Stage 1, nothing to do + // Stage 2 + char_type __atoms[32]; + char_type __decimal_point; + char_type __thousands_sep; + string __grouping = this->__stage2_float_prep(__iob, __atoms, + __decimal_point, + __thousands_sep); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + bool __in_units = true; + char __exp = 'E'; + for (; __b != __e; ++__b) + if (this->__stage2_float_loop(*__b, __in_units, __exp, __a, __a_end, + __decimal_point, __thousands_sep, + __grouping, __g, __g_end, + __dc, __atoms)) + break; + if (__grouping.size() != 0 && __in_units && __g_end-__g < __num_get_base::__num_get_buf_sz) + *__g_end++ = __dc; + // Stage 3 + __v = __num_get_float<long double>(__a, __a_end, __err); + // Digit grouping checked + __check_grouping(__grouping, __g, __g_end, __err); + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + void*& __v) const +{ + // Stage 1 + int __base = 16; + // Stage 2 + char_type __atoms[26]; + char_type __thousands_sep = 0; + string __grouping; + use_facet<ctype<_CharT> >(__iob.getloc()).widen(__num_get_base::__src, + __num_get_base::__src + 26, __atoms); + char __a[__num_get_base::__num_get_buf_sz] = {0}; + char* __a_end = __a; + unsigned __g[__num_get_base::__num_get_buf_sz]; + unsigned* __g_end = __g; + unsigned __dc = 0; + for (; __b != __e; ++__b) + if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc, + __thousands_sep, __grouping, + __g, __g_end, __atoms)) + break; + // Stage 3 + __a[sizeof(__a)-1] = 0; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + if (sscanf_l(__a, _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1) +#else + if (__sscanf_l(__a, __cloc(), "%p", &__v) != 1) +#endif + __err = ios_base::failbit; + // EOF checked + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +extern template class num_get<char>; +extern template class num_get<wchar_t>; + +struct __num_put_base +{ +protected: + static void __format_int(char* __fmt, const char* __len, bool __signd, + ios_base::fmtflags __flags); + static bool __format_float(char* __fmt, const char* __len, + ios_base::fmtflags __flags); + static char* __identify_padding(char* __nb, char* __ne, + const ios_base& __iob); +}; + +template <class _CharT> +struct __num_put + : protected __num_put_base +{ + static void __widen_and_group_int(char* __nb, char* __np, char* __ne, + _CharT* __ob, _CharT*& __op, _CharT*& __oe, + const locale& __loc); + static void __widen_and_group_float(char* __nb, char* __np, char* __ne, + _CharT* __ob, _CharT*& __op, _CharT*& __oe, + const locale& __loc); +}; + +template <class _CharT> +void +__num_put<_CharT>::__widen_and_group_int(char* __nb, char* __np, char* __ne, + _CharT* __ob, _CharT*& __op, _CharT*& __oe, + const locale& __loc) +{ + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc); + const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc); + string __grouping = __npt.grouping(); + if (__grouping.empty()) + { + __ct.widen(__nb, __ne, __ob); + __oe = __ob + (__ne - __nb); + } + else + { + __oe = __ob; + char* __nf = __nb; + if (*__nf == '-' || *__nf == '+') + *__oe++ = __ct.widen(*__nf++); + if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' || + __nf[1] == 'X')) + { + *__oe++ = __ct.widen(*__nf++); + *__oe++ = __ct.widen(*__nf++); + } + reverse(__nf, __ne); + _CharT __thousands_sep = __npt.thousands_sep(); + unsigned __dc = 0; + unsigned __dg = 0; + for (char* __p = __nf; __p < __ne; ++__p) + { + if (static_cast<unsigned>(__grouping[__dg]) > 0 && + __dc == static_cast<unsigned>(__grouping[__dg])) + { + *__oe++ = __thousands_sep; + __dc = 0; + if (__dg < __grouping.size()-1) + ++__dg; + } + *__oe++ = __ct.widen(*__p); + ++__dc; + } + reverse(__ob + (__nf - __nb), __oe); + } + if (__np == __ne) + __op = __oe; + else + __op = __ob + (__np - __nb); +} + +template <class _CharT> +void +__num_put<_CharT>::__widen_and_group_float(char* __nb, char* __np, char* __ne, + _CharT* __ob, _CharT*& __op, _CharT*& __oe, + const locale& __loc) +{ + const ctype<_CharT>& __ct = use_facet<ctype<_CharT> > (__loc); + const numpunct<_CharT>& __npt = use_facet<numpunct<_CharT> >(__loc); + string __grouping = __npt.grouping(); + __oe = __ob; + char* __nf = __nb; + if (*__nf == '-' || *__nf == '+') + *__oe++ = __ct.widen(*__nf++); + char* __ns; + if (__ne - __nf >= 2 && __nf[0] == '0' && (__nf[1] == 'x' || + __nf[1] == 'X')) + { + *__oe++ = __ct.widen(*__nf++); + *__oe++ = __ct.widen(*__nf++); + for (__ns = __nf; __ns < __ne; ++__ns) + if (!isxdigit_l(*__ns, _LIBCPP_GET_C_LOCALE)) + break; + } + else + { + for (__ns = __nf; __ns < __ne; ++__ns) + if (!isdigit_l(*__ns, _LIBCPP_GET_C_LOCALE)) + break; + } + if (__grouping.empty()) + { + __ct.widen(__nf, __ns, __oe); + __oe += __ns - __nf; + } + else + { + reverse(__nf, __ns); + _CharT __thousands_sep = __npt.thousands_sep(); + unsigned __dc = 0; + unsigned __dg = 0; + for (char* __p = __nf; __p < __ns; ++__p) + { + if (__grouping[__dg] > 0 && __dc == static_cast<unsigned>(__grouping[__dg])) + { + *__oe++ = __thousands_sep; + __dc = 0; + if (__dg < __grouping.size()-1) + ++__dg; + } + *__oe++ = __ct.widen(*__p); + ++__dc; + } + reverse(__ob + (__nf - __nb), __oe); + } + for (__nf = __ns; __nf < __ne; ++__nf) + { + if (*__nf == '.') + { + *__oe++ = __npt.decimal_point(); + ++__nf; + break; + } + else + *__oe++ = __ct.widen(*__nf); + } + __ct.widen(__nf, __ne, __oe); + __oe += __ne - __nf; + if (__np == __ne) + __op = __oe; + else + __op = __ob + (__np - __nb); +} + +extern template struct __num_put<char>; +extern template struct __num_put<wchar_t>; + +template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE num_put + : public locale::facet, + private __num_put<_CharT> +{ +public: + typedef _CharT char_type; + typedef _OutputIterator iter_type; + + _LIBCPP_ALWAYS_INLINE + explicit num_put(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + bool __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + long __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + long long __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + unsigned long __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + unsigned long long __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + double __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + long double __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + const void* __v) const + { + return do_put(__s, __iob, __fl, __v); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~num_put() {} + + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + bool __v) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + long __v) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + long long __v) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + unsigned long) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + unsigned long long) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + double __v) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + long double __v) const; + virtual iter_type do_put(iter_type __s, ios_base& __iob, char_type __fl, + const void* __v) const; +}; + +template <class _CharT, class _OutputIterator> +locale::id +num_put<_CharT, _OutputIterator>::id; + +template <class _CharT, class _OutputIterator> +_LIBCPP_HIDDEN +_OutputIterator +__pad_and_output(_OutputIterator __s, + const _CharT* __ob, const _CharT* __op, const _CharT* __oe, + ios_base& __iob, _CharT __fl) +{ + streamsize __sz = __oe - __ob; + streamsize __ns = __iob.width(); + if (__ns > __sz) + __ns -= __sz; + else + __ns = 0; + for (;__ob < __op; ++__ob, ++__s) + *__s = *__ob; + for (; __ns; --__ns, ++__s) + *__s = __fl; + for (; __ob < __oe; ++__ob, ++__s) + *__s = *__ob; + __iob.width(0); + return __s; +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, bool __v) const +{ + if ((__iob.flags() & ios_base::boolalpha) == 0) + return do_put(__s, __iob, __fl, (unsigned long)__v); + const numpunct<char_type>& __np = use_facet<numpunct<char_type> >(__iob.getloc()); + typedef typename numpunct<char_type>::string_type string_type; + string_type __nm = __v ? __np.truename() : __np.falsename(); + for (typename string_type::iterator __i = __nm.begin(); __i != __nm.end(); ++__i, ++__s) + *__s = *__i; + return __s; +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, long __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[6] = {'%', 0}; + const char* __len = "l"; + this->__format_int(__fmt+1, __len, true, __iob.flags()); + const unsigned __nbuf = (numeric_limits<long>::digits / 3) + + ((numeric_limits<long>::digits % 3) != 0) + + 1; + char __nar[__nbuf]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif + char* __ne = __nar + __nc; + char* __np = this->__identify_padding(__nar, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, long long __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[8] = {'%', 0}; + const char* __len = "ll"; + this->__format_int(__fmt+1, __len, true, __iob.flags()); + const unsigned __nbuf = (numeric_limits<long long>::digits / 3) + + ((numeric_limits<long long>::digits % 3) != 0) + + 1; + char __nar[__nbuf]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif + char* __ne = __nar + __nc; + char* __np = this->__identify_padding(__nar, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, unsigned long __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[6] = {'%', 0}; + const char* __len = "l"; + this->__format_int(__fmt+1, __len, false, __iob.flags()); + const unsigned __nbuf = (numeric_limits<unsigned long>::digits / 3) + + ((numeric_limits<unsigned long>::digits % 3) != 0) + + 1; + char __nar[__nbuf]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif + char* __ne = __nar + __nc; + char* __np = this->__identify_padding(__nar, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, unsigned long long __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[8] = {'%', 0}; + const char* __len = "ll"; + this->__format_int(__fmt+1, __len, false, __iob.flags()); + const unsigned __nbuf = (numeric_limits<unsigned long long>::digits / 3) + + ((numeric_limits<unsigned long long>::digits % 3) != 0) + + 1; + char __nar[__nbuf]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif + char* __ne = __nar + __nc; + char* __np = this->__identify_padding(__nar, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_int(__nar, __np, __ne, __o, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, double __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[8] = {'%', 0}; + const char* __len = ""; + bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags()); + const unsigned __nbuf = 30; + char __nar[__nbuf]; + char* __nb = __nar; + int __nc; + if (__specify_precision) +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, + (int)__iob.precision(), __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif + else +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); +#endif + unique_ptr<char, void(*)(void*)> __nbh(0, free); + if (__nc > static_cast<int>(__nbuf-1)) + { + if (__specify_precision) +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif + else +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision(), __v); +#endif + if (__nb == 0) + __throw_bad_alloc(); + __nbh.reset(__nb); + } + char* __ne = __nb + __nc; + char* __np = this->__identify_padding(__nb, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __ob = __o; + unique_ptr<char_type, void(*)(void*)> __obh(0, free); + if (__nb != __nar) + { + __ob = (char_type*)malloc(2*static_cast<size_t>(__nc)*sizeof(char_type)); + if (__ob == 0) + __throw_bad_alloc(); + __obh.reset(__ob); + } + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl); + return __s; +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, long double __v) const +{ + // Stage 1 - Get number in narrow char + char __fmt[8] = {'%', 0}; + const char* __len = "L"; + bool __specify_precision = this->__format_float(__fmt+1, __len, __iob.flags()); + const unsigned __nbuf = 30; + char __nar[__nbuf]; + char* __nb = __nar; + int __nc; + if (__specify_precision) +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, + (int)__iob.precision(), __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif + else +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = snprintf_l(__nb, __nbuf, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); +#endif + unique_ptr<char, void(*)(void*)> __nbh(0, free); + if (__nc > static_cast<int>(__nbuf-1)) + { + if (__specify_precision) +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, (int)__iob.precision(), __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif + else +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __nc = asprintf_l(&__nb, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, __v); +#endif + if (__nb == 0) + __throw_bad_alloc(); + __nbh.reset(__nb); + } + char* __ne = __nb + __nc; + char* __np = this->__identify_padding(__nb, __ne, __iob); + // Stage 2 - Widen __nar while adding thousands separators + char_type __o[2*(__nbuf-1) - 1]; + char_type* __ob = __o; + unique_ptr<char_type, void(*)(void*)> __obh(0, free); + if (__nb != __nar) + { + __ob = (char_type*)malloc(2*static_cast<size_t>(__nc)*sizeof(char_type)); + if (__ob == 0) + __throw_bad_alloc(); + __obh.reset(__ob); + } + char_type* __op; // pad here + char_type* __oe; // end of output + this->__widen_and_group_float(__nb, __np, __ne, __ob, __op, __oe, __iob.getloc()); + // [__o, __oe) contains thousands_sep'd wide number + // Stage 3 & 4 + __s = __pad_and_output(__s, __ob, __op, __oe, __iob, __fl); + return __s; +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, + char_type __fl, const void* __v) const +{ + // Stage 1 - Get pointer in narrow char + char __fmt[6] = "%p"; + const unsigned __nbuf = 20; + char __nar[__nbuf]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __nc = sprintf_l(__nar, _LIBCPP_GET_C_LOCALE, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif + char* __ne = __nar + __nc; + char* __np = this->__identify_padding(__nar, __ne, __iob); + // Stage 2 - Widen __nar + char_type __o[2*(__nbuf-1) - 1]; + char_type* __op; // pad here + char_type* __oe; // end of output + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + __ct.widen(__nar, __ne, __o); + __oe = __o + (__ne - __nar); + if (__np == __ne) + __op = __oe; + else + __op = __o + (__np - __nar); + // [__o, __oe) contains wide number + // Stage 3 & 4 + return __pad_and_output(__s, __o, __op, __oe, __iob, __fl); +} + +extern template class num_put<char>; +extern template class num_put<wchar_t>; + +template <class _CharT, class _InputIterator> +_LIBCPP_HIDDEN +int +__get_up_to_n_digits(_InputIterator& __b, _InputIterator __e, + ios_base::iostate& __err, const ctype<_CharT>& __ct, int __n) +{ + // Precondition: __n >= 1 + if (__b == __e) + { + __err |= ios_base::eofbit | ios_base::failbit; + return 0; + } + // get first digit + _CharT __c = *__b; + if (!__ct.is(ctype_base::digit, __c)) + { + __err |= ios_base::failbit; + return 0; + } + int __r = __ct.narrow(__c, 0) - '0'; + for (++__b, --__n; __b != __e && __n > 0; ++__b, --__n) + { + // get next digit + __c = *__b; + if (!__ct.is(ctype_base::digit, __c)) + return __r; + __r = __r * 10 + __ct.narrow(__c, 0) - '0'; + } + if (__b == __e) + __err |= ios_base::eofbit; + return __r; +} + +class _LIBCPP_VISIBLE time_base +{ +public: + enum dateorder {no_order, dmy, mdy, ymd, ydm}; +}; + +template <class _CharT> +class __time_get_c_storage // purposefully not decorated +{ +protected: + typedef basic_string<_CharT> string_type; + + virtual const string_type* __weeks() const; + virtual const string_type* __months() const; + virtual const string_type* __am_pm() const; + virtual const string_type& __c() const; + virtual const string_type& __r() const; + virtual const string_type& __x() const; + virtual const string_type& __X() const; +}; + +template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE time_get + : public locale::facet, + public time_base, + private __time_get_c_storage<_CharT> +{ +public: + typedef _CharT char_type; + typedef _InputIterator iter_type; + typedef time_base::dateorder dateorder; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit time_get(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + dateorder date_order() const + { + return this->do_date_order(); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get_time(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const + { + return do_get_time(__b, __e, __iob, __err, __tm); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get_date(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const + { + return do_get_date(__b, __e, __iob, __err, __tm); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get_weekday(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const + { + return do_get_weekday(__b, __e, __iob, __err, __tm); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get_monthname(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const + { + return do_get_monthname(__b, __e, __iob, __err, __tm); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get_year(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const + { + return do_get_year(__b, __e, __iob, __err, __tm); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm *__tm, + char __fmt, char __mod = 0) const + { + return do_get(__b, __e, __iob, __err, __tm, __fmt, __mod); + } + + iter_type get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm, + const char_type* __fmtb, const char_type* __fmte) const; + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~time_get() {} + + virtual dateorder do_date_order() const; + virtual iter_type do_get_time(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const; + virtual iter_type do_get_date(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const; + virtual iter_type do_get_weekday(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const; + virtual iter_type do_get_monthname(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const; + virtual iter_type do_get_year(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm) const; + virtual iter_type do_get(iter_type __b, iter_type __e, ios_base& __iob, + ios_base::iostate& __err, tm* __tm, + char __fmt, char __mod) const; +private: + void __get_white_space(iter_type& __b, iter_type __e, + ios_base::iostate& __err, const ctype<char_type>& __ct) const; + void __get_percent(iter_type& __b, iter_type __e, ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + + void __get_weekdayname(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_monthname(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_day(int& __d, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_month(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_year(int& __y, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_year4(int& __y, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_hour(int& __d, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_12_hour(int& __h, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_am_pm(int& __h, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_minute(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_second(int& __s, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_weekday(int& __w, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; + void __get_day_year_num(int& __w, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const; +}; + +template <class _CharT, class _InputIterator> +locale::id +time_get<_CharT, _InputIterator>::id; + +// time_get primatives + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_weekdayname(int& __w, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + // Note: ignoring case comes from the POSIX strptime spec + const string_type* __wk = this->__weeks(); + ptrdiff_t __i = __scan_keyword(__b, __e, __wk, __wk+14, __ct, __err, false) - __wk; + if (__i < 14) + __w = __i % 7; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_monthname(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + // Note: ignoring case comes from the POSIX strptime spec + const string_type* __month = this->__months(); + ptrdiff_t __i = __scan_keyword(__b, __e, __month, __month+24, __ct, __err, false) - __month; + if (__i < 24) + __m = __i % 12; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_day(int& __d, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); + if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 31) + __d = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_month(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2) - 1; + if (!(__err & ios_base::failbit) && __t <= 11) + __m = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_year(int& __y, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4); + if (!(__err & ios_base::failbit)) + { + if (__t < 69) + __t += 2000; + else if (69 <= __t && __t <= 99) + __t += 1900; + __y = __t - 1900; + } +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_year4(int& __y, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 4); + if (!(__err & ios_base::failbit)) + __y = __t - 1900; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_hour(int& __h, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); + if (!(__err & ios_base::failbit) && __t <= 23) + __h = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_12_hour(int& __h, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); + if (!(__err & ios_base::failbit) && 1 <= __t && __t <= 12) + __h = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_minute(int& __m, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); + if (!(__err & ios_base::failbit) && __t <= 59) + __m = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_second(int& __s, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 2); + if (!(__err & ios_base::failbit) && __t <= 60) + __s = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_weekday(int& __w, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 1); + if (!(__err & ios_base::failbit) && __t <= 6) + __w = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_day_year_num(int& __d, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + int __t = __get_up_to_n_digits(__b, __e, __err, __ct, 3); + if (!(__err & ios_base::failbit) && __t <= 365) + __d = __t; + else + __err |= ios_base::failbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_white_space(iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + for (; __b != __e && __ct.is(ctype_base::space, *__b); ++__b) + ; + if (__b == __e) + __err |= ios_base::eofbit; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_am_pm(int& __h, + iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + const string_type* __ap = this->__am_pm(); + if (__ap[0].size() + __ap[1].size() == 0) + { + __err |= ios_base::failbit; + return; + } + ptrdiff_t __i = __scan_keyword(__b, __e, __ap, __ap+2, __ct, __err, false) - __ap; + if (__i == 0 && __h == 12) + __h = 0; + else if (__i == 1 && __h < 12) + __h += 12; +} + +template <class _CharT, class _InputIterator> +void +time_get<_CharT, _InputIterator>::__get_percent(iter_type& __b, iter_type __e, + ios_base::iostate& __err, + const ctype<char_type>& __ct) const +{ + if (__b == __e) + { + __err |= ios_base::eofbit | ios_base::failbit; + return; + } + if (__ct.narrow(*__b, 0) != '%') + __err |= ios_base::failbit; + else if(++__b == __e) + __err |= ios_base::eofbit; +} + +// time_get end primatives + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, tm* __tm, + const char_type* __fmtb, const char_type* __fmte) const +{ + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + __err = ios_base::goodbit; + while (__fmtb != __fmte && __err == ios_base::goodbit) + { + if (__b == __e) + { + __err = ios_base::failbit; + break; + } + if (__ct.narrow(*__fmtb, 0) == '%') + { + if (++__fmtb == __fmte) + { + __err = ios_base::failbit; + break; + } + char __cmd = __ct.narrow(*__fmtb, 0); + char __opt = '\0'; + if (__cmd == 'E' || __cmd == '0') + { + if (++__fmtb == __fmte) + { + __err = ios_base::failbit; + break; + } + __opt = __cmd; + __cmd = __ct.narrow(*__fmtb, 0); + } + __b = do_get(__b, __e, __iob, __err, __tm, __cmd, __opt); + ++__fmtb; + } + else if (__ct.is(ctype_base::space, *__fmtb)) + { + for (++__fmtb; __fmtb != __fmte && __ct.is(ctype_base::space, *__fmtb); ++__fmtb) + ; + for ( ; __b != __e && __ct.is(ctype_base::space, *__b); ++__b) + ; + } + else if (__ct.toupper(*__b) == __ct.toupper(*__fmtb)) + { + ++__b; + ++__fmtb; + } + else + __err = ios_base::failbit; + } + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +typename time_get<_CharT, _InputIterator>::dateorder +time_get<_CharT, _InputIterator>::do_date_order() const +{ + return mdy; +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get_time(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + tm* __tm) const +{ + const char_type __fmt[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'}; + return get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0])); +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get_date(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + tm* __tm) const +{ + const string_type& __fmt = this->__x(); + return get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size()); +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get_weekday(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + tm* __tm) const +{ + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct); + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get_monthname(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + tm* __tm) const +{ + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + __get_monthname(__tm->tm_mon, __b, __e, __err, __ct); + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get_year(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, + tm* __tm) const +{ + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + __get_year(__tm->tm_year, __b, __e, __err, __ct); + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +time_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + ios_base& __iob, + ios_base::iostate& __err, tm* __tm, + char __fmt, char) const +{ + __err = ios_base::goodbit; + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + switch (__fmt) + { + case 'a': + case 'A': + __get_weekdayname(__tm->tm_wday, __b, __e, __err, __ct); + break; + case 'b': + case 'B': + case 'h': + __get_monthname(__tm->tm_mon, __b, __e, __err, __ct); + break; + case 'c': + { + const string_type& __fm = this->__c(); + __b = get(__b, __e, __iob, __err, __tm, __fm.data(), __fm.data() + __fm.size()); + } + break; + case 'd': + case 'e': + __get_day(__tm->tm_mday, __b, __e, __err, __ct); + break; + case 'D': + { + const char_type __fm[] = {'%', 'm', '/', '%', 'd', '/', '%', 'y'}; + __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0])); + } + break; + case 'F': + { + const char_type __fm[] = {'%', 'Y', '-', '%', 'm', '-', '%', 'd'}; + __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0])); + } + break; + case 'H': + __get_hour(__tm->tm_hour, __b, __e, __err, __ct); + break; + case 'I': + __get_12_hour(__tm->tm_hour, __b, __e, __err, __ct); + break; + case 'j': + __get_day_year_num(__tm->tm_yday, __b, __e, __err, __ct); + break; + case 'm': + __get_month(__tm->tm_mon, __b, __e, __err, __ct); + break; + case 'M': + __get_minute(__tm->tm_min, __b, __e, __err, __ct); + break; + case 'n': + case 't': + __get_white_space(__b, __e, __err, __ct); + break; + case 'p': + __get_am_pm(__tm->tm_hour, __b, __e, __err, __ct); + break; + case 'r': + { + const char_type __fm[] = {'%', 'I', ':', '%', 'M', ':', '%', 'S', ' ', '%', 'p'}; + __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0])); + } + break; + case 'R': + { + const char_type __fm[] = {'%', 'H', ':', '%', 'M'}; + __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0])); + } + break; + case 'S': + __get_second(__tm->tm_sec, __b, __e, __err, __ct); + break; + case 'T': + { + const char_type __fm[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'}; + __b = get(__b, __e, __iob, __err, __tm, __fm, __fm + sizeof(__fm)/sizeof(__fm[0])); + } + break; + case 'w': + __get_weekday(__tm->tm_wday, __b, __e, __err, __ct); + break; + case 'x': + return do_get_date(__b, __e, __iob, __err, __tm); + case 'X': + { + const string_type& __fm = this->__X(); + __b = get(__b, __e, __iob, __err, __tm, __fm.data(), __fm.data() + __fm.size()); + } + break; + case 'y': + __get_year(__tm->tm_year, __b, __e, __err, __ct); + break; + case 'Y': + __get_year4(__tm->tm_year, __b, __e, __err, __ct); + break; + case '%': + __get_percent(__b, __e, __err, __ct); + break; + default: + __err |= ios_base::failbit; + } + return __b; +} + +extern template class time_get<char>; +extern template class time_get<wchar_t>; + +class __time_get +{ +protected: + locale_t __loc_; + + __time_get(const char* __nm); + __time_get(const string& __nm); + ~__time_get(); +}; + +template <class _CharT> +class __time_get_storage + : public __time_get +{ +protected: + typedef basic_string<_CharT> string_type; + + string_type __weeks_[14]; + string_type __months_[24]; + string_type __am_pm_[2]; + string_type __c_; + string_type __r_; + string_type __x_; + string_type __X_; + + explicit __time_get_storage(const char* __nm); + explicit __time_get_storage(const string& __nm); + + _LIBCPP_ALWAYS_INLINE ~__time_get_storage() {} + + time_base::dateorder __do_date_order() const; + +private: + void init(const ctype<_CharT>&); + string_type __analyze(char __fmt, const ctype<_CharT>&); +}; + +template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE time_get_byname + : public time_get<_CharT, _InputIterator>, + private __time_get_storage<_CharT> +{ +public: + typedef time_base::dateorder dateorder; + typedef _InputIterator iter_type; + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_INLINE_VISIBILITY + explicit time_get_byname(const char* __nm, size_t __refs = 0) + : time_get<_CharT, _InputIterator>(__refs), + __time_get_storage<_CharT>(__nm) {} + _LIBCPP_INLINE_VISIBILITY + explicit time_get_byname(const string& __nm, size_t __refs = 0) + : time_get<_CharT, _InputIterator>(__refs), + __time_get_storage<_CharT>(__nm) {} + +protected: + _LIBCPP_INLINE_VISIBILITY + ~time_get_byname() {} + + _LIBCPP_INLINE_VISIBILITY + virtual dateorder do_date_order() const {return this->__do_date_order();} +private: + _LIBCPP_INLINE_VISIBILITY + virtual const string_type* __weeks() const {return this->__weeks_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type* __months() const {return this->__months_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type* __am_pm() const {return this->__am_pm_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type& __c() const {return this->__c_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type& __r() const {return this->__r_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type& __x() const {return this->__x_;} + _LIBCPP_INLINE_VISIBILITY + virtual const string_type& __X() const {return this->__X_;} +}; + +extern template class time_get_byname<char>; +extern template class time_get_byname<wchar_t>; + +class __time_put +{ + locale_t __loc_; +protected: + _LIBCPP_ALWAYS_INLINE __time_put() : __loc_(_LIBCPP_GET_C_LOCALE) {} + __time_put(const char* __nm); + __time_put(const string& __nm); + ~__time_put(); + void __do_put(char* __nb, char*& __ne, const tm* __tm, + char __fmt, char __mod) const; + void __do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm, + char __fmt, char __mod) const; +}; + +template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE time_put + : public locale::facet, + private __time_put +{ +public: + typedef _CharT char_type; + typedef _OutputIterator iter_type; + + _LIBCPP_ALWAYS_INLINE + explicit time_put(size_t __refs = 0) + : locale::facet(__refs) {} + + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, const tm* __tm, + const char_type* __pb, const char_type* __pe) const; + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, ios_base& __iob, char_type __fl, + const tm* __tm, char __fmt, char __mod = 0) const + { + return do_put(__s, __iob, __fl, __tm, __fmt, __mod); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~time_put() {} + virtual iter_type do_put(iter_type __s, ios_base&, char_type, const tm* __tm, + char __fmt, char __mod) const; + + _LIBCPP_ALWAYS_INLINE + explicit time_put(const char* __nm, size_t __refs) + : locale::facet(__refs), + __time_put(__nm) {} + _LIBCPP_ALWAYS_INLINE + explicit time_put(const string& __nm, size_t __refs) + : locale::facet(__refs), + __time_put(__nm) {} +}; + +template <class _CharT, class _OutputIterator> +locale::id +time_put<_CharT, _OutputIterator>::id; + +template <class _CharT, class _OutputIterator> +_OutputIterator +time_put<_CharT, _OutputIterator>::put(iter_type __s, ios_base& __iob, + char_type __fl, const tm* __tm, + const char_type* __pb, + const char_type* __pe) const +{ + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc()); + for (; __pb != __pe; ++__pb) + { + if (__ct.narrow(*__pb, 0) == '%') + { + if (++__pb == __pe) + { + *__s++ = __pb[-1]; + break; + } + char __mod = 0; + char __fmt = __ct.narrow(*__pb, 0); + if (__fmt == 'E' || __fmt == 'O') + { + if (++__pb == __pe) + { + *__s++ = __pb[-2]; + *__s++ = __pb[-1]; + break; + } + __mod = __fmt; + __fmt = __ct.narrow(*__pb, 0); + } + __s = do_put(__s, __iob, __fl, __tm, __fmt, __mod); + } + else + *__s++ = *__pb; + } + return __s; +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +time_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base&, + char_type, const tm* __tm, + char __fmt, char __mod) const +{ + char_type __nar[100]; + char_type* __nb = __nar; + char_type* __ne = __nb + 100; + __do_put(__nb, __ne, __tm, __fmt, __mod); + return _VSTD::copy(__nb, __ne, __s); +} + +extern template class time_put<char>; +extern template class time_put<wchar_t>; + +template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE time_put_byname + : public time_put<_CharT, _OutputIterator> +{ +public: + _LIBCPP_ALWAYS_INLINE + explicit time_put_byname(const char* __nm, size_t __refs = 0) + : time_put<_CharT, _OutputIterator>(__nm, __refs) {} + + _LIBCPP_ALWAYS_INLINE + explicit time_put_byname(const string& __nm, size_t __refs = 0) + : time_put<_CharT, _OutputIterator>(__nm, __refs) {} + +protected: + _LIBCPP_ALWAYS_INLINE + ~time_put_byname() {} +}; + +extern template class time_put_byname<char>; +extern template class time_put_byname<wchar_t>; + +// money_base + +class _LIBCPP_VISIBLE money_base +{ +public: + enum part {none, space, symbol, sign, value}; + struct pattern {char field[4];}; + + _LIBCPP_ALWAYS_INLINE money_base() {} +}; + +// moneypunct + +template <class _CharT, bool _International = false> +class _LIBCPP_VISIBLE moneypunct + : public locale::facet, + public money_base +{ +public: + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit moneypunct(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();} + _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();} + _LIBCPP_ALWAYS_INLINE string grouping() const {return do_grouping();} + _LIBCPP_ALWAYS_INLINE string_type curr_symbol() const {return do_curr_symbol();} + _LIBCPP_ALWAYS_INLINE string_type positive_sign() const {return do_positive_sign();} + _LIBCPP_ALWAYS_INLINE string_type negative_sign() const {return do_negative_sign();} + _LIBCPP_ALWAYS_INLINE int frac_digits() const {return do_frac_digits();} + _LIBCPP_ALWAYS_INLINE pattern pos_format() const {return do_pos_format();} + _LIBCPP_ALWAYS_INLINE pattern neg_format() const {return do_neg_format();} + + static locale::id id; + static const bool intl = _International; + +protected: + _LIBCPP_ALWAYS_INLINE + ~moneypunct() {} + + virtual char_type do_decimal_point() const {return numeric_limits<char_type>::max();} + virtual char_type do_thousands_sep() const {return numeric_limits<char_type>::max();} + virtual string do_grouping() const {return string();} + virtual string_type do_curr_symbol() const {return string_type();} + virtual string_type do_positive_sign() const {return string_type();} + virtual string_type do_negative_sign() const {return string_type(1, '-');} + virtual int do_frac_digits() const {return 0;} + virtual pattern do_pos_format() const + {pattern __p = {symbol, sign, none, value}; return __p;} + virtual pattern do_neg_format() const + {pattern __p = {symbol, sign, none, value}; return __p;} +}; + +template <class _CharT, bool _International> +locale::id +moneypunct<_CharT, _International>::id; + +extern template class moneypunct<char, false>; +extern template class moneypunct<char, true>; +extern template class moneypunct<wchar_t, false>; +extern template class moneypunct<wchar_t, true>; + +// moneypunct_byname + +template <class _CharT, bool _International = false> +class _LIBCPP_VISIBLE moneypunct_byname + : public moneypunct<_CharT, _International> +{ +public: + typedef money_base::pattern pattern; + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit moneypunct_byname(const char* __nm, size_t __refs = 0) + : moneypunct<_CharT, _International>(__refs) {init(__nm);} + + _LIBCPP_ALWAYS_INLINE + explicit moneypunct_byname(const string& __nm, size_t __refs = 0) + : moneypunct<_CharT, _International>(__refs) {init(__nm.c_str());} + +protected: + _LIBCPP_ALWAYS_INLINE + ~moneypunct_byname() {} + + virtual char_type do_decimal_point() const {return __decimal_point_;} + virtual char_type do_thousands_sep() const {return __thousands_sep_;} + virtual string do_grouping() const {return __grouping_;} + virtual string_type do_curr_symbol() const {return __curr_symbol_;} + virtual string_type do_positive_sign() const {return __positive_sign_;} + virtual string_type do_negative_sign() const {return __negative_sign_;} + virtual int do_frac_digits() const {return __frac_digits_;} + virtual pattern do_pos_format() const {return __pos_format_;} + virtual pattern do_neg_format() const {return __neg_format_;} + +private: + char_type __decimal_point_; + char_type __thousands_sep_; + string __grouping_; + string_type __curr_symbol_; + string_type __positive_sign_; + string_type __negative_sign_; + int __frac_digits_; + pattern __pos_format_; + pattern __neg_format_; + + void init(const char*); +}; + +template<> void moneypunct_byname<char, false>::init(const char*); +template<> void moneypunct_byname<char, true>::init(const char*); +template<> void moneypunct_byname<wchar_t, false>::init(const char*); +template<> void moneypunct_byname<wchar_t, true>::init(const char*); + +extern template class moneypunct_byname<char, false>; +extern template class moneypunct_byname<char, true>; +extern template class moneypunct_byname<wchar_t, false>; +extern template class moneypunct_byname<wchar_t, true>; + +// money_get + +template <class _CharT> +class __money_get +{ +protected: + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE __money_get() {} + + static void __gather_info(bool __intl, const locale& __loc, + money_base::pattern& __pat, char_type& __dp, + char_type& __ts, string& __grp, + string_type& __sym, string_type& __psn, + string_type& __nsn, int& __fd); +}; + +template <class _CharT> +void +__money_get<_CharT>::__gather_info(bool __intl, const locale& __loc, + money_base::pattern& __pat, char_type& __dp, + char_type& __ts, string& __grp, + string_type& __sym, string_type& __psn, + string_type& __nsn, int& __fd) +{ + if (__intl) + { + const moneypunct<char_type, true>& __mp = + use_facet<moneypunct<char_type, true> >(__loc); + __pat = __mp.neg_format(); + __nsn = __mp.negative_sign(); + __psn = __mp.positive_sign(); + __dp = __mp.decimal_point(); + __ts = __mp.thousands_sep(); + __grp = __mp.grouping(); + __sym = __mp.curr_symbol(); + __fd = __mp.frac_digits(); + } + else + { + const moneypunct<char_type, false>& __mp = + use_facet<moneypunct<char_type, false> >(__loc); + __pat = __mp.neg_format(); + __nsn = __mp.negative_sign(); + __psn = __mp.positive_sign(); + __dp = __mp.decimal_point(); + __ts = __mp.thousands_sep(); + __grp = __mp.grouping(); + __sym = __mp.curr_symbol(); + __fd = __mp.frac_digits(); + } +} + +extern template class __money_get<char>; +extern template class __money_get<wchar_t>; + +template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE money_get + : public locale::facet, + private __money_get<_CharT> +{ +public: + typedef _CharT char_type; + typedef _InputIterator iter_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit money_get(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob, + ios_base::iostate& __err, long double& __v) const + { + return do_get(__b, __e, __intl, __iob, __err, __v); + } + + _LIBCPP_ALWAYS_INLINE + iter_type get(iter_type __b, iter_type __e, bool __intl, ios_base& __iob, + ios_base::iostate& __err, string_type& __v) const + { + return do_get(__b, __e, __intl, __iob, __err, __v); + } + + static locale::id id; + +protected: + + _LIBCPP_ALWAYS_INLINE + ~money_get() {} + + virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl, + ios_base& __iob, ios_base::iostate& __err, + long double& __v) const; + virtual iter_type do_get(iter_type __b, iter_type __e, bool __intl, + ios_base& __iob, ios_base::iostate& __err, + string_type& __v) const; + +private: + static bool __do_get(iter_type& __b, iter_type __e, + bool __intl, const locale& __loc, + ios_base::fmtflags __flags, ios_base::iostate& __err, + bool& __neg, const ctype<char_type>& __ct, + unique_ptr<char_type, void(*)(void*)>& __wb, + char_type*& __wn, char_type* __we); +}; + +template <class _CharT, class _InputIterator> +locale::id +money_get<_CharT, _InputIterator>::id; + +void __do_nothing(void*); + +template <class _Tp> +_LIBCPP_HIDDEN +void +__double_or_nothing(unique_ptr<_Tp, void(*)(void*)>& __b, _Tp*& __n, _Tp*& __e) +{ + bool __owns = __b.get_deleter() != __do_nothing; + size_t __cur_cap = static_cast<size_t>(__e-__b.get()) * sizeof(_Tp); + size_t __new_cap = __cur_cap < numeric_limits<size_t>::max() / 2 ? + 2 * __cur_cap : numeric_limits<size_t>::max(); + size_t __n_off = static_cast<size_t>(__n - __b.get()); + _Tp* __t = (_Tp*)realloc(__owns ? __b.get() : 0, __new_cap); + if (__t == 0) + __throw_bad_alloc(); + if (__owns) + __b.release(); + __b = unique_ptr<_Tp, void(*)(void*)>(__t, free); + __new_cap /= sizeof(_Tp); + __n = __b.get() + __n_off; + __e = __b.get() + __new_cap; +} + +// true == success +template <class _CharT, class _InputIterator> +bool +money_get<_CharT, _InputIterator>::__do_get(iter_type& __b, iter_type __e, + bool __intl, const locale& __loc, + ios_base::fmtflags __flags, + ios_base::iostate& __err, + bool& __neg, + const ctype<char_type>& __ct, + unique_ptr<char_type, void(*)(void*)>& __wb, + char_type*& __wn, char_type* __we) +{ + const unsigned __bz = 100; + unsigned __gbuf[__bz]; + unique_ptr<unsigned, void(*)(void*)> __gb(__gbuf, __do_nothing); + unsigned* __gn = __gb.get(); + unsigned* __ge = __gn + __bz; + money_base::pattern __pat; + char_type __dp; + char_type __ts; + string __grp; + string_type __sym; + string_type __psn; + string_type __nsn; + // Capture the spaces read into money_base::{space,none} so they + // can be compared to initial spaces in __sym. + string_type __spaces; + int __fd; + __money_get<_CharT>::__gather_info(__intl, __loc, __pat, __dp, __ts, __grp, + __sym, __psn, __nsn, __fd); + const string_type* __trailing_sign = 0; + __wn = __wb.get(); + for (unsigned __p = 0; __p < 4 && __b != __e; ++__p) + { + switch (__pat.field[__p]) + { + case money_base::space: + if (__p != 3) + { + if (__ct.is(ctype_base::space, *__b)) + __spaces.push_back(*__b++); + else + { + __err |= ios_base::failbit; + return false; + } + } + // drop through + case money_base::none: + if (__p != 3) + { + while (__b != __e && __ct.is(ctype_base::space, *__b)) + __spaces.push_back(*__b++); + } + break; + case money_base::sign: + if (__psn.size() + __nsn.size() > 0) + { + if (__psn.size() == 0 || __nsn.size() == 0) + { // sign is optional + if (__psn.size() > 0) + { // __nsn.size() == 0 + if (*__b == __psn[0]) + { + ++__b; + if (__psn.size() > 1) + __trailing_sign = &__psn; + } + else + __neg = true; + } + else if (*__b == __nsn[0]) // __nsn.size() > 0 && __psn.size() == 0 + { + ++__b; + __neg = true; + if (__nsn.size() > 1) + __trailing_sign = &__nsn; + } + } + else // sign is required + { + if (*__b == __psn[0]) + { + ++__b; + if (__psn.size() > 1) + __trailing_sign = &__psn; + } + else if (*__b == __nsn[0]) + { + ++__b; + __neg = true; + if (__nsn.size() > 1) + __trailing_sign = &__nsn; + } + else + { + __err |= ios_base::failbit; + return false; + } + } + } + break; + case money_base::symbol: + { + bool __more_needed = __trailing_sign || + (__p < 2) || + (__p == 2 && __pat.field[3] != static_cast<char>(money_base::none)); + bool __sb = __flags & ios_base::showbase; + if (__sb || __more_needed) + { + ios_base::iostate __et = ios_base::goodbit; + typename string_type::const_iterator __sym_space_end = __sym.begin(); + if (__p > 0 && (__pat.field[__p - 1] == money_base::none || + __pat.field[__p - 1] == money_base::space)) { + // Match spaces we've already read against spaces at + // the beginning of __sym. + while (__sym_space_end != __sym.end() && + __ct.is(ctype_base::space, *__sym_space_end)) + ++__sym_space_end; + const size_t __num_spaces = __sym_space_end - __sym.begin(); + if (__num_spaces > __spaces.size() || + !equal(__spaces.end() - __num_spaces, __spaces.end(), + __sym.begin())) { + // No match. Put __sym_space_end back at the + // beginning of __sym, which will prevent a + // match in the next loop. + __sym_space_end = __sym.begin(); + } + } + typename string_type::const_iterator __sym_curr_char = __sym_space_end; + while (__sym_curr_char != __sym.end() && __b != __e && + *__b == *__sym_curr_char) { + ++__b; + ++__sym_curr_char; + } + if (__sb && __sym_curr_char != __sym.end()) + { + __err |= ios_base::failbit; + return false; + } + } + } + break; + case money_base::value: + { + unsigned __ng = 0; + for (; __b != __e; ++__b) + { + char_type __c = *__b; + if (__ct.is(ctype_base::digit, __c)) + { + if (__wn == __we) + __double_or_nothing(__wb, __wn, __we); + *__wn++ = __c; + ++__ng; + } + else if (__grp.size() > 0 && __ng > 0 && __c == __ts) + { + if (__gn == __ge) + __double_or_nothing(__gb, __gn, __ge); + *__gn++ = __ng; + __ng = 0; + } + else + break; + } + if (__gb.get() != __gn && __ng > 0) + { + if (__gn == __ge) + __double_or_nothing(__gb, __gn, __ge); + *__gn++ = __ng; + } + if (__fd > 0) + { + if (__b == __e || *__b != __dp) + { + __err |= ios_base::failbit; + return false; + } + for (++__b; __fd > 0; --__fd, ++__b) + { + if (__b == __e || !__ct.is(ctype_base::digit, *__b)) + { + __err |= ios_base::failbit; + return false; + } + if (__wn == __we) + __double_or_nothing(__wb, __wn, __we); + *__wn++ = *__b; + } + } + if (__wn == __wb.get()) + { + __err |= ios_base::failbit; + return false; + } + } + break; + } + } + if (__trailing_sign) + { + for (unsigned __i = 1; __i < __trailing_sign->size(); ++__i, ++__b) + { + if (__b == __e || *__b != (*__trailing_sign)[__i]) + { + __err |= ios_base::failbit; + return false; + } + } + } + if (__gb.get() != __gn) + { + ios_base::iostate __et = ios_base::goodbit; + __check_grouping(__grp, __gb.get(), __gn, __et); + if (__et) + { + __err |= ios_base::failbit; + return false; + } + } + return true; +} + +template <class _CharT, class _InputIterator> +_InputIterator +money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + bool __intl, ios_base& __iob, + ios_base::iostate& __err, + long double& __v) const +{ + const int __bz = 100; + char_type __wbuf[__bz]; + unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing); + char_type* __wn; + char_type* __we = __wbuf + __bz; + locale __loc = __iob.getloc(); + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); + bool __neg = false; + if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct, + __wb, __wn, __we)) + { + const char __src[] = "0123456789"; + char_type __atoms[sizeof(__src)-1]; + __ct.widen(__src, __src + (sizeof(__src)-1), __atoms); + char __nbuf[__bz]; + char* __nc = __nbuf; + unique_ptr<char, void(*)(void*)> __h(0, free); + if (__wn - __wb.get() > __bz-2) + { + __h.reset((char*)malloc(static_cast<size_t>(__wn - __wb.get() + 2))); + if (__h.get() == 0) + __throw_bad_alloc(); + __nc = __h.get(); + } + if (__neg) + *__nc++ = '-'; + for (const char_type* __w = __wb.get(); __w < __wn; ++__w, ++__nc) + *__nc = __src[find(__atoms, __atoms+sizeof(__atoms), *__w) - __atoms]; + *__nc = char(); + if (sscanf(__nbuf, "%Lf", &__v) != 1) + __throw_runtime_error("money_get error"); + } + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +template <class _CharT, class _InputIterator> +_InputIterator +money_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e, + bool __intl, ios_base& __iob, + ios_base::iostate& __err, + string_type& __v) const +{ + const int __bz = 100; + char_type __wbuf[__bz]; + unique_ptr<char_type, void(*)(void*)> __wb(__wbuf, __do_nothing); + char_type* __wn; + char_type* __we = __wbuf + __bz; + locale __loc = __iob.getloc(); + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); + bool __neg = false; + if (__do_get(__b, __e, __intl, __loc, __iob.flags(), __err, __neg, __ct, + __wb, __wn, __we)) + { + __v.clear(); + if (__neg) + __v.push_back(__ct.widen('-')); + char_type __z = __ct.widen('0'); + char_type* __w; + for (__w = __wb.get(); __w < __wn-1; ++__w) + if (*__w != __z) + break; + __v.append(__w, __wn); + } + if (__b == __e) + __err |= ios_base::eofbit; + return __b; +} + +extern template class money_get<char>; +extern template class money_get<wchar_t>; + +// money_put + +template <class _CharT> +class __money_put +{ +protected: + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE __money_put() {} + + static void __gather_info(bool __intl, bool __neg, const locale& __loc, + money_base::pattern& __pat, char_type& __dp, + char_type& __ts, string& __grp, + string_type& __sym, string_type& __sn, + int& __fd); + static void __format(char_type* __mb, char_type*& __mi, char_type*& __me, + ios_base::fmtflags __flags, + const char_type* __db, const char_type* __de, + const ctype<char_type>& __ct, bool __neg, + const money_base::pattern& __pat, char_type __dp, + char_type __ts, const string& __grp, + const string_type& __sym, const string_type& __sn, + int __fd); +}; + +template <class _CharT> +void +__money_put<_CharT>::__gather_info(bool __intl, bool __neg, const locale& __loc, + money_base::pattern& __pat, char_type& __dp, + char_type& __ts, string& __grp, + string_type& __sym, string_type& __sn, + int& __fd) +{ + if (__intl) + { + const moneypunct<char_type, true>& __mp = + use_facet<moneypunct<char_type, true> >(__loc); + if (__neg) + { + __pat = __mp.neg_format(); + __sn = __mp.negative_sign(); + } + else + { + __pat = __mp.pos_format(); + __sn = __mp.positive_sign(); + } + __dp = __mp.decimal_point(); + __ts = __mp.thousands_sep(); + __grp = __mp.grouping(); + __sym = __mp.curr_symbol(); + __fd = __mp.frac_digits(); + } + else + { + const moneypunct<char_type, false>& __mp = + use_facet<moneypunct<char_type, false> >(__loc); + if (__neg) + { + __pat = __mp.neg_format(); + __sn = __mp.negative_sign(); + } + else + { + __pat = __mp.pos_format(); + __sn = __mp.positive_sign(); + } + __dp = __mp.decimal_point(); + __ts = __mp.thousands_sep(); + __grp = __mp.grouping(); + __sym = __mp.curr_symbol(); + __fd = __mp.frac_digits(); + } +} + +template <class _CharT> +void +__money_put<_CharT>::__format(char_type* __mb, char_type*& __mi, char_type*& __me, + ios_base::fmtflags __flags, + const char_type* __db, const char_type* __de, + const ctype<char_type>& __ct, bool __neg, + const money_base::pattern& __pat, char_type __dp, + char_type __ts, const string& __grp, + const string_type& __sym, const string_type& __sn, + int __fd) +{ + __me = __mb; + for (unsigned __p = 0; __p < 4; ++__p) + { + switch (__pat.field[__p]) + { + case money_base::none: + __mi = __me; + break; + case money_base::space: + __mi = __me; + *__me++ = __ct.widen(' '); + break; + case money_base::sign: + if (!__sn.empty()) + *__me++ = __sn[0]; + break; + case money_base::symbol: + if (!__sym.empty() && (__flags & ios_base::showbase)) + __me = _VSTD::copy(__sym.begin(), __sym.end(), __me); + break; + case money_base::value: + { + // remember start of value so we can reverse it + char_type* __t = __me; + // find beginning of digits + if (__neg) + ++__db; + // find end of digits + const char_type* __d; + for (__d = __db; __d < __de; ++__d) + if (!__ct.is(ctype_base::digit, *__d)) + break; + // print fractional part + if (__fd > 0) + { + int __f; + for (__f = __fd; __d > __db && __f > 0; --__f) + *__me++ = *--__d; + char_type __z = __f > 0 ? __ct.widen('0') : char_type(); + for (; __f > 0; --__f) + *__me++ = __z; + *__me++ = __dp; + } + // print units part + if (__d == __db) + { + *__me++ = __ct.widen('0'); + } + else + { + unsigned __ng = 0; + unsigned __ig = 0; + unsigned __gl = __grp.empty() ? numeric_limits<unsigned>::max() + : static_cast<unsigned>(__grp[__ig]); + while (__d != __db) + { + if (__ng == __gl) + { + *__me++ = __ts; + __ng = 0; + if (++__ig < __grp.size()) + __gl = __grp[__ig] == numeric_limits<char>::max() ? + numeric_limits<unsigned>::max() : + static_cast<unsigned>(__grp[__ig]); + } + *__me++ = *--__d; + ++__ng; + } + } + // reverse it + reverse(__t, __me); + } + break; + } + } + // print rest of sign, if any + if (__sn.size() > 1) + __me = _VSTD::copy(__sn.begin()+1, __sn.end(), __me); + // set alignment + if ((__flags & ios_base::adjustfield) == ios_base::left) + __mi = __me; + else if ((__flags & ios_base::adjustfield) != ios_base::internal) + __mi = __mb; +} + +extern template class __money_put<char>; +extern template class __money_put<wchar_t>; + +template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> > +class _LIBCPP_VISIBLE money_put + : public locale::facet, + private __money_put<_CharT> +{ +public: + typedef _CharT char_type; + typedef _OutputIterator iter_type; + typedef basic_string<char_type> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit money_put(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl, + long double __units) const + { + return do_put(__s, __intl, __iob, __fl, __units); + } + + _LIBCPP_ALWAYS_INLINE + iter_type put(iter_type __s, bool __intl, ios_base& __iob, char_type __fl, + const string_type& __digits) const + { + return do_put(__s, __intl, __iob, __fl, __digits); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~money_put() {} + + virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob, + char_type __fl, long double __units) const; + virtual iter_type do_put(iter_type __s, bool __intl, ios_base& __iob, + char_type __fl, const string_type& __digits) const; +}; + +template <class _CharT, class _OutputIterator> +locale::id +money_put<_CharT, _OutputIterator>::id; + +template <class _CharT, class _OutputIterator> +_OutputIterator +money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl, + ios_base& __iob, char_type __fl, + long double __units) const +{ + // convert to char + const size_t __bs = 100; + char __buf[__bs]; + char* __bb = __buf; + char_type __digits[__bs]; + char_type* __db = __digits; + size_t __n = static_cast<size_t>(snprintf(__bb, __bs, "%.0Lf", __units)); + unique_ptr<char, void(*)(void*)> __hn(0, free); + unique_ptr<char_type, void(*)(void*)> __hd(0, free); + // secure memory for digit storage + if (__n > __bs-1) + { +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + __n = static_cast<size_t>(asprintf_l(&__bb, _LIBCPP_GET_C_LOCALE, "%.0Lf", __units)); +#else + __n = __asprintf_l(&__bb, __cloc(), "%.0Lf", __units); +#endif + if (__bb == 0) + __throw_bad_alloc(); + __hn.reset(__bb); + __hd.reset((char_type*)malloc(__n * sizeof(char_type))); + if (__hd == nullptr) + __throw_bad_alloc(); + __db = __hd.get(); + } + // gather info + locale __loc = __iob.getloc(); + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); + __ct.widen(__bb, __bb + __n, __db); + bool __neg = __n > 0 && __bb[0] == '-'; + money_base::pattern __pat; + char_type __dp; + char_type __ts; + string __grp; + string_type __sym; + string_type __sn; + int __fd; + this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd); + // secure memory for formatting + char_type __mbuf[__bs]; + char_type* __mb = __mbuf; + unique_ptr<char_type, void(*)(void*)> __hw(0, free); + size_t __exn = static_cast<int>(__n) > __fd ? + (__n - static_cast<size_t>(__fd)) * 2 + __sn.size() + + __sym.size() + static_cast<size_t>(__fd) + 1 + : __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 2; + if (__exn > __bs) + { + __hw.reset((char_type*)malloc(__exn * sizeof(char_type))); + __mb = __hw.get(); + if (__mb == 0) + __throw_bad_alloc(); + } + // format + char_type* __mi; + char_type* __me; + this->__format(__mb, __mi, __me, __iob.flags(), + __db, __db + __n, __ct, + __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd); + return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl); +} + +template <class _CharT, class _OutputIterator> +_OutputIterator +money_put<_CharT, _OutputIterator>::do_put(iter_type __s, bool __intl, + ios_base& __iob, char_type __fl, + const string_type& __digits) const +{ + // gather info + locale __loc = __iob.getloc(); + const ctype<char_type>& __ct = use_facet<ctype<char_type> >(__loc); + bool __neg = __digits.size() > 0 && __digits[0] == __ct.widen('-'); + money_base::pattern __pat; + char_type __dp; + char_type __ts; + string __grp; + string_type __sym; + string_type __sn; + int __fd; + this->__gather_info(__intl, __neg, __loc, __pat, __dp, __ts, __grp, __sym, __sn, __fd); + // secure memory for formatting + char_type __mbuf[100]; + char_type* __mb = __mbuf; + unique_ptr<char_type, void(*)(void*)> __h(0, free); + size_t __exn = static_cast<int>(__digits.size()) > __fd ? + (__digits.size() - static_cast<size_t>(__fd)) * 2 + + __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 1 + : __sn.size() + __sym.size() + static_cast<size_t>(__fd) + 2; + if (__exn > 100) + { + __h.reset((char_type*)malloc(__exn * sizeof(char_type))); + __mb = __h.get(); + if (__mb == 0) + __throw_bad_alloc(); + } + // format + char_type* __mi; + char_type* __me; + this->__format(__mb, __mi, __me, __iob.flags(), + __digits.data(), __digits.data() + __digits.size(), __ct, + __neg, __pat, __dp, __ts, __grp, __sym, __sn, __fd); + return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl); +} + +extern template class money_put<char>; +extern template class money_put<wchar_t>; + +// messages + +class _LIBCPP_VISIBLE messages_base +{ +public: + typedef ptrdiff_t catalog; + + _LIBCPP_ALWAYS_INLINE messages_base() {} +}; + +template <class _CharT> +class _LIBCPP_VISIBLE messages + : public locale::facet, + public messages_base +{ +public: + typedef _CharT char_type; + typedef basic_string<_CharT> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit messages(size_t __refs = 0) + : locale::facet(__refs) {} + + _LIBCPP_ALWAYS_INLINE + catalog open(const basic_string<char>& __nm, const locale& __loc) const + { + return do_open(__nm, __loc); + } + + _LIBCPP_ALWAYS_INLINE + string_type get(catalog __c, int __set, int __msgid, + const string_type& __dflt) const + { + return do_get(__c, __set, __msgid, __dflt); + } + + _LIBCPP_ALWAYS_INLINE + void close(catalog __c) const + { + do_close(__c); + } + + static locale::id id; + +protected: + _LIBCPP_ALWAYS_INLINE + ~messages() {} + + virtual catalog do_open(const basic_string<char>&, const locale&) const; + virtual string_type do_get(catalog, int __set, int __msgid, + const string_type& __dflt) const; + virtual void do_close(catalog) const; +}; + +template <class _CharT> +locale::id +messages<_CharT>::id; + +template <class _CharT> +typename messages<_CharT>::catalog +messages<_CharT>::do_open(const basic_string<char>& __nm, const locale&) const +{ +#if _WIN32 + return -1; +#else // _WIN32 + catalog __cat = (catalog)catopen(__nm.c_str(), NL_CAT_LOCALE); + if (__cat != -1) + __cat = static_cast<catalog>((static_cast<size_t>(__cat) >> 1)); + return __cat; +#endif // _WIN32 +} + +template <class _CharT> +typename messages<_CharT>::string_type +messages<_CharT>::do_get(catalog __c, int __set, int __msgid, + const string_type& __dflt) const +{ +#if _WIN32 + return __dflt; +#else // _WIN32 + string __ndflt; + __narrow_to_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__ndflt), + __dflt.c_str(), + __dflt.c_str() + __dflt.size()); + if (__c != -1) + __c <<= 1; + nl_catd __cat = (nl_catd)__c; + char* __n = catgets(__cat, __set, __msgid, __ndflt.c_str()); + string_type __w; + __widen_from_utf8<sizeof(char_type)*__CHAR_BIT__>()(back_inserter(__w), + __n, __n + strlen(__n)); + return __w; +#endif // _WIN32 +} + +template <class _CharT> +void +messages<_CharT>::do_close(catalog __c) const +{ +#if !_WIN32 + if (__c != -1) + __c <<= 1; + nl_catd __cat = (nl_catd)__c; + catclose(__cat); +#endif // !_WIN32 +} + +extern template class messages<char>; +extern template class messages<wchar_t>; + +template <class _CharT> +class _LIBCPP_VISIBLE messages_byname + : public messages<_CharT> +{ +public: + typedef messages_base::catalog catalog; + typedef basic_string<_CharT> string_type; + + _LIBCPP_ALWAYS_INLINE + explicit messages_byname(const char*, size_t __refs = 0) + : messages<_CharT>(__refs) {} + + _LIBCPP_ALWAYS_INLINE + explicit messages_byname(const string&, size_t __refs = 0) + : messages<_CharT>(__refs) {} + +protected: + _LIBCPP_ALWAYS_INLINE + ~messages_byname() {} +}; + +extern template class messages_byname<char>; +extern template class messages_byname<wchar_t>; + +template<class _Codecvt, class _Elem = wchar_t, + class _Wide_alloc = allocator<_Elem>, + class _Byte_alloc = allocator<char> > +class _LIBCPP_VISIBLE wstring_convert +{ +public: + typedef basic_string<char, char_traits<char>, _Byte_alloc> byte_string; + typedef basic_string<_Elem, char_traits<_Elem>, _Wide_alloc> wide_string; + typedef typename _Codecvt::state_type state_type; + typedef typename wide_string::traits_type::int_type int_type; + +private: + byte_string __byte_err_string_; + wide_string __wide_err_string_; + _Codecvt* __cvtptr_; + state_type __cvtstate_; + size_t __cvtcount_; + + wstring_convert(const wstring_convert& __wc); + wstring_convert& operator=(const wstring_convert& __wc); +public: + wstring_convert(_Codecvt* __pcvt = new _Codecvt); + wstring_convert(_Codecvt* __pcvt, state_type __state); + wstring_convert(const byte_string& __byte_err, + const wide_string& __wide_err = wide_string()); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + wstring_convert(wstring_convert&& __wc); +#endif + ~wstring_convert(); + + _LIBCPP_ALWAYS_INLINE + wide_string from_bytes(char __byte) + {return from_bytes(&__byte, &__byte+1);} + _LIBCPP_ALWAYS_INLINE + wide_string from_bytes(const char* __ptr) + {return from_bytes(__ptr, __ptr + char_traits<char>::length(__ptr));} + _LIBCPP_ALWAYS_INLINE + wide_string from_bytes(const byte_string& __str) + {return from_bytes(__str.data(), __str.data() + __str.size());} + wide_string from_bytes(const char* __first, const char* __last); + + _LIBCPP_ALWAYS_INLINE + byte_string to_bytes(_Elem __wchar) + {return to_bytes(&__wchar, &__wchar+1);} + _LIBCPP_ALWAYS_INLINE + byte_string to_bytes(const _Elem* __wptr) + {return to_bytes(__wptr, __wptr + char_traits<_Elem>::length(__wptr));} + _LIBCPP_ALWAYS_INLINE + byte_string to_bytes(const wide_string& __wstr) + {return to_bytes(__wstr.data(), __wstr.data() + __wstr.size());} + byte_string to_bytes(const _Elem* __first, const _Elem* __last); + + _LIBCPP_ALWAYS_INLINE + size_t converted() const {return __cvtcount_;} + _LIBCPP_ALWAYS_INLINE + state_type state() const {return __cvtstate_;} +}; + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +inline _LIBCPP_ALWAYS_INLINE +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + wstring_convert(_Codecvt* __pcvt) + : __cvtptr_(__pcvt), __cvtstate_(), __cvtcount_(0) +{ +} + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +inline _LIBCPP_ALWAYS_INLINE +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + wstring_convert(_Codecvt* __pcvt, state_type __state) + : __cvtptr_(__pcvt), __cvtstate_(__state), __cvtcount_(0) +{ +} + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + wstring_convert(const byte_string& __byte_err, const wide_string& __wide_err) + : __byte_err_string_(__byte_err), __wide_err_string_(__wide_err), + __cvtstate_(), __cvtcount_(0) +{ + __cvtptr_ = new _Codecvt; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +inline _LIBCPP_ALWAYS_INLINE +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + wstring_convert(wstring_convert&& __wc) + : __byte_err_string_(_VSTD::move(__wc.__byte_err_string_)), + __wide_err_string_(_VSTD::move(__wc.__wide_err_string_)), + __cvtptr_(__wc.__cvtptr_), + __cvtstate_(__wc.__cvtstate_), __cvtcount_(__wc.__cvtstate_) +{ + __wc.__cvtptr_ = nullptr; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::~wstring_convert() +{ + delete __cvtptr_; +} + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +typename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::wide_string +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + from_bytes(const char* __frm, const char* __frm_end) +{ + __cvtcount_ = 0; + if (__cvtptr_ != nullptr) + { + wide_string __ws(2*(__frm_end - __frm), _Elem()); + __ws.resize(__ws.capacity()); + codecvt_base::result __r = codecvt_base::ok; + state_type __st = __cvtstate_; + if (__frm != __frm_end) + { + _Elem* __to = &__ws[0]; + _Elem* __to_end = __to + __ws.size(); + const char* __frm_nxt; + do + { + _Elem* __to_nxt; + __r = __cvtptr_->in(__st, __frm, __frm_end, __frm_nxt, + __to, __to_end, __to_nxt); + __cvtcount_ += __frm_nxt - __frm; + if (__frm_nxt == __frm) + { + __r = codecvt_base::error; + } + else if (__r == codecvt_base::noconv) + { + __ws.resize(__to - &__ws[0]); + // This only gets executed if _Elem is char + __ws.append((const _Elem*)__frm, (const _Elem*)__frm_end); + __frm = __frm_nxt; + __r = codecvt_base::ok; + } + else if (__r == codecvt_base::ok) + { + __ws.resize(__to_nxt - &__ws[0]); + __frm = __frm_nxt; + } + else if (__r == codecvt_base::partial) + { + ptrdiff_t __s = __to_nxt - &__ws[0]; + __ws.resize(2 * __s); + __to = &__ws[0] + __s; + __to_end = &__ws[0] + __ws.size(); + __frm = __frm_nxt; + } + } while (__r == codecvt_base::partial && __frm_nxt < __frm_end); + } + if (__r == codecvt_base::ok) + return __ws; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__wide_err_string_.empty()) + throw range_error("wstring_convert: from_bytes error"); +#endif // _LIBCPP_NO_EXCEPTIONS + return __wide_err_string_; +} + +template<class _Codecvt, class _Elem, class _Wide_alloc, class _Byte_alloc> +typename wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>::byte_string +wstring_convert<_Codecvt, _Elem, _Wide_alloc, _Byte_alloc>:: + to_bytes(const _Elem* __frm, const _Elem* __frm_end) +{ + __cvtcount_ = 0; + if (__cvtptr_ != nullptr) + { + byte_string __bs(2*(__frm_end - __frm), char()); + __bs.resize(__bs.capacity()); + codecvt_base::result __r = codecvt_base::ok; + state_type __st = __cvtstate_; + if (__frm != __frm_end) + { + char* __to = &__bs[0]; + char* __to_end = __to + __bs.size(); + const _Elem* __frm_nxt; + do + { + char* __to_nxt; + __r = __cvtptr_->out(__st, __frm, __frm_end, __frm_nxt, + __to, __to_end, __to_nxt); + __cvtcount_ += __frm_nxt - __frm; + if (__frm_nxt == __frm) + { + __r = codecvt_base::error; + } + else if (__r == codecvt_base::noconv) + { + __bs.resize(__to - &__bs[0]); + // This only gets executed if _Elem is char + __bs.append((const char*)__frm, (const char*)__frm_end); + __frm = __frm_nxt; + __r = codecvt_base::ok; + } + else if (__r == codecvt_base::ok) + { + __bs.resize(__to_nxt - &__bs[0]); + __frm = __frm_nxt; + } + else if (__r == codecvt_base::partial) + { + ptrdiff_t __s = __to_nxt - &__bs[0]; + __bs.resize(2 * __s); + __to = &__bs[0] + __s; + __to_end = &__bs[0] + __bs.size(); + __frm = __frm_nxt; + } + } while (__r == codecvt_base::partial && __frm_nxt < __frm_end); + } + if (__r == codecvt_base::ok) + { + size_t __s = __bs.size(); + __bs.resize(__bs.capacity()); + char* __to = &__bs[0] + __s; + char* __to_end = __to + __bs.size(); + do + { + char* __to_nxt; + __r = __cvtptr_->unshift(__st, __to, __to_end, __to_nxt); + if (__r == codecvt_base::noconv) + { + __bs.resize(__to - &__bs[0]); + __r = codecvt_base::ok; + } + else if (__r == codecvt_base::ok) + { + __bs.resize(__to_nxt - &__bs[0]); + } + else if (__r == codecvt_base::partial) + { + ptrdiff_t __sp = __to_nxt - &__bs[0]; + __bs.resize(2 * __sp); + __to = &__bs[0] + __sp; + __to_end = &__bs[0] + __bs.size(); + } + } while (__r == codecvt_base::partial); + if (__r == codecvt_base::ok) + return __bs; + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__byte_err_string_.empty()) + throw range_error("wstring_convert: to_bytes error"); +#endif // _LIBCPP_NO_EXCEPTIONS + return __byte_err_string_; +} + +template <class _Codecvt, class _Elem = wchar_t, class _Tr = char_traits<_Elem> > +class _LIBCPP_VISIBLE wbuffer_convert + : public basic_streambuf<_Elem, _Tr> +{ +public: + // types: + typedef _Elem char_type; + typedef _Tr traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef typename _Codecvt::state_type state_type; + +private: + char* __extbuf_; + const char* __extbufnext_; + const char* __extbufend_; + char __extbuf_min_[8]; + size_t __ebs_; + char_type* __intbuf_; + size_t __ibs_; + streambuf* __bufptr_; + _Codecvt* __cv_; + state_type __st_; + ios_base::openmode __cm_; + bool __owns_eb_; + bool __owns_ib_; + bool __always_noconv_; + + wbuffer_convert(const wbuffer_convert&); + wbuffer_convert& operator=(const wbuffer_convert&); +public: + wbuffer_convert(streambuf* __bytebuf = 0, _Codecvt* __pcvt = new _Codecvt, + state_type __state = state_type()); + ~wbuffer_convert(); + + _LIBCPP_INLINE_VISIBILITY + streambuf* rdbuf() const {return __bufptr_;} + _LIBCPP_INLINE_VISIBILITY + streambuf* rdbuf(streambuf* __bytebuf) + { + streambuf* __r = __bufptr_; + __bufptr_ = __bytebuf; + return __r; + } + + _LIBCPP_INLINE_VISIBILITY + state_type state() const {return __st_;} + +protected: + virtual int_type underflow(); + virtual int_type pbackfail(int_type __c = traits_type::eof()); + virtual int_type overflow (int_type __c = traits_type::eof()); + virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* __s, + streamsize __n); + virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __wch = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type __sp, + ios_base::openmode __wch = ios_base::in | ios_base::out); + virtual int sync(); + +private: + bool __read_mode(); + void __write_mode(); + wbuffer_convert* __close(); +}; + +template <class _Codecvt, class _Elem, class _Tr> +wbuffer_convert<_Codecvt, _Elem, _Tr>:: + wbuffer_convert(streambuf* __bytebuf, _Codecvt* __pcvt, state_type __state) + : __extbuf_(0), + __extbufnext_(0), + __extbufend_(0), + __ebs_(0), + __intbuf_(0), + __ibs_(0), + __bufptr_(__bytebuf), + __cv_(__pcvt), + __st_(__state), + __cm_(0), + __owns_eb_(false), + __owns_ib_(false), + __always_noconv_(__cv_ ? __cv_->always_noconv() : false) +{ + setbuf(0, 4096); +} + +template <class _Codecvt, class _Elem, class _Tr> +wbuffer_convert<_Codecvt, _Elem, _Tr>::~wbuffer_convert() +{ + __close(); + delete __cv_; + if (__owns_eb_) + delete [] __extbuf_; + if (__owns_ib_) + delete [] __intbuf_; +} + +template <class _Codecvt, class _Elem, class _Tr> +typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type +wbuffer_convert<_Codecvt, _Elem, _Tr>::underflow() +{ + if (__cv_ == 0 || __bufptr_ == 0) + return traits_type::eof(); + bool __initial = __read_mode(); + char_type __1buf; + if (this->gptr() == 0) + this->setg(&__1buf, &__1buf+1, &__1buf+1); + const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4); + int_type __c = traits_type::eof(); + if (this->gptr() == this->egptr()) + { + memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type)); + if (__always_noconv_) + { + streamsize __nmemb = static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz); + __nmemb = __bufptr_->sgetn((char*)this->eback() + __unget_sz, __nmemb); + if (__nmemb != 0) + { + this->setg(this->eback(), + this->eback() + __unget_sz, + this->eback() + __unget_sz + __nmemb); + __c = *this->gptr(); + } + } + else + { + memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_); + __extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_); + __extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_); + streamsize __nmemb = _VSTD::min(static_cast<streamsize>(this->egptr() - this->eback() - __unget_sz), + static_cast<streamsize>(__extbufend_ - __extbufnext_)); + codecvt_base::result __r; + state_type __svs = __st_; + streamsize __nr = __bufptr_->sgetn(const_cast<char*>(__extbufnext_), __nmemb); + if (__nr != 0) + { + __extbufend_ = __extbufnext_ + __nr; + char_type* __inext; + __r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, + this->eback() + __unget_sz, + this->egptr(), __inext); + if (__r == codecvt_base::noconv) + { + this->setg((char_type*)__extbuf_, (char_type*)__extbuf_, (char_type*)__extbufend_); + __c = *this->gptr(); + } + else if (__inext != this->eback() + __unget_sz) + { + this->setg(this->eback(), this->eback() + __unget_sz, __inext); + __c = *this->gptr(); + } + } + } + } + else + __c = *this->gptr(); + if (this->eback() == &__1buf) + this->setg(0, 0, 0); + return __c; +} + +template <class _Codecvt, class _Elem, class _Tr> +typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type +wbuffer_convert<_Codecvt, _Elem, _Tr>::pbackfail(int_type __c) +{ + if (__cv_ != 0 && __bufptr_ != 0 && this->eback() < this->gptr()) + { + if (traits_type::eq_int_type(__c, traits_type::eof())) + { + this->gbump(-1); + return traits_type::not_eof(__c); + } + if (traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) + { + this->gbump(-1); + *this->gptr() = traits_type::to_char_type(__c); + return __c; + } + } + return traits_type::eof(); +} + +template <class _Codecvt, class _Elem, class _Tr> +typename wbuffer_convert<_Codecvt, _Elem, _Tr>::int_type +wbuffer_convert<_Codecvt, _Elem, _Tr>::overflow(int_type __c) +{ + if (__cv_ == 0 || __bufptr_ == 0) + return traits_type::eof(); + __write_mode(); + char_type __1buf; + char_type* __pb_save = this->pbase(); + char_type* __epb_save = this->epptr(); + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + if (this->pptr() == 0) + this->setp(&__1buf, &__1buf+1); + *this->pptr() = traits_type::to_char_type(__c); + this->pbump(1); + } + if (this->pptr() != this->pbase()) + { + if (__always_noconv_) + { + streamsize __nmemb = static_cast<streamsize>(this->pptr() - this->pbase()); + if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb) + return traits_type::eof(); + } + else + { + char* __extbe = __extbuf_; + codecvt_base::result __r; + do + { + const char_type* __e; + __r = __cv_->out(__st_, this->pbase(), this->pptr(), __e, + __extbuf_, __extbuf_ + __ebs_, __extbe); + if (__e == this->pbase()) + return traits_type::eof(); + if (__r == codecvt_base::noconv) + { + streamsize __nmemb = static_cast<size_t>(this->pptr() - this->pbase()); + if (__bufptr_->sputn((const char*)this->pbase(), __nmemb) != __nmemb) + return traits_type::eof(); + } + else if (__r == codecvt_base::ok || __r == codecvt_base::partial) + { + streamsize __nmemb = static_cast<size_t>(__extbe - __extbuf_); + if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb) + return traits_type::eof(); + if (__r == codecvt_base::partial) + { + this->setp((char_type*)__e, this->pptr()); + this->pbump(this->epptr() - this->pbase()); + } + } + else + return traits_type::eof(); + } while (__r == codecvt_base::partial); + } + this->setp(__pb_save, __epb_save); + } + return traits_type::not_eof(__c); +} + +template <class _Codecvt, class _Elem, class _Tr> +basic_streambuf<_Elem, _Tr>* +wbuffer_convert<_Codecvt, _Elem, _Tr>::setbuf(char_type* __s, streamsize __n) +{ + this->setg(0, 0, 0); + this->setp(0, 0); + if (__owns_eb_) + delete [] __extbuf_; + if (__owns_ib_) + delete [] __intbuf_; + __ebs_ = __n; + if (__ebs_ > sizeof(__extbuf_min_)) + { + if (__always_noconv_ && __s) + { + __extbuf_ = (char*)__s; + __owns_eb_ = false; + } + else + { + __extbuf_ = new char[__ebs_]; + __owns_eb_ = true; + } + } + else + { + __extbuf_ = __extbuf_min_; + __ebs_ = sizeof(__extbuf_min_); + __owns_eb_ = false; + } + if (!__always_noconv_) + { + __ibs_ = max<streamsize>(__n, sizeof(__extbuf_min_)); + if (__s && __ibs_ >= sizeof(__extbuf_min_)) + { + __intbuf_ = __s; + __owns_ib_ = false; + } + else + { + __intbuf_ = new char_type[__ibs_]; + __owns_ib_ = true; + } + } + else + { + __ibs_ = 0; + __intbuf_ = 0; + __owns_ib_ = false; + } + return this; +} + +template <class _Codecvt, class _Elem, class _Tr> +typename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type +wbuffer_convert<_Codecvt, _Elem, _Tr>::seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __om) +{ + int __width = __cv_->encoding(); + if (__cv_ == 0 || __bufptr_ == 0 || (__width <= 0 && __off != 0) || sync()) + return pos_type(off_type(-1)); + // __width > 0 || __off == 0 + switch (__way) + { + case ios_base::beg: + break; + case ios_base::cur: + break; + case ios_base::end: + break; + default: + return pos_type(off_type(-1)); + } + pos_type __r = __bufptr_->pubseekoff(__width * __off, __way, __om); + __r.state(__st_); + return __r; +} + +template <class _Codecvt, class _Elem, class _Tr> +typename wbuffer_convert<_Codecvt, _Elem, _Tr>::pos_type +wbuffer_convert<_Codecvt, _Elem, _Tr>::seekpos(pos_type __sp, ios_base::openmode __wch) +{ + if (__cv_ == 0 || __bufptr_ == 0 || sync()) + return pos_type(off_type(-1)); + if (__bufptr_->pubseekpos(__sp, __wch) == pos_type(off_type(-1))) + return pos_type(off_type(-1)); + return __sp; +} + +template <class _Codecvt, class _Elem, class _Tr> +int +wbuffer_convert<_Codecvt, _Elem, _Tr>::sync() +{ + if (__cv_ == 0 || __bufptr_ == 0) + return 0; + if (__cm_ & ios_base::out) + { + if (this->pptr() != this->pbase()) + if (overflow() == traits_type::eof()) + return -1; + codecvt_base::result __r; + do + { + char* __extbe; + __r = __cv_->unshift(__st_, __extbuf_, __extbuf_ + __ebs_, __extbe); + streamsize __nmemb = static_cast<streamsize>(__extbe - __extbuf_); + if (__bufptr_->sputn(__extbuf_, __nmemb) != __nmemb) + return -1; + } while (__r == codecvt_base::partial); + if (__r == codecvt_base::error) + return -1; + if (__bufptr_->pubsync()) + return -1; + } + else if (__cm_ & ios_base::in) + { + off_type __c; + if (__always_noconv_) + __c = this->egptr() - this->gptr(); + else + { + int __width = __cv_->encoding(); + __c = __extbufend_ - __extbufnext_; + if (__width > 0) + __c += __width * (this->egptr() - this->gptr()); + else + { + if (this->gptr() != this->egptr()) + { + reverse(this->gptr(), this->egptr()); + codecvt_base::result __r; + const char_type* __e = this->gptr(); + char* __extbe; + do + { + __r = __cv_->out(__st_, __e, this->egptr(), __e, + __extbuf_, __extbuf_ + __ebs_, __extbe); + switch (__r) + { + case codecvt_base::noconv: + __c += this->egptr() - this->gptr(); + break; + case codecvt_base::ok: + case codecvt_base::partial: + __c += __extbe - __extbuf_; + break; + default: + return -1; + } + } while (__r == codecvt_base::partial); + } + } + } + if (__bufptr_->pubseekoff(-__c, ios_base::cur, __cm_) == pos_type(off_type(-1))) + return -1; + this->setg(0, 0, 0); + __cm_ = 0; + } + return 0; +} + +template <class _Codecvt, class _Elem, class _Tr> +bool +wbuffer_convert<_Codecvt, _Elem, _Tr>::__read_mode() +{ + if (!(__cm_ & ios_base::in)) + { + this->setp(0, 0); + if (__always_noconv_) + this->setg((char_type*)__extbuf_, + (char_type*)__extbuf_ + __ebs_, + (char_type*)__extbuf_ + __ebs_); + else + this->setg(__intbuf_, __intbuf_ + __ibs_, __intbuf_ + __ibs_); + __cm_ = ios_base::in; + return true; + } + return false; +} + +template <class _Codecvt, class _Elem, class _Tr> +void +wbuffer_convert<_Codecvt, _Elem, _Tr>::__write_mode() +{ + if (!(__cm_ & ios_base::out)) + { + this->setg(0, 0, 0); + if (__ebs_ > sizeof(__extbuf_min_)) + { + if (__always_noconv_) + this->setp((char_type*)__extbuf_, + (char_type*)__extbuf_ + (__ebs_ - 1)); + else + this->setp(__intbuf_, __intbuf_ + (__ibs_ - 1)); + } + else + this->setp(0, 0); + __cm_ = ios_base::out; + } +} + +template <class _Codecvt, class _Elem, class _Tr> +wbuffer_convert<_Codecvt, _Elem, _Tr>* +wbuffer_convert<_Codecvt, _Elem, _Tr>::__close() +{ + wbuffer_convert* __rt = 0; + if (__cv_ != 0 && __bufptr_ != 0) + { + __rt = this; + if ((__cm_ & ios_base::out) && sync()) + __rt = 0; + } + return __rt; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_LOCALE diff --git a/contrib/libc++/include/map b/contrib/libc++/include/map new file mode 100644 index 0000000..633579b --- /dev/null +++ b/contrib/libc++/include/map @@ -0,0 +1,1935 @@ +// -*- C++ -*- +//===----------------------------- map ------------------------------------===// +// +// 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_MAP +#define _LIBCPP_MAP + +/* + + map synopsis + +namespace std +{ + +template <class Key, class T, class Compare = less<Key>, + class Allocator = allocator<pair<const Key, T>>> +class map +{ +public: + // types: + typedef Key key_type; + typedef T mapped_type; + typedef pair<const key_type, mapped_type> value_type; + typedef Compare key_compare; + typedef Allocator allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + class value_compare + : public binary_function<value_type, value_type, bool> + { + friend class map; + protected: + key_compare comp; + + value_compare(key_compare c); + public: + bool operator()(const value_type& x, const value_type& y) const; + }; + + // construct/copy/destroy: + map() + noexcept( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value); + explicit map(const key_compare& comp); + map(const key_compare& comp, const allocator_type& a); + template <class InputIterator> + map(InputIterator first, InputIterator last, + const key_compare& comp = key_compare()); + template <class InputIterator> + map(InputIterator first, InputIterator last, + const key_compare& comp, const allocator_type& a); + map(const map& m); + map(map&& m) + noexcept( + is_nothrow_move_constructible<allocator_type>::value && + is_nothrow_move_constructible<key_compare>::value); + explicit map(const allocator_type& a); + map(const map& m, const allocator_type& a); + map(map&& m, const allocator_type& a); + map(initializer_list<value_type> il, const key_compare& comp = key_compare()); + map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); + ~map(); + + map& operator=(const map& m); + map& operator=(map&& m) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<key_compare>::value); + map& operator=(initializer_list<value_type> il); + + // iterators: + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + // element access: + mapped_type& operator[](const key_type& k); + mapped_type& operator[](key_type&& k); + + mapped_type& at(const key_type& k); + const mapped_type& at(const key_type& k) const; + + // modifiers: + template <class... Args> + pair<iterator, bool> emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + pair<iterator, bool> insert(const value_type& v); + template <class P> + pair<iterator, bool> insert(P&& p); + iterator insert(const_iterator position, const value_type& v); + template <class P> + iterator insert(const_iterator position, P&& p); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type> il); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(map& m) + noexcept( + __is_nothrow_swappable<key_compare>::value && + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value)); + + // observers: + allocator_type get_allocator() const noexcept; + key_compare key_comp() const; + value_compare value_comp() const; + + // map operations: + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + iterator lower_bound(const key_type& k); + const_iterator lower_bound(const key_type& k) const; + iterator upper_bound(const key_type& k); + const_iterator upper_bound(const key_type& k) const; + pair<iterator,iterator> equal_range(const key_type& k); + pair<const_iterator,const_iterator> equal_range(const key_type& k) const; +}; + +template <class Key, class T, class Compare, class Allocator> +bool +operator==(const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator< (const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator!=(const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator> (const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator>=(const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator<=(const map<Key, T, Compare, Allocator>& x, + const map<Key, T, Compare, Allocator>& y); + +// specialized algorithms: +template <class Key, class T, class Compare, class Allocator> +void +swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) + noexcept(noexcept(x.swap(y))); + +template <class Key, class T, class Compare = less<Key>, + class Allocator = allocator<pair<const Key, T>>> +class multimap +{ +public: + // types: + typedef Key key_type; + typedef T mapped_type; + typedef pair<const key_type,mapped_type> value_type; + typedef Compare key_compare; + typedef Allocator allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + 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 implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + class value_compare + : public binary_function<value_type,value_type,bool> + { + friend class multimap; + protected: + key_compare comp; + value_compare(key_compare c); + public: + bool operator()(const value_type& x, const value_type& y) const; + }; + + // construct/copy/destroy: + multimap() + noexcept( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value); + explicit multimap(const key_compare& comp); + multimap(const key_compare& comp, const allocator_type& a); + template <class InputIterator> + multimap(InputIterator first, InputIterator last, const key_compare& comp); + template <class InputIterator> + multimap(InputIterator first, InputIterator last, const key_compare& comp, + const allocator_type& a); + multimap(const multimap& m); + multimap(multimap&& m) + noexcept( + is_nothrow_move_constructible<allocator_type>::value && + is_nothrow_move_constructible<key_compare>::value); + explicit multimap(const allocator_type& a); + multimap(const multimap& m, const allocator_type& a); + multimap(multimap&& m, const allocator_type& a); + multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); + multimap(initializer_list<value_type> il, const key_compare& comp, + const allocator_type& a); + ~multimap(); + + multimap& operator=(const multimap& m); + multimap& operator=(multimap&& m) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<key_compare>::value); + multimap& operator=(initializer_list<value_type> il); + + // iterators: + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + // modifiers: + template <class... Args> + iterator emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + iterator insert(const value_type& v); + template <class P> + iterator insert(P&& p); + iterator insert(const_iterator position, const value_type& v); + template <class P> + iterator insert(const_iterator position, P&& p); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type> il); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(multimap& m) + noexcept( + __is_nothrow_swappable<key_compare>::value && + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value)); + + // observers: + allocator_type get_allocator() const noexcept; + key_compare key_comp() const; + value_compare value_comp() const; + + // map operations: + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + iterator lower_bound(const key_type& k); + const_iterator lower_bound(const key_type& k) const; + iterator upper_bound(const key_type& k); + const_iterator upper_bound(const key_type& k) const; + pair<iterator,iterator> equal_range(const key_type& k); + pair<const_iterator,const_iterator> equal_range(const key_type& k) const; +}; + +template <class Key, class T, class Compare, class Allocator> +bool +operator==(const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator< (const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator!=(const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator> (const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator>=(const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +template <class Key, class T, class Compare, class Allocator> +bool +operator<=(const multimap<Key, T, Compare, Allocator>& x, + const multimap<Key, T, Compare, Allocator>& y); + +// specialized algorithms: +template <class Key, class T, class Compare, class Allocator> +void +swap(multimap<Key, T, Compare, Allocator>& x, + multimap<Key, T, Compare, Allocator>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> +#include <__tree> +#include <iterator> +#include <memory> +#include <utility> +#include <functional> +#include <initializer_list> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Key, class _Tp, class _Compare, bool = is_empty<_Compare>::value +#if __has_feature(is_final) + && !__is_final(_Compare) +#endif + > +class __map_value_compare + : private _Compare +{ + typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _CP; +public: + _LIBCPP_INLINE_VISIBILITY + __map_value_compare() + _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) + : _Compare() {} + _LIBCPP_INLINE_VISIBILITY + __map_value_compare(_Compare c) + _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) + : _Compare(c) {} + _LIBCPP_INLINE_VISIBILITY + const _Compare& key_comp() const _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _CP& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _Pp& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _Key& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _CP& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Pp& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Key& __y) const + {return static_cast<const _Compare&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _CP& __y) const + {return static_cast<const _Compare&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return static_cast<const _Compare&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const + {return static_cast<const _Compare&>(*this)(__x, __y);} +}; + +template <class _Key, class _Tp, class _Compare> +class __map_value_compare<_Key, _Tp, _Compare, false> +{ + _Compare comp; + + typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _CP; + +public: + _LIBCPP_INLINE_VISIBILITY + __map_value_compare() + _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) + : comp() {} + _LIBCPP_INLINE_VISIBILITY + __map_value_compare(_Compare c) + _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) + : comp(c) {} + _LIBCPP_INLINE_VISIBILITY + const _Compare& key_comp() const _NOEXCEPT {return comp;} + + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _CP& __y) const + {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _Pp& __y) const + {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _CP& __x, const _Key& __y) const + {return comp(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _CP& __y) const + {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Pp& __y) const + {return comp(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Key& __y) const + {return comp(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _CP& __y) const + {return comp(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return comp(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const + {return comp(__x, __y);} +}; + +template <class _Allocator> +class __map_node_destructor +{ + typedef _Allocator allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::value_type::value_type value_type; +public: + typedef typename __alloc_traits::pointer pointer; +private: + typedef typename value_type::first_type first_type; + typedef typename value_type::second_type second_type; + + allocator_type& __na_; + + __map_node_destructor& operator=(const __map_node_destructor&); + +public: + bool __first_constructed; + bool __second_constructed; + + _LIBCPP_INLINE_VISIBILITY + explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT + : __na_(__na), + __first_constructed(false), + __second_constructed(false) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT + : __na_(__x.__na_), + __first_constructed(__x.__value_constructed), + __second_constructed(__x.__value_constructed) + { + __x.__value_constructed = false; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + if (__second_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second)); + if (__first_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } +}; + +template <class _Key, class _Tp, class _Compare, class _Allocator> + class map; +template <class _Key, class _Tp, class _Compare, class _Allocator> + class multimap; +template <class _TreeIterator> class __map_const_iterator; + +template <class _TreeIterator> +class _LIBCPP_VISIBLE __map_iterator +{ + _TreeIterator __i_; + + typedef typename _TreeIterator::__pointer_traits __pointer_traits; + typedef const typename _TreeIterator::value_type::first_type __key_type; + typedef typename _TreeIterator::value_type::second_type __mapped_type; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef pair<__key_type, __mapped_type> value_type; + typedef typename _TreeIterator::difference_type difference_type; + typedef value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __map_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY + __map_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __map_iterator operator++(int) + { + __map_iterator __t(*this); + ++(*this); + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + __map_iterator& operator--() {--__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __map_iterator operator--(int) + { + __map_iterator __t(*this); + --(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __map_iterator& __x, const __map_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __map_iterator& __x, const __map_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class> friend class _LIBCPP_VISIBLE map; + template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap; + template <class> friend class _LIBCPP_VISIBLE __map_const_iterator; +}; + +template <class _TreeIterator> +class _LIBCPP_VISIBLE __map_const_iterator +{ + _TreeIterator __i_; + + typedef typename _TreeIterator::__pointer_traits __pointer_traits; + typedef const typename _TreeIterator::value_type::first_type __key_type; + typedef typename _TreeIterator::value_type::second_type __mapped_type; +public: + typedef bidirectional_iterator_tag iterator_category; + typedef pair<__key_type, __mapped_type> value_type; + typedef typename _TreeIterator::difference_type difference_type; + typedef const value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator( + __map_iterator<typename _TreeIterator::__non_const_iterator> __i) + _NOEXCEPT + : __i_(__i.__i_) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator operator++(int) + { + __map_const_iterator __t(*this); + ++(*this); + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator& operator--() {--__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __map_const_iterator operator--(int) + { + __map_const_iterator __t(*this); + --(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class> friend class _LIBCPP_VISIBLE map; + template <class, class, class, class> friend class _LIBCPP_VISIBLE multimap; + template <class, class, class> friend class _LIBCPP_VISIBLE __tree_const_iterator; +}; + +template <class _Key, class _Tp, class _Compare = less<_Key>, + class _Allocator = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE map +{ +public: + // types: + typedef _Key key_type; + typedef _Tp mapped_type; + typedef pair<const key_type, mapped_type> value_type; + typedef _Compare key_compare; + typedef _Allocator allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + + class _LIBCPP_VISIBLE value_compare + : public binary_function<value_type, value_type, bool> + { + friend class map; + protected: + key_compare comp; + + _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} + public: + _LIBCPP_INLINE_VISIBILITY + bool operator()(const value_type& __x, const value_type& __y) const + {return comp(__x.first, __y.first);} + }; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __map_value_compare<key_type, mapped_type, key_compare> __vc; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + typedef __tree<__value_type, __vc, __allocator_type> __base; + typedef typename __base::__node_traits __node_traits; + typedef allocator_traits<allocator_type> __alloc_traits; + + __base __tree_; + +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + typedef __map_iterator<typename __base::iterator> iterator; + typedef __map_const_iterator<typename __base::const_iterator> const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + _LIBCPP_INLINE_VISIBILITY + explicit map(const key_compare& __comp = key_compare()) + _NOEXCEPT_( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value) + : __tree_(__vc(__comp)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit map(const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) {} + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + map(_InputIterator __f, _InputIterator __l, + const key_compare& __comp = key_compare()) + : __tree_(__vc(__comp)) + { + insert(__f, __l); + } + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + map(_InputIterator __f, _InputIterator __l, + const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) + { + insert(__f, __l); + } + + _LIBCPP_INLINE_VISIBILITY + map(const map& __m) + : __tree_(__m.__tree_) + { + insert(__m.begin(), __m.end()); + } + + _LIBCPP_INLINE_VISIBILITY + map& operator=(const map& __m) + { + __tree_ = __m.__tree_; + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + map(map&& __m) + _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) + : __tree_(_VSTD::move(__m.__tree_)) + { + } + + map(map&& __m, const allocator_type& __a); + + _LIBCPP_INLINE_VISIBILITY + map& operator=(map&& __m) + _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) + { + __tree_ = _VSTD::move(__m.__tree_); + return *this; + } + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) + : __tree_(__vc(__comp)) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + map& operator=(initializer_list<value_type> __il) + { + __tree_.__assign_unique(__il.begin(), __il.end()); + return *this; + } + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + explicit map(const allocator_type& __a) + : __tree_(__a) + { + } + + _LIBCPP_INLINE_VISIBILITY + map(const map& __m, const allocator_type& __a) + : __tree_(__m.__tree_.value_comp(), __a) + { + insert(__m.begin(), __m.end()); + } + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __tree_.end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT {return rend();} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __tree_.max_size();} + + mapped_type& operator[](const key_type& __k); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + mapped_type& operator[](key_type&& __k); +#endif + + mapped_type& at(const key_type& __k); + const mapped_type& at(const key_type& __k) const; + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY + key_compare key_comp() const {return __tree_.value_comp().key_comp();} + _LIBCPP_INLINE_VISIBILITY + value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> + emplace() {return __tree_.__emplace_unique();} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> + emplace(_A0&& __a0) + {return __tree_.__emplace_unique(_VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + pair<iterator, bool> + emplace(_A0&& __a0, _Args&& ...__args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + iterator + emplace_hint(const_iterator __p) + {return __tree_.__emplace_hint_unique(__p.__i_);} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator + emplace_hint(const_iterator __p, _A0&& __a0) + {return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + iterator + emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(_Pp&& __p) + {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} + + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __pos, _Pp&& __p) + {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> + insert(const value_type& __v) {return __tree_.__insert_unique(__v);} + + _LIBCPP_INLINE_VISIBILITY + iterator + insert(const_iterator __p, const value_type& __v) + {return __tree_.__insert_unique(__p.__i_, __v);} + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + void insert(_InputIterator __f, _InputIterator __l) + { + for (const_iterator __e = cend(); __f != __l; ++__f) + insert(__e.__i_, *__f); + } + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) + {return __tree_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __f, const_iterator __l) + {return __tree_.erase(__f.__i_, __l.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__tree_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(map& __m) + _NOEXCEPT_(__is_nothrow_swappable<__base>::value) + {__tree_.swap(__m.__tree_);} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const + {return __tree_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator lower_bound(const key_type& __k) + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator lower_bound(const key_type& __k) const + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator upper_bound(const key_type& __k) + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator upper_bound(const key_type& __k) const + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator,iterator> equal_range(const key_type& __k) + {return __tree_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator,const_iterator> equal_range(const key_type& __k) const + {return __tree_.__equal_range_unique(__k);} + +private: + typedef typename __base::__node __node; + typedef typename __base::__node_allocator __node_allocator; + typedef typename __base::__node_pointer __node_pointer; + typedef typename __base::__node_const_pointer __node_const_pointer; + typedef typename __base::__node_base_pointer __node_base_pointer; + typedef typename __base::__node_base_const_pointer __node_base_const_pointer; + typedef __map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __node_holder __construct_node(); + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0); +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0, _Args&& ...__args); +#endif // _LIBCPP_HAS_NO_VARIADICS +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + __node_holder __construct_node(const key_type& __k); +#endif + + __node_base_pointer& + __find_equal_key(__node_base_pointer& __parent, const key_type& __k); + __node_base_pointer& + __find_equal_key(const_iterator __hint, + __node_base_pointer& __parent, const key_type& __k); + __node_base_const_pointer + __find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const; +}; + +// Find place to insert if __k doesn't exist +// Set __parent to parent of null leaf +// Return reference to null leaf +// If __k exists, set parent to node of __k and return reference to node of __k +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer& +map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent, + const key_type& __k) +{ + __node_pointer __nd = __tree_.__root(); + if (__nd != nullptr) + { + while (true) + { + if (__tree_.value_comp().key_comp()(__k, __nd->__value_.first)) + { + if (__nd->__left_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__left_); + else + { + __parent = __nd; + return __parent->__left_; + } + } + else if (__tree_.value_comp().key_comp()(__nd->__value_.first, __k)) + { + if (__nd->__right_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__right_); + else + { + __parent = __nd; + return __parent->__right_; + } + } + else + { + __parent = __nd; + return __parent; + } + } + } + __parent = __tree_.__end_node(); + return __parent->__left_; +} + +// Find place to insert if __k doesn't exist +// First check prior to __hint. +// Next check after __hint. +// Next do O(log N) search. +// Set __parent to parent of null leaf +// Return reference to null leaf +// If __k exists, set parent to node of __k and return reference to node of __k +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer& +map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(const_iterator __hint, + __node_base_pointer& __parent, + const key_type& __k) +{ + if (__hint == end() || __tree_.value_comp().key_comp()(__k, __hint->first)) // check before + { + // __k < *__hint + const_iterator __prior = __hint; + if (__prior == begin() || __tree_.value_comp().key_comp()((--__prior)->first, __k)) + { + // *prev(__hint) < __k < *__hint + if (__hint.__ptr_->__left_ == nullptr) + { + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent->__left_; + } + else + { + __parent = const_cast<__node_pointer&>(__prior.__ptr_); + return __parent->__right_; + } + } + // __k <= *prev(__hint) + return __find_equal_key(__parent, __k); + } + else if (__tree_.value_comp().key_comp()(__hint->first, __k)) // check after + { + // *__hint < __k + const_iterator __next = _VSTD::next(__hint); + if (__next == end() || __tree_.value_comp().key_comp()(__k, __next->first)) + { + // *__hint < __k < *next(__hint) + if (__hint.__ptr_->__right_ == nullptr) + { + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent->__right_; + } + else + { + __parent = const_cast<__node_pointer&>(__next.__ptr_); + return __parent->__left_; + } + } + // *next(__hint) <= __k + return __find_equal_key(__parent, __k); + } + // else __k == *__hint + __parent = const_cast<__node_pointer&>(__hint.__ptr_); + return __parent; +} + +// Find __k +// Set __parent to parent of null leaf and +// return reference to null leaf iv __k does not exist. +// If __k exists, set parent to node of __k and return reference to node of __k +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_const_pointer +map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer& __parent, + const key_type& __k) const +{ + __node_const_pointer __nd = __tree_.__root(); + if (__nd != nullptr) + { + while (true) + { + if (__tree_.value_comp().key_comp()(__k, __nd->__value_.first)) + { + if (__nd->__left_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__left_); + else + { + __parent = __nd; + return const_cast<const __node_base_const_pointer&>(__parent->__left_); + } + } + else if (__tree_.value_comp().key_comp()(__nd->__value_.first, __k)) + { + if (__nd->__right_ != nullptr) + __nd = static_cast<__node_pointer>(__nd->__right_); + else + { + __parent = __nd; + return const_cast<const __node_base_const_pointer&>(__parent->__right_); + } + } + else + { + __parent = __nd; + return __parent; + } + } + } + __parent = __tree_.__end_node(); + return const_cast<const __node_base_const_pointer&>(__parent->__left_); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) + : __tree_(_VSTD::move(__m.__tree_), __a) +{ + if (__a != __m.get_allocator()) + { + const_iterator __e = cend(); + while (!__m.empty()) + __tree_.__insert_unique(__e.__i_, + _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); + } +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder +map<_Key, _Tp, _Compare, _Allocator>::__construct_node() +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __h.get_deleter().__second_constructed = true; + return __h; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, + class> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder +map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __h.get_deleter().__second_constructed = true; + return __h; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder +map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _Args&& ...__args) +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second), _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__second_constructed = true; + return __h; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder +map<_Key, _Tp, _Compare, _Allocator>::__construct_node(const key_type& __k) +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __h.get_deleter().__second_constructed = true; + return _VSTD::move(__h); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +_Tp& +map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal_key(__parent, __k); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) + { + __node_holder __h = __construct_node(__k); + __tree_.__insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + } + return __r->__value_.second; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +_Tp& +map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal_key(__parent, __k); + __node_pointer __r = static_cast<__node_pointer>(__child); + if (__child == nullptr) + { + __node_holder __h = __construct_node(_VSTD::move(__k)); + __tree_.__insert_node_at(__parent, __child, __h.get()); + __r = __h.release(); + } + return __r->__value_.second; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +_Tp& +map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) +{ + __node_base_pointer __parent; + __node_base_pointer& __child = __find_equal_key(__parent, __k); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__child == nullptr) + throw out_of_range("map::at: key not found"); +#endif // _LIBCPP_NO_EXCEPTIONS + return static_cast<__node_pointer>(__child)->__value_.second; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +const _Tp& +map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const +{ + __node_base_const_pointer __parent; + __node_base_const_pointer __child = __find_equal_key(__parent, __k); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__child == nullptr) + throw out_of_range("map::at: key not found"); +#endif // _LIBCPP_NO_EXCEPTIONS + return static_cast<__node_const_pointer>(__child)->__value_.second; +} + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type + > +pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool> +map<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + pair<iterator, bool> __r = __tree_.__node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type + > +typename map<_Key, _Tp, _Compare, _Allocator>::iterator +map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, + _A0&& __a0, _Args&& ...__args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + iterator __r = __tree_.__node_insert_unique(__p.__i_, __h.get()); + if (__r.__i_.__ptr_ == __h.get()) + __h.release(); + return __r; +} + +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, + const map<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__y < __x); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(map<_Key, _Tp, _Compare, _Allocator>& __x, + map<_Key, _Tp, _Compare, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Key, class _Tp, class _Compare = less<_Key>, + class _Allocator = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE multimap +{ +public: + // types: + typedef _Key key_type; + typedef _Tp mapped_type; + typedef pair<const key_type, mapped_type> value_type; + typedef _Compare key_compare; + typedef _Allocator allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + + class _LIBCPP_VISIBLE value_compare + : public binary_function<value_type, value_type, bool> + { + friend class multimap; + protected: + key_compare comp; + + _LIBCPP_INLINE_VISIBILITY + value_compare(key_compare c) : comp(c) {} + public: + _LIBCPP_INLINE_VISIBILITY + bool operator()(const value_type& __x, const value_type& __y) const + {return comp(__x.first, __y.first);} + }; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __map_value_compare<key_type, mapped_type, key_compare> __vc; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + typedef __tree<__value_type, __vc, __allocator_type> __base; + typedef typename __base::__node_traits __node_traits; + typedef allocator_traits<allocator_type> __alloc_traits; + + __base __tree_; + +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + typedef __map_iterator<typename __base::iterator> iterator; + typedef __map_const_iterator<typename __base::const_iterator> const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + _LIBCPP_INLINE_VISIBILITY + explicit multimap(const key_compare& __comp = key_compare()) + _NOEXCEPT_( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value) + : __tree_(__vc(__comp)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit multimap(const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) {} + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + multimap(_InputIterator __f, _InputIterator __l, + const key_compare& __comp = key_compare()) + : __tree_(__vc(__comp)) + { + insert(__f, __l); + } + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + multimap(_InputIterator __f, _InputIterator __l, + const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) + { + insert(__f, __l); + } + + _LIBCPP_INLINE_VISIBILITY + multimap(const multimap& __m) + : __tree_(__m.__tree_.value_comp(), + __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) + { + insert(__m.begin(), __m.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multimap& operator=(const multimap& __m) + { + __tree_ = __m.__tree_; + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + multimap(multimap&& __m) + _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) + : __tree_(_VSTD::move(__m.__tree_)) + { + } + + multimap(multimap&& __m, const allocator_type& __a); + + _LIBCPP_INLINE_VISIBILITY + multimap& operator=(multimap&& __m) + _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) + { + __tree_ = _VSTD::move(__m.__tree_); + return *this; + } + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) + : __tree_(__vc(__comp)) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) + : __tree_(__vc(__comp), __a) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multimap& operator=(initializer_list<value_type> __il) + { + __tree_.__assign_multi(__il.begin(), __il.end()); + return *this; + } + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + explicit multimap(const allocator_type& __a) + : __tree_(__a) + { + } + + _LIBCPP_INLINE_VISIBILITY + multimap(const multimap& __m, const allocator_type& __a) + : __tree_(__m.__tree_.value_comp(), __a) + { + insert(__m.begin(), __m.end()); + } + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __tree_.end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT {return rend();} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __tree_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY + key_compare key_comp() const {return __tree_.value_comp().key_comp();} + _LIBCPP_INLINE_VISIBILITY + value_compare value_comp() const + {return value_compare(__tree_.value_comp().key_comp());} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + iterator emplace() {return __tree_.__emplace_multi();} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator + emplace(_A0&& __a0) + {return __tree_.__emplace_multi(_VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + iterator + emplace(_A0&& __a0, _Args&& ...__args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p) + {return __tree_.__emplace_hint_multi(__p.__i_);} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator + emplace_hint(const_iterator __p, _A0&& __a0) + {return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + iterator + emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(_Pp&& __p) + {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} + + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __pos, _Pp&& __p) + {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} + + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, const value_type& __v) + {return __tree_.__insert_multi(__p.__i_, __v);} + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + void insert(_InputIterator __f, _InputIterator __l) + { + for (const_iterator __e = cend(); __f != __l; ++__f) + __tree_.__insert_multi(__e.__i_, *__f); + } + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __f, const_iterator __l) + {return __tree_.erase(__f.__i_, __l.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() {__tree_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(multimap& __m) + _NOEXCEPT_(__is_nothrow_swappable<__base>::value) + {__tree_.swap(__m.__tree_);} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const + {return __tree_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator lower_bound(const key_type& __k) + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator lower_bound(const key_type& __k) const + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator upper_bound(const key_type& __k) + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator upper_bound(const key_type& __k) const + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator,iterator> equal_range(const key_type& __k) + {return __tree_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator,const_iterator> equal_range(const key_type& __k) const + {return __tree_.__equal_range_multi(__k);} + +private: + typedef typename __base::__node __node; + typedef typename __base::__node_allocator __node_allocator; + typedef typename __base::__node_pointer __node_pointer; + typedef typename __base::__node_const_pointer __node_const_pointer; + typedef __map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __node_holder __construct_node(); + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0); +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _A0, class ..._Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0, _Args&& ...__args); +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Compare, class _Allocator> +multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) + : __tree_(_VSTD::move(__m.__tree_), __a) +{ + if (__a != __m.get_allocator()) + { + const_iterator __e = cend(); + while (!__m.empty()) + __tree_.__insert_multi(__e.__i_, + _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); + } +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder +multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node() +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __h.get_deleter().__second_constructed = true; + return __h; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, + class // = typename enable_if<is_constructible<value_type, _A0>::value>::type + > +typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder +multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __h.get_deleter().__second_constructed = true; + return __h; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder +multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _Args&& ...__args) +{ + __node_allocator& __na = __tree_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second), _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__second_constructed = true; + return __h; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type + > +typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator +multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + iterator __r = __tree_.__node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +template <class _A0, class ..._Args, + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type + > +typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator +multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, + _A0&& __a0, + _Args&& ...__args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + iterator __r = __tree_.__node_insert_multi(__p.__i_, __h.get()); + __h.release(); + return __r; +} + +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, + const multimap<_Key, _Tp, _Compare, _Allocator>& __y) +{ + return !(__y < __x); +} + +template <class _Key, class _Tp, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, + multimap<_Key, _Tp, _Compare, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_MAP diff --git a/contrib/libc++/include/memory b/contrib/libc++/include/memory new file mode 100644 index 0000000..aa24f96 --- /dev/null +++ b/contrib/libc++/include/memory @@ -0,0 +1,5294 @@ +// -*- C++ -*- +//===-------------------------- memory ------------------------------------===// +// +// 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_MEMORY +#define _LIBCPP_MEMORY + +/* + memory synopsis + +namespace std +{ + +struct allocator_arg_t { }; +constexpr allocator_arg_t allocator_arg = allocator_arg_t(); + +template <class T, class Alloc> struct uses_allocator; + +template <class Ptr> +struct pointer_traits +{ + typedef Ptr pointer; + typedef <details> element_type; + typedef <details> difference_type; + + template <class U> using rebind = <details>; + + static pointer pointer_to(<details>); +}; + +template <class T> +struct pointer_traits<T*> +{ + typedef T* pointer; + typedef T element_type; + typedef ptrdiff_t difference_type; + + template <class U> using rebind = U*; + + static pointer pointer_to(<details>) noexcept; +}; + +template <class Alloc> +struct allocator_traits +{ + typedef Alloc allocator_type; + typedef typename allocator_type::value_type + value_type; + + typedef Alloc::pointer | value_type* pointer; + typedef Alloc::const_pointer + | pointer_traits<pointer>::rebind<const value_type> + const_pointer; + typedef Alloc::void_pointer + | pointer_traits<pointer>::rebind<void> + void_pointer; + typedef Alloc::const_void_pointer + | pointer_traits<pointer>::rebind<const void> + const_void_pointer; + typedef Alloc::difference_type + | pointer_traits<pointer>::difference_type + difference_type; + typedef Alloc::size_type + | make_unsigned<difference_type>::type + size_type; + typedef Alloc::propagate_on_container_copy_assignment + | false_type propagate_on_container_copy_assignment; + typedef Alloc::propagate_on_container_move_assignment + | false_type propagate_on_container_move_assignment; + typedef Alloc::propagate_on_container_swap + | false_type propagate_on_container_swap; + + template <class T> using rebind_alloc = Alloc::rebind<U>::other | Alloc<T, Args...>; + template <class T> using rebind_traits = allocator_traits<rebind_alloc<T>>; + + static pointer allocate(allocator_type& a, size_type n); + static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); + + static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; + + template <class T, class... Args> + static void construct(allocator_type& a, T* p, Args&&... args); + + template <class T> + static void destroy(allocator_type& a, T* p); + + static size_type max_size(const allocator_type& a); + + static allocator_type + select_on_container_copy_construction(const allocator_type& a); +}; + +template <> +class allocator<void> +{ +public: + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template <class _Up> struct rebind {typedef allocator<_Up> other;}; +}; + +template <class T> +class allocator +{ +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef typename add_lvalue_reference<T>::type reference; + typedef typename add_lvalue_reference<const T>::type const_reference; + typedef T value_type; + + template <class U> struct rebind {typedef allocator<U> other;}; + + allocator() noexcept; + allocator(const allocator&) noexcept; + template <class U> allocator(const allocator<U>&) noexcept; + ~allocator(); + pointer address(reference x) const noexcept; + const_pointer address(const_reference x) const noexcept; + pointer allocate(size_type, allocator<void>::const_pointer hint = 0); + void deallocate(pointer p, size_type n) noexcept; + size_type max_size() const noexcept; + template<class U, class... Args> + void construct(U* p, Args&&... args); + template <class U> + void destroy(U* p); +}; + +template <class T, class U> +bool operator==(const allocator<T>&, const allocator<U>&) noexcept; + +template <class T, class U> +bool operator!=(const allocator<T>&, const allocator<U>&) noexcept; + +template <class OutputIterator, class T> +class raw_storage_iterator + : public iterator<output_iterator_tag, + T, // purposefully not C++03 + ptrdiff_t, // purposefully not C++03 + T*, // purposefully not C++03 + raw_storage_iterator&> // purposefully not C++03 +{ +public: + explicit raw_storage_iterator(OutputIterator x); + raw_storage_iterator& operator*(); + raw_storage_iterator& operator=(const T& element); + raw_storage_iterator& operator++(); + raw_storage_iterator operator++(int); +}; + +template <class T> pair<T*,ptrdiff_t> get_temporary_buffer(ptrdiff_t n) noexcept; +template <class T> void return_temporary_buffer(T* p) noexcept; + +template <class T> T* addressof(T& r) noexcept; + +template <class InputIterator, class ForwardIterator> +ForwardIterator +uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result); + +template <class InputIterator, class Size, class ForwardIterator> +ForwardIterator +uninitialized_copy_n(InputIterator first, Size n, ForwardIterator result); + +template <class ForwardIterator, class T> +void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& x); + +template <class ForwardIterator, class Size, class T> +ForwardIterator +uninitialized_fill_n(ForwardIterator first, Size n, const T& x); + +template <class Y> struct auto_ptr_ref {}; + +template<class X> +class auto_ptr +{ +public: + typedef X element_type; + + explicit auto_ptr(X* p =0) throw(); + auto_ptr(auto_ptr&) throw(); + template<class Y> auto_ptr(auto_ptr<Y>&) throw(); + auto_ptr& operator=(auto_ptr&) throw(); + template<class Y> auto_ptr& operator=(auto_ptr<Y>&) throw(); + auto_ptr& operator=(auto_ptr_ref<X> r) throw(); + ~auto_ptr() throw(); + + typename add_lvalue_reference<X>::type operator*() const throw(); + X* operator->() const throw(); + X* get() const throw(); + X* release() throw(); + void reset(X* p =0) throw(); + + auto_ptr(auto_ptr_ref<X>) throw(); + template<class Y> operator auto_ptr_ref<Y>() throw(); + template<class Y> operator auto_ptr<Y>() throw(); +}; + +template <class T> +struct default_delete +{ + constexpr default_delete() noexcept = default; + template <class U> default_delete(const default_delete<U>&) noexcept; + + void operator()(T*) const noexcept; +}; + +template <class T> +struct default_delete<T[]> +{ + constexpr default_delete() noexcept = default; + void operator()(T*) const noexcept; + template <class U> void operator()(U*) const = delete; +}; + +template <class T, class D = default_delete<T>> +class unique_ptr +{ +public: + typedef see below pointer; + typedef T element_type; + typedef D deleter_type; + + // constructors + constexpr unique_ptr() noexcept; + explicit unique_ptr(pointer p) noexcept; + unique_ptr(pointer p, see below d1) noexcept; + unique_ptr(pointer p, see below d2) noexcept; + unique_ptr(unique_ptr&& u) noexcept; + unique_ptr(nullptr_t) noexcept : unique_ptr() { } + template <class U, class E> + unique_ptr(unique_ptr<U, E>&& u) noexcept; + template <class U> + unique_ptr(auto_ptr<U>&& u) noexcept; + + // destructor + ~unique_ptr(); + + // assignment + unique_ptr& operator=(unique_ptr&& u) noexcept; + template <class U, class E> unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept; + unique_ptr& operator=(nullptr_t) noexcept; + + // observers + typename add_lvalue_reference<T>::type operator*() const; + pointer operator->() const noexcept; + pointer get() const noexcept; + deleter_type& get_deleter() noexcept; + const deleter_type& get_deleter() const noexcept; + explicit operator bool() const noexcept; + + // modifiers + pointer release() noexcept; + void reset(pointer p = pointer()) noexcept; + void swap(unique_ptr& u) noexcept; +}; + +template <class T, class D> +class unique_ptr<T[], D> +{ +public: + typedef implementation-defined pointer; + typedef T element_type; + typedef D deleter_type; + + // constructors + constexpr unique_ptr() noexcept; + explicit unique_ptr(pointer p) noexcept; + unique_ptr(pointer p, see below d) noexcept; + unique_ptr(pointer p, see below d) noexcept; + unique_ptr(unique_ptr&& u) noexcept; + unique_ptr(nullptr_t) noexcept : unique_ptr() { } + + // destructor + ~unique_ptr(); + + // assignment + unique_ptr& operator=(unique_ptr&& u) noexcept; + unique_ptr& operator=(nullptr_t) noexcept; + + // observers + T& operator[](size_t i) const; + pointer get() const noexcept; + deleter_type& get_deleter() noexcept; + const deleter_type& get_deleter() const noexcept; + explicit operator bool() const noexcept; + + // modifiers + pointer release() noexcept; + void reset(pointer p = pointer()) noexcept; + void reset(nullptr_t) noexcept; + template <class U> void reset(U) = delete; + void swap(unique_ptr& u) noexcept; +}; + +template <class T, class D> + void swap(unique_ptr<T, D>& x, unique_ptr<T, D>& y) noexcept; + +template <class T1, class D1, class T2, class D2> + bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); +template <class T1, class D1, class T2, class D2> + bool operator!=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); +template <class T1, class D1, class T2, class D2> + bool operator<(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); +template <class T1, class D1, class T2, class D2> + bool operator<=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); +template <class T1, class D1, class T2, class D2> + bool operator>(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); +template <class T1, class D1, class T2, class D2> + bool operator>=(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y); + +template <class T, class D> + bool operator==(const unique_ptr<T, D>& x, nullptr_t) noexcept; +template <class T, class D> + bool operator==(nullptr_t, const unique_ptr<T, D>& y) noexcept; +template <class T, class D> + bool operator!=(const unique_ptr<T, D>& x, nullptr_t) noexcept; +template <class T, class D> + bool operator!=(nullptr_t, const unique_ptr<T, D>& y) noexcept; + +template <class T, class D> + bool operator<(const unique_ptr<T, D>& x, nullptr_t); +template <class T, class D> + bool operator<(nullptr_t, const unique_ptr<T, D>& y); +template <class T, class D> + bool operator<=(const unique_ptr<T, D>& x, nullptr_t); +template <class T, class D> + bool operator<=(nullptr_t, const unique_ptr<T, D>& y); +template <class T, class D> + bool operator>(const unique_ptr<T, D>& x, nullptr_t); +template <class T, class D> + bool operator>(nullptr_t, const unique_ptr<T, D>& y); +template <class T, class D> + bool operator>=(const unique_ptr<T, D>& x, nullptr_t); +template <class T, class D> + bool operator>=(nullptr_t, const unique_ptr<T, D>& y); + +class bad_weak_ptr + : public std::exception +{ + bad_weak_ptr() noexcept; +}; + +template<class T> +class shared_ptr +{ +public: + typedef T element_type; + + // constructors: + constexpr shared_ptr() noexcept; + template<class Y> explicit shared_ptr(Y* p); + template<class Y, class D> shared_ptr(Y* p, D d); + template<class Y, class D, class A> shared_ptr(Y* p, D d, A a); + template <class D> shared_ptr(nullptr_t p, D d); + template <class D, class A> shared_ptr(nullptr_t p, D d, A a); + template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; + shared_ptr(const shared_ptr& r) noexcept; + template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; + shared_ptr(shared_ptr&& r) noexcept; + template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept; + template<class Y> explicit shared_ptr(const weak_ptr<Y>& r); + template<class Y> shared_ptr(auto_ptr<Y>&& r); + template <class Y, class D> shared_ptr(unique_ptr<Y, D>&& r); + shared_ptr(nullptr_t) : shared_ptr() { } + + // destructor: + ~shared_ptr(); + + // assignment: + shared_ptr& operator=(const shared_ptr& r) noexcept; + template<class Y> shared_ptr& operator=(const shared_ptr<Y>& r) noexcept; + shared_ptr& operator=(shared_ptr&& r) noexcept; + template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r); + template<class Y> shared_ptr& operator=(auto_ptr<Y>&& r); + template <class Y, class D> shared_ptr& operator=(unique_ptr<Y, D>&& r); + + // modifiers: + void swap(shared_ptr& r) noexcept; + void reset() noexcept; + template<class Y> void reset(Y* p); + template<class Y, class D> void reset(Y* p, D d); + template<class Y, class D, class A> void reset(Y* p, D d, A a); + + // observers: + T* get() const noexcept; + T& operator*() const noexcept; + T* operator->() const noexcept; + long use_count() const noexcept; + bool unique() const noexcept; + explicit operator bool() const noexcept; + template<class U> bool owner_before(shared_ptr<U> const& b) const; + template<class U> bool owner_before(weak_ptr<U> const& b) const; +}; + +// shared_ptr comparisons: +template<class T, class U> + bool operator==(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; +template<class T, class U> + bool operator!=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; +template<class T, class U> + bool operator<(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; +template<class T, class U> + bool operator>(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; +template<class T, class U> + bool operator<=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; +template<class T, class U> + bool operator>=(shared_ptr<T> const& a, shared_ptr<U> const& b) noexcept; + +template <class T> + bool operator==(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> + bool operator==(nullptr_t, const shared_ptr<T>& y) noexcept; +template <class T> + bool operator!=(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> + bool operator!=(nullptr_t, const shared_ptr<T>& y) noexcept; +template <class T> + bool operator<(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> +bool operator<(nullptr_t, const shared_ptr<T>& y) noexcept; +template <class T> + bool operator<=(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> + bool operator<=(nullptr_t, const shared_ptr<T>& y) noexcept; +template <class T> + bool operator>(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> + bool operator>(nullptr_t, const shared_ptr<T>& y) noexcept; +template <class T> + bool operator>=(const shared_ptr<T>& x, nullptr_t) noexcept; +template <class T> + bool operator>=(nullptr_t, const shared_ptr<T>& y) noexcept; + +// shared_ptr specialized algorithms: +template<class T> void swap(shared_ptr<T>& a, shared_ptr<T>& b) noexcept; + +// shared_ptr casts: +template<class T, class U> + shared_ptr<T> static_pointer_cast(shared_ptr<U> const& r) noexcept; +template<class T, class U> + shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const& r) noexcept; +template<class T, class U> + shared_ptr<T> const_pointer_cast(shared_ptr<U> const& r) noexcept; + +// shared_ptr I/O: +template<class E, class T, class Y> + basic_ostream<E, T>& operator<< (basic_ostream<E, T>& os, shared_ptr<Y> const& p); + +// shared_ptr get_deleter: +template<class D, class T> D* get_deleter(shared_ptr<T> const& p) noexcept; + +template<class T, class... Args> + shared_ptr<T> make_shared(Args&&... args); +template<class T, class A, class... Args> + shared_ptr<T> allocate_shared(const A& a, Args&&... args); + +template<class T> +class weak_ptr +{ +public: + typedef T element_type; + + // constructors + constexpr weak_ptr() noexcept; + template<class Y> weak_ptr(shared_ptr<Y> const& r) noexcept; + weak_ptr(weak_ptr const& r) noexcept; + template<class Y> weak_ptr(weak_ptr<Y> const& r) noexcept; + + // destructor + ~weak_ptr(); + + // assignment + weak_ptr& operator=(weak_ptr const& r) noexcept; + template<class Y> weak_ptr& operator=(weak_ptr<Y> const& r) noexcept; + template<class Y> weak_ptr& operator=(shared_ptr<Y> const& r) noexcept; + + // modifiers + void swap(weak_ptr& r) noexcept; + void reset() noexcept; + + // observers + long use_count() const noexcept; + bool expired() const noexcept; + shared_ptr<T> lock() const noexcept; + template<class U> bool owner_before(shared_ptr<U> const& b); + template<class U> bool owner_before(weak_ptr<U> const& b); +}; + +// weak_ptr specialized algorithms: +template<class T> void swap(weak_ptr<T>& a, weak_ptr<T>& b) noexcept; + +// class owner_less: +template<class T> struct owner_less; + +template<class T> +struct owner_less<shared_ptr<T>> + : binary_function<shared_ptr<T>, shared_ptr<T>, bool> +{ + typedef bool result_type; + bool operator()(shared_ptr<T> const&, shared_ptr<T> const&) const; + bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; + bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; +}; + +template<class T> +struct owner_less<weak_ptr<T>> + : binary_function<weak_ptr<T>, weak_ptr<T>, bool> +{ + typedef bool result_type; + bool operator()(weak_ptr<T> const&, weak_ptr<T> const&) const; + bool operator()(shared_ptr<T> const&, weak_ptr<T> const&) const; + bool operator()(weak_ptr<T> const&, shared_ptr<T> const&) const; +}; + +template<class T> +class enable_shared_from_this +{ +protected: + constexpr enable_shared_from_this() noexcept; + enable_shared_from_this(enable_shared_from_this const&) noexcept; + enable_shared_from_this& operator=(enable_shared_from_this const&) noexcept; + ~enable_shared_from_this(); +public: + shared_ptr<T> shared_from_this(); + shared_ptr<T const> shared_from_this() const; +}; + +template<class T> + bool atomic_is_lock_free(const shared_ptr<T>* p); +template<class T> + shared_ptr<T> atomic_load(const shared_ptr<T>* p); +template<class T> + shared_ptr<T> atomic_load_explicit(const shared_ptr<T>* p, memory_order mo); +template<class T> + void atomic_store(shared_ptr<T>* p, shared_ptr<T> r); +template<class T> + void atomic_store_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); +template<class T> + shared_ptr<T> atomic_exchange(shared_ptr<T>* p, shared_ptr<T> r); +template<class T> + shared_ptr<T> + atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r, memory_order mo); +template<class T> + bool + atomic_compare_exchange_weak(shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); +template<class T> + bool + atomic_compare_exchange_strong( shared_ptr<T>* p, shared_ptr<T>* v, shared_ptr<T> w); +template<class T> + bool + atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v, + shared_ptr<T> w, memory_order success, + memory_order failure); +template<class T> + bool + atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v, + shared_ptr<T> w, memory_order success, + memory_order failure); +// Hash support +template <class T> struct hash; +template <class T, class D> struct hash<unique_ptr<T, D> >; +template <class T> struct hash<shared_ptr<T> >; + +// Pointer safety +enum class pointer_safety { relaxed, preferred, strict }; +void declare_reachable(void *p); +template <class T> T *undeclare_reachable(T *p); +void declare_no_pointers(char *p, size_t n); +void undeclare_no_pointers(char *p, size_t n); +pointer_safety get_pointer_safety() noexcept; + +void* align(size_t alignment, size_t size, void*& ptr, size_t& space); + +} // std + +*/ + +#include <__config> +#include <type_traits> +#include <typeinfo> +#include <cstddef> +#include <cstdint> +#include <new> +#include <utility> +#include <limits> +#include <iterator> +#include <__functional_base> +#include <iosfwd> +#include <tuple> +#include <cstring> +#if defined(_LIBCPP_NO_EXCEPTIONS) + #include <cassert> +#endif + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// addressof + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +addressof(_Tp& __x) _NOEXCEPT +{ + return (_Tp*)&(char&)__x; +} + +#if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF) +// Objective-C++ Automatic Reference Counting uses qualified pointers +// that require special addressof() signatures. When +// _LIBCPP_PREDEFINED_OBJC_ARC_ADDRESSOF is defined, the compiler +// itself is providing these definitions. Otherwise, we provide them. +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__strong _Tp* +addressof(__strong _Tp& __x) _NOEXCEPT +{ + return &__x; +} + +#ifdef _LIBCPP_HAS_OBJC_ARC_WEAK +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__weak _Tp* +addressof(__weak _Tp& __x) _NOEXCEPT +{ + return &__x; +} +#endif + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__autoreleasing _Tp* +addressof(__autoreleasing _Tp& __x) _NOEXCEPT +{ + return &__x; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__unsafe_unretained _Tp* +addressof(__unsafe_unretained _Tp& __x) _NOEXCEPT +{ + return &__x; +} +#endif + +template <class _Tp> class allocator; + +template <> +class _LIBCPP_VISIBLE allocator<void> +{ +public: + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; + + template <class _Up> struct rebind {typedef allocator<_Up> other;}; +}; + +template <> +class _LIBCPP_VISIBLE allocator<const void> +{ +public: + typedef const void* pointer; + typedef const void* const_pointer; + typedef const void value_type; + + template <class _Up> struct rebind {typedef allocator<_Up> other;}; +}; + +// pointer_traits + +template <class _Tp> +struct __has_element_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::element_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Ptr, bool = __has_element_type<_Ptr>::value> +struct __pointer_traits_element_type; + +template <class _Ptr> +struct __pointer_traits_element_type<_Ptr, true> +{ + typedef typename _Ptr::element_type type; +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <template <class, class...> class _Sp, class _Tp, class ..._Args> +struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, true> +{ + typedef typename _Sp<_Tp, _Args...>::element_type type; +}; + +template <template <class, class...> class _Sp, class _Tp, class ..._Args> +struct __pointer_traits_element_type<_Sp<_Tp, _Args...>, false> +{ + typedef _Tp type; +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <template <class> class _Sp, class _Tp> +struct __pointer_traits_element_type<_Sp<_Tp>, true> +{ + typedef typename _Sp<_Tp>::element_type type; +}; + +template <template <class> class _Sp, class _Tp> +struct __pointer_traits_element_type<_Sp<_Tp>, false> +{ + typedef _Tp type; +}; + +template <template <class, class> class _Sp, class _Tp, class _A0> +struct __pointer_traits_element_type<_Sp<_Tp, _A0>, true> +{ + typedef typename _Sp<_Tp, _A0>::element_type type; +}; + +template <template <class, class> class _Sp, class _Tp, class _A0> +struct __pointer_traits_element_type<_Sp<_Tp, _A0>, false> +{ + typedef _Tp type; +}; + +template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> +struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, true> +{ + typedef typename _Sp<_Tp, _A0, _A1>::element_type type; +}; + +template <template <class, class, class> class _Sp, class _Tp, class _A0, class _A1> +struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1>, false> +{ + typedef _Tp type; +}; + +template <template <class, class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _A2> +struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, true> +{ + typedef typename _Sp<_Tp, _A0, _A1, _A2>::element_type type; +}; + +template <template <class, class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _A2> +struct __pointer_traits_element_type<_Sp<_Tp, _A0, _A1, _A2>, false> +{ + typedef _Tp type; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp> +struct __has_difference_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::difference_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Ptr, bool = __has_difference_type<_Ptr>::value> +struct __pointer_traits_difference_type +{ + typedef ptrdiff_t type; +}; + +template <class _Ptr> +struct __pointer_traits_difference_type<_Ptr, true> +{ + typedef typename _Ptr::difference_type type; +}; + +template <class _Tp, class _Up> +struct __has_rebind +{ +private: + struct __two {char _; char __;}; + template <class _Xp> static __two __test(...); + template <class _Xp> static char __test(typename _Xp::template rebind<_Up>* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> +struct __pointer_traits_rebind +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Tp::template rebind<_Up> type; +#else + typedef typename _Tp::template rebind<_Up>::other type; +#endif +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, true> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Sp<_Tp, _Args...>::template rebind<_Up> type; +#else + typedef typename _Sp<_Tp, _Args...>::template rebind<_Up>::other type; +#endif +}; + +template <template <class, class...> class _Sp, class _Tp, class ..._Args, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> +{ + typedef _Sp<_Up, _Args...> type; +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <template <class> class _Sp, class _Tp, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp>, _Up, true> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Sp<_Tp>::template rebind<_Up> type; +#else + typedef typename _Sp<_Tp>::template rebind<_Up>::other type; +#endif +}; + +template <template <class> class _Sp, class _Tp, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp>, _Up, false> +{ + typedef _Sp<_Up> type; +}; + +template <template <class, class> class _Sp, class _Tp, class _A0, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, true> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Sp<_Tp, _A0>::template rebind<_Up> type; +#else + typedef typename _Sp<_Tp, _A0>::template rebind<_Up>::other type; +#endif +}; + +template <template <class, class> class _Sp, class _Tp, class _A0, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0>, _Up, false> +{ + typedef _Sp<_Up, _A0> type; +}; + +template <template <class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, true> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up> type; +#else + typedef typename _Sp<_Tp, _A0, _A1>::template rebind<_Up>::other type; +#endif +}; + +template <template <class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1>, _Up, false> +{ + typedef _Sp<_Up, _A0, _A1> type; +}; + +template <template <class, class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _A2, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, true> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up> type; +#else + typedef typename _Sp<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; +#endif +}; + +template <template <class, class, class, class> class _Sp, class _Tp, class _A0, + class _A1, class _A2, class _Up> +struct __pointer_traits_rebind<_Sp<_Tp, _A0, _A1, _A2>, _Up, false> +{ + typedef _Sp<_Up, _A0, _A1, _A2> type; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Ptr> +struct _LIBCPP_VISIBLE pointer_traits +{ + typedef _Ptr pointer; + typedef typename __pointer_traits_element_type<pointer>::type element_type; + typedef typename __pointer_traits_difference_type<pointer>::type difference_type; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; +#else + template <class _Up> struct rebind + {typedef typename __pointer_traits_rebind<pointer, _Up>::type other;}; +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +private: + struct __nat {}; +public: + _LIBCPP_INLINE_VISIBILITY + static pointer pointer_to(typename conditional<is_void<element_type>::value, + __nat, element_type>::type& __r) + {return pointer::pointer_to(__r);} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE pointer_traits<_Tp*> +{ + typedef _Tp* pointer; + typedef _Tp element_type; + typedef ptrdiff_t difference_type; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + template <class _Up> using rebind = _Up*; +#else + template <class _Up> struct rebind {typedef _Up* other;}; +#endif + +private: + struct __nat {}; +public: + _LIBCPP_INLINE_VISIBILITY + static pointer pointer_to(typename conditional<is_void<element_type>::value, + __nat, element_type>::type& __r) _NOEXCEPT + {return _VSTD::addressof(__r);} +}; + +// allocator_traits + +namespace __has_pointer_type_imp +{ + template <class _Up> static __two test(...); + template <class _Up> static char test(typename _Up::pointer* = 0); +} + +template <class _Tp> +struct __has_pointer_type + : public integral_constant<bool, sizeof(__has_pointer_type_imp::test<_Tp>(0)) == 1> +{ +}; + +namespace __pointer_type_imp +{ + +template <class _Tp, class _Dp, bool = __has_pointer_type<_Dp>::value> +struct __pointer_type +{ + typedef typename _Dp::pointer type; +}; + +template <class _Tp, class _Dp> +struct __pointer_type<_Tp, _Dp, false> +{ + typedef _Tp* type; +}; + +} // __pointer_type_imp + +template <class _Tp, class _Dp> +struct __pointer_type +{ + typedef typename __pointer_type_imp::__pointer_type<_Tp, typename remove_reference<_Dp>::type>::type type; +}; + +template <class _Tp> +struct __has_const_pointer +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::const_pointer* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Tp, class _Ptr, class _Alloc, bool = __has_const_pointer<_Alloc>::value> +struct __const_pointer +{ + typedef typename _Alloc::const_pointer type; +}; + +template <class _Tp, class _Ptr, class _Alloc> +struct __const_pointer<_Tp, _Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename pointer_traits<_Ptr>::template rebind<const _Tp> type; +#else + typedef typename pointer_traits<_Ptr>::template rebind<const _Tp>::other type; +#endif +}; + +template <class _Tp> +struct __has_void_pointer +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::void_pointer* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Ptr, class _Alloc, bool = __has_void_pointer<_Alloc>::value> +struct __void_pointer +{ + typedef typename _Alloc::void_pointer type; +}; + +template <class _Ptr, class _Alloc> +struct __void_pointer<_Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename pointer_traits<_Ptr>::template rebind<void> type; +#else + typedef typename pointer_traits<_Ptr>::template rebind<void>::other type; +#endif +}; + +template <class _Tp> +struct __has_const_void_pointer +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::const_void_pointer* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Ptr, class _Alloc, bool = __has_const_void_pointer<_Alloc>::value> +struct __const_void_pointer +{ + typedef typename _Alloc::const_void_pointer type; +}; + +template <class _Ptr, class _Alloc> +struct __const_void_pointer<_Ptr, _Alloc, false> +{ +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + typedef typename pointer_traits<_Ptr>::template rebind<const void> type; +#else + typedef typename pointer_traits<_Ptr>::template rebind<const void>::other type; +#endif +}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +__to_raw_pointer(_Tp* __p) _NOEXCEPT +{ + return __p; +} + +template <class _Pointer> +inline _LIBCPP_INLINE_VISIBILITY +typename pointer_traits<_Pointer>::element_type* +__to_raw_pointer(_Pointer __p) _NOEXCEPT +{ + return _VSTD::__to_raw_pointer(__p.operator->()); +} + +template <class _Tp> +struct __has_size_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::size_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Alloc, class _DiffType, bool = __has_size_type<_Alloc>::value> +struct __size_type +{ + typedef typename make_unsigned<_DiffType>::type type; +}; + +template <class _Alloc, class _DiffType> +struct __size_type<_Alloc, _DiffType, true> +{ + typedef typename _Alloc::size_type type; +}; + +template <class _Tp> +struct __has_propagate_on_container_copy_assignment +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::propagate_on_container_copy_assignment* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Alloc, bool = __has_propagate_on_container_copy_assignment<_Alloc>::value> +struct __propagate_on_container_copy_assignment +{ + typedef false_type type; +}; + +template <class _Alloc> +struct __propagate_on_container_copy_assignment<_Alloc, true> +{ + typedef typename _Alloc::propagate_on_container_copy_assignment type; +}; + +template <class _Tp> +struct __has_propagate_on_container_move_assignment +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::propagate_on_container_move_assignment* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Alloc, bool = __has_propagate_on_container_move_assignment<_Alloc>::value> +struct __propagate_on_container_move_assignment +{ + typedef false_type type; +}; + +template <class _Alloc> +struct __propagate_on_container_move_assignment<_Alloc, true> +{ + typedef typename _Alloc::propagate_on_container_move_assignment type; +}; + +template <class _Tp> +struct __has_propagate_on_container_swap +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::propagate_on_container_swap* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Alloc, bool = __has_propagate_on_container_swap<_Alloc>::value> +struct __propagate_on_container_swap +{ + typedef false_type type; +}; + +template <class _Alloc> +struct __propagate_on_container_swap<_Alloc, true> +{ + typedef typename _Alloc::propagate_on_container_swap type; +}; + +template <class _Tp, class _Up, bool = __has_rebind<_Tp, _Up>::value> +struct __has_rebind_other +{ +private: + struct __two {char _; char __;}; + template <class _Xp> static __two __test(...); + template <class _Xp> static char __test(typename _Xp::template rebind<_Up>::other* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Tp, class _Up> +struct __has_rebind_other<_Tp, _Up, false> +{ + static const bool value = false; +}; + +template <class _Tp, class _Up, bool = __has_rebind_other<_Tp, _Up>::value> +struct __allocator_traits_rebind +{ + typedef typename _Tp::template rebind<_Up>::other type; +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, true> +{ + typedef typename _Alloc<_Tp, _Args...>::template rebind<_Up>::other type; +}; + +template <template <class, class...> class _Alloc, class _Tp, class ..._Args, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _Args...>, _Up, false> +{ + typedef _Alloc<_Up, _Args...> type; +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <template <class> class _Alloc, class _Tp, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, true> +{ + typedef typename _Alloc<_Tp>::template rebind<_Up>::other type; +}; + +template <template <class> class _Alloc, class _Tp, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp>, _Up, false> +{ + typedef _Alloc<_Up> type; +}; + +template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, true> +{ + typedef typename _Alloc<_Tp, _A0>::template rebind<_Up>::other type; +}; + +template <template <class, class> class _Alloc, class _Tp, class _A0, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0>, _Up, false> +{ + typedef _Alloc<_Up, _A0> type; +}; + +template <template <class, class, class> class _Alloc, class _Tp, class _A0, + class _A1, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, true> +{ + typedef typename _Alloc<_Tp, _A0, _A1>::template rebind<_Up>::other type; +}; + +template <template <class, class, class> class _Alloc, class _Tp, class _A0, + class _A1, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1>, _Up, false> +{ + typedef _Alloc<_Up, _A0, _A1> type; +}; + +template <template <class, class, class, class> class _Alloc, class _Tp, class _A0, + class _A1, class _A2, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, true> +{ + typedef typename _Alloc<_Tp, _A0, _A1, _A2>::template rebind<_Up>::other type; +}; + +template <template <class, class, class, class> class _Alloc, class _Tp, class _A0, + class _A1, class _A2, class _Up> +struct __allocator_traits_rebind<_Alloc<_Tp, _A0, _A1, _A2>, _Up, false> +{ + typedef _Alloc<_Up, _A0, _A1, _A2> type; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE + +template <class _Alloc, class _SizeType, class _ConstVoidPtr> +auto +__has_allocate_hint_test(_Alloc&& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) + -> decltype(__a.allocate(__sz, __p), true_type()); + +template <class _Alloc, class _SizeType, class _ConstVoidPtr> +auto +__has_allocate_hint_test(const _Alloc& __a, _SizeType&& __sz, _ConstVoidPtr&& __p) + -> false_type; + +template <class _Alloc, class _SizeType, class _ConstVoidPtr> +struct __has_allocate_hint + : integral_constant<bool, + is_same< + decltype(__has_allocate_hint_test(declval<_Alloc>(), + declval<_SizeType>(), + declval<_ConstVoidPtr>())), + true_type>::value> +{ +}; + +#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE + +template <class _Alloc, class _SizeType, class _ConstVoidPtr> +struct __has_allocate_hint + : true_type +{ +}; + +#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE + +#if !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) && !defined(_LIBCPP_HAS_NO_VARIADICS) + +template <class _Alloc, class _Tp, class ..._Args> +decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Tp*>(), + _VSTD::declval<_Args>()...), + true_type()) +__has_construct_test(_Alloc&& __a, _Tp* __p, _Args&& ...__args); + +template <class _Alloc, class _Pointer, class ..._Args> +false_type +__has_construct_test(const _Alloc& __a, _Pointer&& __p, _Args&& ...__args); + +template <class _Alloc, class _Pointer, class ..._Args> +struct __has_construct + : integral_constant<bool, + is_same< + decltype(__has_construct_test(declval<_Alloc>(), + declval<_Pointer>(), + declval<_Args>()...)), + true_type>::value> +{ +}; + +template <class _Alloc, class _Pointer> +auto +__has_destroy_test(_Alloc&& __a, _Pointer&& __p) + -> decltype(__a.destroy(__p), true_type()); + +template <class _Alloc, class _Pointer> +auto +__has_destroy_test(const _Alloc& __a, _Pointer&& __p) + -> false_type; + +template <class _Alloc, class _Pointer> +struct __has_destroy + : integral_constant<bool, + is_same< + decltype(__has_destroy_test(declval<_Alloc>(), + declval<_Pointer>())), + true_type>::value> +{ +}; + +template <class _Alloc> +auto +__has_max_size_test(_Alloc&& __a) + -> decltype(__a.max_size(), true_type()); + +template <class _Alloc> +auto +__has_max_size_test(const volatile _Alloc& __a) + -> false_type; + +template <class _Alloc> +struct __has_max_size + : integral_constant<bool, + is_same< + decltype(__has_max_size_test(declval<_Alloc&>())), + true_type>::value> +{ +}; + +template <class _Alloc> +auto +__has_select_on_container_copy_construction_test(_Alloc&& __a) + -> decltype(__a.select_on_container_copy_construction(), true_type()); + +template <class _Alloc> +auto +__has_select_on_container_copy_construction_test(const volatile _Alloc& __a) + -> false_type; + +template <class _Alloc> +struct __has_select_on_container_copy_construction + : integral_constant<bool, + is_same< + decltype(__has_select_on_container_copy_construction_test(declval<_Alloc&>())), + true_type>::value> +{ +}; + +#else // _LIBCPP_HAS_NO_ADVANCED_SFINAE + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Alloc, class _Pointer, class ..._Args> +struct __has_construct + : false_type +{ +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Alloc, class _Pointer, class _Args> +struct __has_construct + : false_type +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Alloc, class _Pointer> +struct __has_destroy + : false_type +{ +}; + +template <class _Alloc> +struct __has_max_size + : true_type +{ +}; + +template <class _Alloc> +struct __has_select_on_container_copy_construction + : false_type +{ +}; + +#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE + +template <class _Alloc, class _Ptr, bool = __has_difference_type<_Alloc>::value> +struct __alloc_traits_difference_type +{ + typedef typename pointer_traits<_Ptr>::difference_type type; +}; + +template <class _Alloc, class _Ptr> +struct __alloc_traits_difference_type<_Alloc, _Ptr, true> +{ + typedef typename _Alloc::difference_type type; +}; + +template <class _Alloc> +struct _LIBCPP_VISIBLE allocator_traits +{ + typedef _Alloc allocator_type; + typedef typename allocator_type::value_type value_type; + + typedef typename __pointer_type<value_type, allocator_type>::type pointer; + typedef typename __const_pointer<value_type, pointer, allocator_type>::type const_pointer; + typedef typename __void_pointer<pointer, allocator_type>::type void_pointer; + typedef typename __const_void_pointer<pointer, allocator_type>::type const_void_pointer; + + typedef typename __alloc_traits_difference_type<allocator_type, pointer>::type difference_type; + typedef typename __size_type<allocator_type, difference_type>::type size_type; + + typedef typename __propagate_on_container_copy_assignment<allocator_type>::type + propagate_on_container_copy_assignment; + typedef typename __propagate_on_container_move_assignment<allocator_type>::type + propagate_on_container_move_assignment; + typedef typename __propagate_on_container_swap<allocator_type>::type + propagate_on_container_swap; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + template <class _Tp> using rebind_alloc = + typename __allocator_traits_rebind<allocator_type, _Tp>::type; + template <class _Tp> using rebind_traits = allocator_traits<rebind_alloc<_Tp>>; +#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + template <class _Tp> struct rebind_alloc + {typedef typename __allocator_traits_rebind<allocator_type, _Tp>::type other;}; + template <class _Tp> struct rebind_traits + {typedef allocator_traits<typename rebind_alloc<_Tp>::other> other;}; +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + + _LIBCPP_INLINE_VISIBILITY + static pointer allocate(allocator_type& __a, size_type __n) + {return __a.allocate(__n);} + _LIBCPP_INLINE_VISIBILITY + static pointer allocate(allocator_type& __a, size_type __n, const_void_pointer __hint) + {return allocate(__a, __n, __hint, + __has_allocate_hint<allocator_type, size_type, const_void_pointer>());} + + _LIBCPP_INLINE_VISIBILITY + static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT + {__a.deallocate(__p, __n);} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + static void construct(allocator_type& __a, _Tp* __p, _Args&&... __args) + {__construct(__has_construct<allocator_type, pointer, _Args...>(), + __a, __p, _VSTD::forward<_Args>(__args)...);} +#else // _LIBCPP_HAS_NO_VARIADICS + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static void construct(allocator_type& __a, _Tp* __p) + { + ::new ((void*)__p) _Tp(); + } + template <class _Tp, class _A0> + _LIBCPP_INLINE_VISIBILITY + static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0) + { + ::new ((void*)__p) _Tp(__a0); + } + template <class _Tp, class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, + const _A1& __a1) + { + ::new ((void*)__p) _Tp(__a0, __a1); + } + template <class _Tp, class _A0, class _A1, class _A2> + _LIBCPP_INLINE_VISIBILITY + static void construct(allocator_type& __a, _Tp* __p, const _A0& __a0, + const _A1& __a1, const _A2& __a2) + { + ::new ((void*)__p) _Tp(__a0, __a1, __a2); + } +#endif // _LIBCPP_HAS_NO_VARIADICS + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static void destroy(allocator_type& __a, _Tp* __p) + {__destroy(__has_destroy<allocator_type, _Tp*>(), __a, __p);} + + _LIBCPP_INLINE_VISIBILITY + static size_type max_size(const allocator_type& __a) + {return __max_size(__has_max_size<const allocator_type>(), __a);} + + _LIBCPP_INLINE_VISIBILITY + static allocator_type + select_on_container_copy_construction(const allocator_type& __a) + {return select_on_container_copy_construction( + __has_select_on_container_copy_construction<const allocator_type>(), + __a);} + + template <class _Ptr> + _LIBCPP_INLINE_VISIBILITY + static + void + __construct_forward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __begin2) + { + for (; __begin1 != __end1; ++__begin1, ++__begin2) + construct(__a, _VSTD::__to_raw_pointer(__begin2), _VSTD::move_if_noexcept(*__begin1)); + } + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + (is_same<allocator_type, allocator<_Tp> >::value + || !__has_construct<allocator_type, _Tp*, _Tp>::value) && + is_trivially_move_constructible<_Tp>::value, + void + >::type + __construct_forward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2) + { + ptrdiff_t _Np = __end1 - __begin1; + _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); + __begin2 += _Np; + } + + template <class _Ptr> + _LIBCPP_INLINE_VISIBILITY + static + void + __construct_backward(allocator_type& __a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) + { + while (__end1 != __begin1) + construct(__a, _VSTD::__to_raw_pointer(--__end2), _VSTD::move_if_noexcept(*--__end1)); + } + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + (is_same<allocator_type, allocator<_Tp> >::value + || !__has_construct<allocator_type, _Tp*, _Tp>::value) && + is_trivially_move_constructible<_Tp>::value, + void + >::type + __construct_backward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __end2) + { + ptrdiff_t _Np = __end1 - __begin1; + __end2 -= _Np; + _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); + } + +private: + + _LIBCPP_INLINE_VISIBILITY + static pointer allocate(allocator_type& __a, size_type __n, + const_void_pointer __hint, true_type) + {return __a.allocate(__n, __hint);} + _LIBCPP_INLINE_VISIBILITY + static pointer allocate(allocator_type& __a, size_type __n, + const_void_pointer, false_type) + {return __a.allocate(__n);} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + static void __construct(true_type, allocator_type& __a, _Tp* __p, _Args&&... __args) + {__a.construct(__p, _VSTD::forward<_Args>(__args)...);} + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + static void __construct(false_type, allocator_type&, _Tp* __p, _Args&&... __args) + { + ::new ((void*)__p) _Tp(_VSTD::forward<_Args>(__args)...); + } +#endif // _LIBCPP_HAS_NO_VARIADICS + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static void __destroy(true_type, allocator_type& __a, _Tp* __p) + {__a.destroy(__p);} + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + static void __destroy(false_type, allocator_type&, _Tp* __p) + { + __p->~_Tp(); + } + + _LIBCPP_INLINE_VISIBILITY + static size_type __max_size(true_type, const allocator_type& __a) + {return __a.max_size();} + _LIBCPP_INLINE_VISIBILITY + static size_type __max_size(false_type, const allocator_type&) + {return numeric_limits<size_type>::max();} + + _LIBCPP_INLINE_VISIBILITY + static allocator_type + select_on_container_copy_construction(true_type, const allocator_type& __a) + {return __a.select_on_container_copy_construction();} + _LIBCPP_INLINE_VISIBILITY + static allocator_type + select_on_container_copy_construction(false_type, const allocator_type& __a) + {return __a;} +}; + +// allocator + +template <class _Tp> +class _LIBCPP_VISIBLE allocator +{ +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + typedef true_type propagate_on_container_move_assignment; + + template <class _Up> struct rebind {typedef allocator<_Up> other;}; + + _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY pointer address(reference __x) const _NOEXCEPT + {return _VSTD::addressof(__x);} + _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT + {return _VSTD::addressof(__x);} + _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) + {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} + _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT + {::operator delete((void*)__p);} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT + {return size_type(~0) / sizeof(_Tp);} +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class _Up, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void + construct(_Up* __p, _Args&&... __args) + { + ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); + } +#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p) + { + ::new((void*)__p) _Tp(); + } +# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + !is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, _A0& __a0) + { + ::new((void*)__p) _Tp(__a0); + } + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + !is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, const _A0& __a0) + { + ::new((void*)__p) _Tp(__a0); + } + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, _A0 __a0) + { + ::new((void*)__p) _Tp(_VSTD::move(__a0)); + } +# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, _A0& __a0, _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, const _A0& __a0, _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, _A0& __a0, const _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, const _A0& __a0, const _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} +}; + +template <class _Tp> +class _LIBCPP_VISIBLE allocator<const _Tp> +{ +public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef const _Tp* pointer; + typedef const _Tp* const_pointer; + typedef const _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + typedef true_type propagate_on_container_move_assignment; + + template <class _Up> struct rebind {typedef allocator<_Up> other;}; + + _LIBCPP_INLINE_VISIBILITY allocator() _NOEXCEPT {} + template <class _Up> _LIBCPP_INLINE_VISIBILITY allocator(const allocator<_Up>&) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY const_pointer address(const_reference __x) const _NOEXCEPT + {return _VSTD::addressof(__x);} + _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, allocator<void>::const_pointer = 0) + {return static_cast<pointer>(::operator new(__n * sizeof(_Tp)));} + _LIBCPP_INLINE_VISIBILITY void deallocate(pointer __p, size_type) _NOEXCEPT + {::operator delete((void*)__p);} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT + {return size_type(~0) / sizeof(_Tp);} +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class _Up, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void + construct(_Up* __p, _Args&&... __args) + { + ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); + } +#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p) + { + ::new((void*)__p) _Tp(); + } +# if defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + !is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, _A0& __a0) + { + ::new((void*)__p) _Tp(__a0); + } + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + !is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, const _A0& __a0) + { + ::new((void*)__p) _Tp(__a0); + } + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + is_convertible<_A0, __rv<_A0> >::value, + void + >::type + construct(pointer __p, _A0 __a0) + { + ::new((void*)__p) _Tp(_VSTD::move(__a0)); + } +# endif // defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, _A0& __a0, _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, const _A0& __a0, _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, _A0& __a0, const _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + void + construct(pointer __p, const _A0& __a0, const _A1& __a1) + { + ::new((void*)__p) _Tp(__a0, __a1); + } +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY void destroy(pointer __p) {__p->~_Tp();} +}; + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool operator==(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return true;} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool operator!=(const allocator<_Tp>&, const allocator<_Up>&) _NOEXCEPT {return false;} + +template <class _OutputIterator, class _Tp> +class _LIBCPP_VISIBLE raw_storage_iterator + : public iterator<output_iterator_tag, + _Tp, // purposefully not C++03 + ptrdiff_t, // purposefully not C++03 + _Tp*, // purposefully not C++03 + raw_storage_iterator<_OutputIterator, _Tp>&> // purposefully not C++03 +{ +private: + _OutputIterator __x_; +public: + _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) + {::new(&*__x_) _Tp(__element); return *this;} + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator++() {++__x_; return *this;} + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator operator++(int) + {raw_storage_iterator __t(*this); ++__x_; return __t;} +}; + +template <class _Tp> +pair<_Tp*, ptrdiff_t> +get_temporary_buffer(ptrdiff_t __n) _NOEXCEPT +{ + pair<_Tp*, ptrdiff_t> __r(0, 0); + const ptrdiff_t __m = (~ptrdiff_t(0) ^ + ptrdiff_t(ptrdiff_t(1) << (sizeof(ptrdiff_t) * __CHAR_BIT__ - 1))) + / sizeof(_Tp); + if (__n > __m) + __n = __m; + while (__n > 0) + { + __r.first = static_cast<_Tp*>(::operator new(__n * sizeof(_Tp), nothrow)); + if (__r.first) + { + __r.second = __n; + break; + } + __n /= 2; + } + return __r; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void return_temporary_buffer(_Tp* __p) _NOEXCEPT {::operator delete(__p);} + +template <class _Tp> +struct auto_ptr_ref +{ + _Tp* __ptr_; +}; + +template<class _Tp> +class _LIBCPP_VISIBLE auto_ptr +{ +private: + _Tp* __ptr_; +public: + typedef _Tp element_type; + + _LIBCPP_INLINE_VISIBILITY explicit auto_ptr(_Tp* __p = 0) throw() : __ptr_(__p) {} + _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr& __p) throw() : __ptr_(__p.release()) {} + template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr<_Up>& __p) throw() + : __ptr_(__p.release()) {} + _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr& __p) throw() + {reset(__p.release()); return *this;} + template<class _Up> _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr<_Up>& __p) throw() + {reset(__p.release()); return *this;} + _LIBCPP_INLINE_VISIBILITY auto_ptr& operator=(auto_ptr_ref<_Tp> __p) throw() + {reset(__p.__ptr_); return *this;} + _LIBCPP_INLINE_VISIBILITY ~auto_ptr() throw() {delete __ptr_;} + + _LIBCPP_INLINE_VISIBILITY _Tp& operator*() const throw() + {return *__ptr_;} + _LIBCPP_INLINE_VISIBILITY _Tp* operator->() const throw() {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY _Tp* get() const throw() {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY _Tp* release() throw() + { + _Tp* __t = __ptr_; + __ptr_ = 0; + return __t; + } + _LIBCPP_INLINE_VISIBILITY void reset(_Tp* __p = 0) throw() + { + if (__ptr_ != __p) + delete __ptr_; + __ptr_ = __p; + } + + _LIBCPP_INLINE_VISIBILITY auto_ptr(auto_ptr_ref<_Tp> __p) throw() : __ptr_(__p.__ptr_) {} + template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr_ref<_Up>() throw() + {auto_ptr_ref<_Up> __t; __t.__ptr_ = release(); return __t;} + template<class _Up> _LIBCPP_INLINE_VISIBILITY operator auto_ptr<_Up>() throw() + {return auto_ptr<_Up>(release());} +}; + +template <> +class _LIBCPP_VISIBLE auto_ptr<void> +{ +public: + typedef void element_type; +}; + +template <class _T1, class _T2, bool = is_same<typename remove_cv<_T1>::type, + typename remove_cv<_T2>::type>::value, + bool = is_empty<_T1>::value +#if __has_feature(is_final) + && !__is_final(_T1) +#endif + , + bool = is_empty<_T2>::value +#if __has_feature(is_final) + && !__is_final(_T2) +#endif + > +struct __libcpp_compressed_pair_switch; + +template <class _T1, class _T2, bool IsSame> +struct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, false> {enum {value = 0};}; + +template <class _T1, class _T2, bool IsSame> +struct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, true, false> {enum {value = 1};}; + +template <class _T1, class _T2, bool IsSame> +struct __libcpp_compressed_pair_switch<_T1, _T2, IsSame, false, true> {enum {value = 2};}; + +template <class _T1, class _T2> +struct __libcpp_compressed_pair_switch<_T1, _T2, false, true, true> {enum {value = 3};}; + +template <class _T1, class _T2> +struct __libcpp_compressed_pair_switch<_T1, _T2, true, true, true> {enum {value = 1};}; + +template <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value> +class __libcpp_compressed_pair_imp; + +template <class _T1, class _T2> +class __libcpp_compressed_pair_imp<_T1, _T2, 0> +{ +private: + _T1 __first_; + _T2 __second_; +public: + typedef _T1 _T1_param; + typedef _T2 _T2_param; + + typedef typename remove_reference<_T1>::type& _T1_reference; + typedef typename remove_reference<_T2>::type& _T2_reference; + + typedef const typename remove_reference<_T1>::type& _T1_const_reference; + typedef const typename remove_reference<_T2>::type& _T2_const_reference; + + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) + : __first_(_VSTD::forward<_T1_param>(__t1)) {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) + : __second_(_VSTD::forward<_T2_param>(__t2)) {} + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) + : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : __first_(__p.first()), + __second_(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + __first_ = __p.first(); + __second_ = __p.second(); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : __first_(_VSTD::forward<_T1>(__p.first())), + __second_(_VSTD::forward<_T2>(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + __first_ = _VSTD::forward<_T1>(__p.first()); + __second_ = _VSTD::forward<_T2>(__p.second()); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(piecewise_construct_t __pc, + tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args, + __tuple_indices<_I1...>, + __tuple_indices<_I2...>) + : __first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), + __second_(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) + {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} + _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} + + _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} + _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} + + _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + { + using _VSTD::swap; + swap(__first_, __x.__first_); + swap(__second_, __x.__second_); + } +}; + +template <class _T1, class _T2> +class __libcpp_compressed_pair_imp<_T1, _T2, 1> + : private _T1 +{ +private: + _T2 __second_; +public: + typedef _T1 _T1_param; + typedef _T2 _T2_param; + + typedef _T1& _T1_reference; + typedef typename remove_reference<_T2>::type& _T2_reference; + + typedef const _T1& _T1_const_reference; + typedef const typename remove_reference<_T2>::type& _T2_const_reference; + + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) + : _T1(_VSTD::forward<_T1_param>(__t1)) {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) + : __second_(_VSTD::forward<_T2_param>(__t2)) {} + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) + : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T1(__p.first()), __second_(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T1::operator=(__p.first()); + __second_ = __p.second(); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : _T1(_VSTD::move(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T1::operator=(_VSTD::move(__p.first())); + __second_ = _VSTD::forward<_T2>(__p.second()); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(piecewise_construct_t __pc, + tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args, + __tuple_indices<_I1...>, + __tuple_indices<_I2...>) + : _T1(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), + __second_(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) + {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} + + _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return __second_;} + _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return __second_;} + + _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + { + using _VSTD::swap; + swap(__second_, __x.__second_); + } +}; + +template <class _T1, class _T2> +class __libcpp_compressed_pair_imp<_T1, _T2, 2> + : private _T2 +{ +private: + _T1 __first_; +public: + typedef _T1 _T1_param; + typedef _T2 _T2_param; + + typedef typename remove_reference<_T1>::type& _T1_reference; + typedef _T2& _T2_reference; + + typedef const typename remove_reference<_T1>::type& _T1_const_reference; + typedef const _T2& _T2_const_reference; + + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) + : __first_(_VSTD::forward<_T1_param>(__t1)) {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) + : _T2(_VSTD::forward<_T2_param>(__t2)) {} + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T2(__p.second()), __first_(__p.first()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T2::operator=(__p.second()); + __first_ = __p.first(); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : _T2(_VSTD::forward<_T2>(__p.second())), __first_(_VSTD::move(__p.first())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T2::operator=(_VSTD::forward<_T2>(__p.second())); + __first_ = _VSTD::move(__p.first()); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(piecewise_construct_t __pc, + tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args, + __tuple_indices<_I1...>, + __tuple_indices<_I2...>) + : _T2(_VSTD::forward<_Args2>(get<_I2>(__second_args))...), + __first_(_VSTD::forward<_Args1>(get<_I1>(__first_args))...) + + {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} + _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} + + _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} + + _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp& __x) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + { + using _VSTD::swap; + swap(__first_, __x.__first_); + } +}; + +template <class _T1, class _T2> +class __libcpp_compressed_pair_imp<_T1, _T2, 3> + : private _T1, + private _T2 +{ +public: + typedef _T1 _T1_param; + typedef _T2 _T2_param; + + typedef _T1& _T1_reference; + typedef _T2& _T2_reference; + + typedef const _T1& _T1_const_reference; + typedef const _T2& _T2_const_reference; + + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp() {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T1_param __t1) + : _T1(_VSTD::forward<_T1_param>(__t1)) {} + _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2) + : _T2(_VSTD::forward<_T2_param>(__t2)) {} + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) + : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T1(__p.first()), _T2(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T1::operator=(__p.first()); + _T2::operator=(__p.second()); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : _T1(_VSTD::move(__p.first())), _T2(_VSTD::move(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T1::operator=(_VSTD::move(__p.first())); + _T2::operator=(_VSTD::move(__p.second())); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(piecewise_construct_t __pc, + tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args, + __tuple_indices<_I1...>, + __tuple_indices<_I2...>) + : _T1(_VSTD::forward<_Args1>(get<_I1>(__first_args))...), + _T2(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) + {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} + + _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return *this;} + + _LIBCPP_INLINE_VISIBILITY void swap(__libcpp_compressed_pair_imp&) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + { + } +}; + +template <class _T1, class _T2> +class __compressed_pair + : private __libcpp_compressed_pair_imp<_T1, _T2> +{ + typedef __libcpp_compressed_pair_imp<_T1, _T2> base; +public: + typedef typename base::_T1_param _T1_param; + typedef typename base::_T2_param _T2_param; + + typedef typename base::_T1_reference _T1_reference; + typedef typename base::_T2_reference _T2_reference; + + typedef typename base::_T1_const_reference _T1_const_reference; + typedef typename base::_T2_const_reference _T2_const_reference; + + _LIBCPP_INLINE_VISIBILITY __compressed_pair() {} + _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T1_param __t1) + : base(_VSTD::forward<_T1_param>(__t1)) {} + _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2) + : base(_VSTD::forward<_T2_param>(__t2)) {} + _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) + : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} + +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair(const __compressed_pair& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : base(__p) {} + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair& operator=(const __compressed_pair& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + base::operator=(__p); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __compressed_pair(__compressed_pair&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) + : base(_VSTD::move(__p)) {} + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair& operator=(__compressed_pair&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + base::operator=(_VSTD::move(__p)); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class... _Args1, class... _Args2> + _LIBCPP_INLINE_VISIBILITY + __compressed_pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args) + : base(__pc, _VSTD::move(__first_args), _VSTD::move(__second_args), + typename __make_tuple_indices<sizeof...(_Args1)>::type(), + typename __make_tuple_indices<sizeof...(_Args2) >::type()) + {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} + _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} + + _LIBCPP_INLINE_VISIBILITY _T2_reference second() _NOEXCEPT {return base::second();} + _LIBCPP_INLINE_VISIBILITY _T2_const_reference second() const _NOEXCEPT {return base::second();} + + _LIBCPP_INLINE_VISIBILITY void swap(__compressed_pair& __x) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + {base::swap(__x);} +}; + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__compressed_pair<_T1, _T2>& __x, __compressed_pair<_T1, _T2>& __y) + _NOEXCEPT_(__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T1>::value) + {__x.swap(__y);} + +// __same_or_less_cv_qualified + +template <class _Ptr1, class _Ptr2, + bool = is_same<typename remove_cv<typename pointer_traits<_Ptr1>::element_type>::type, + typename remove_cv<typename pointer_traits<_Ptr2>::element_type>::type + >::value + > +struct __same_or_less_cv_qualified_imp + : is_convertible<_Ptr1, _Ptr2> {}; + +template <class _Ptr1, class _Ptr2> +struct __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2, false> + : false_type {}; + +template <class _Ptr1, class _Ptr2, bool = is_scalar<_Ptr1>::value && + !is_pointer<_Ptr1>::value> +struct __same_or_less_cv_qualified + : __same_or_less_cv_qualified_imp<_Ptr1, _Ptr2> {}; + +template <class _Ptr1, class _Ptr2> +struct __same_or_less_cv_qualified<_Ptr1, _Ptr2, true> + : false_type {}; + +// default_delete + +template <class _Tp> +struct _LIBCPP_VISIBLE default_delete +{ + _LIBCPP_INLINE_VISIBILITY default_delete() _NOEXCEPT {} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&, + typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT + { + static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); + delete __ptr; + } +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE default_delete<_Tp[]> +{ +public: + _LIBCPP_INLINE_VISIBILITY default_delete() _NOEXCEPT {} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up[]>&, + typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY + void operator() (_Up* __ptr, + typename enable_if<__same_or_less_cv_qualified<_Up*, _Tp*>::value>::type* = 0) const _NOEXCEPT + { + static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type"); + delete [] __ptr; + } +}; + +template <class _Tp, class _Dp = default_delete<_Tp> > +class _LIBCPP_VISIBLE unique_ptr +{ +public: + typedef _Tp element_type; + typedef _Dp deleter_type; + typedef typename __pointer_type<_Tp, deleter_type>::type pointer; +private: + __compressed_pair<pointer, deleter_type> __ptr_; + +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unique_ptr(unique_ptr&); + template <class _Up, class _Ep> + unique_ptr(unique_ptr<_Up, _Ep>&); + unique_ptr& operator=(unique_ptr&); + template <class _Up, class _Ep> + unique_ptr& operator=(unique_ptr<_Up, _Ep>&); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + struct __nat {int __for_bool_;}; + + typedef typename remove_reference<deleter_type>::type& _Dp_reference; + typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; +public: + _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT + : __ptr_(pointer()) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT + : __ptr_(pointer()) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) _NOEXCEPT + : __ptr_(_VSTD::move(__p)) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename conditional< + is_reference<deleter_type>::value, + deleter_type, + typename add_lvalue_reference<const deleter_type>::type>::type __d) + _NOEXCEPT + : __ptr_(__p, __d) {} + + _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, typename remove_reference<deleter_type>::type&& __d) + _NOEXCEPT + : __ptr_(__p, _VSTD::move(__d)) + { + static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); + } + _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT + : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} + template <class _Up, class _Ep> + _LIBCPP_INLINE_VISIBILITY + unique_ptr(unique_ptr<_Up, _Ep>&& __u, + typename enable_if + < + !is_array<_Up>::value && + is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && + is_convertible<_Ep, deleter_type>::value && + ( + !is_reference<deleter_type>::value || + is_same<deleter_type, _Ep>::value + ), + __nat + >::type = __nat()) _NOEXCEPT + : __ptr_(__u.release(), _VSTD::forward<_Ep>(__u.get_deleter())) {} + + template <class _Up> + _LIBCPP_INLINE_VISIBILITY unique_ptr(auto_ptr<_Up>&& __p, + typename enable_if< + is_convertible<_Up*, _Tp*>::value && + is_same<_Dp, default_delete<_Tp> >::value, + __nat + >::type = __nat()) _NOEXCEPT + : __ptr_(__p.release()) + { + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT + { + reset(__u.release()); + __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); + return *this; + } + + template <class _Up, class _Ep> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + !is_array<_Up>::value && + is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && + is_assignable<deleter_type&, _Ep&&>::value, + unique_ptr& + >::type + operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT + { + reset(__u.release()); + __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); + return *this; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() + { + return __rv<unique_ptr>(*this); + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) + : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} + + template <class _Up, class _Ep> + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr<_Up, _Ep> __u) + { + reset(__u.release()); + __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) + : __ptr_(_VSTD::move(__p), _VSTD::move(__d)) {} + + template <class _Up> + _LIBCPP_INLINE_VISIBILITY + typename enable_if< + is_convertible<_Up*, _Tp*>::value && + is_same<_Dp, default_delete<_Tp> >::value, + unique_ptr& + >::type + operator=(auto_ptr<_Up> __p) + {reset(__p.release()); return *this;} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} + + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT + { + reset(); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator*() const + {return *__ptr_.first();} + _LIBCPP_INLINE_VISIBILITY pointer operator->() const _NOEXCEPT {return __ptr_.first();} + _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} + _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT + {return __ptr_.second();} + _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT + {return __ptr_.second();} + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT + {return __ptr_.first() != nullptr;} + + _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT + { + pointer __t = __ptr_.first(); + __ptr_.first() = pointer(); + return __t; + } + + _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) _NOEXCEPT + { + pointer __tmp = __ptr_.first(); + __ptr_.first() = __p; + if (__tmp) + __ptr_.second()(__tmp); + } + + _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) _NOEXCEPT + {__ptr_.swap(__u.__ptr_);} +}; + +template <class _Tp, class _Dp> +class _LIBCPP_VISIBLE unique_ptr<_Tp[], _Dp> +{ +public: + typedef _Tp element_type; + typedef _Dp deleter_type; + typedef typename __pointer_type<_Tp, deleter_type>::type pointer; +private: + __compressed_pair<pointer, deleter_type> __ptr_; + +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unique_ptr(unique_ptr&); + template <class _Up> + unique_ptr(unique_ptr<_Up>&); + unique_ptr& operator=(unique_ptr&); + template <class _Up> + unique_ptr& operator=(unique_ptr<_Up>&); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + struct __nat {int __for_bool_;}; + + typedef typename remove_reference<deleter_type>::type& _Dp_reference; + typedef const typename remove_reference<deleter_type>::type& _Dp_const_reference; +public: + _LIBCPP_INLINE_VISIBILITY unique_ptr() _NOEXCEPT + : __ptr_(pointer()) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t) _NOEXCEPT + : __ptr_(pointer()) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type + > + _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_Pp __p) _NOEXCEPT + : __ptr_(__p) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + + template <class _Pp, + class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type + > + _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename conditional< + is_reference<deleter_type>::value, + deleter_type, + typename add_lvalue_reference<const deleter_type>::type>::type __d) + _NOEXCEPT + : __ptr_(__p, __d) {} + + _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename conditional< + is_reference<deleter_type>::value, + deleter_type, + typename add_lvalue_reference<const deleter_type>::type>::type __d) + _NOEXCEPT + : __ptr_(pointer(), __d) {} + + template <class _Pp, + class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type + > + _LIBCPP_INLINE_VISIBILITY unique_ptr(_Pp __p, typename remove_reference<deleter_type>::type&& __d) + _NOEXCEPT + : __ptr_(__p, _VSTD::move(__d)) + { + static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, typename remove_reference<deleter_type>::type&& __d) + _NOEXCEPT + : __ptr_(pointer(), _VSTD::move(__d)) + { + static_assert(!is_reference<deleter_type>::value, "rvalue deleter bound to reference"); + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT + : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} + + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(unique_ptr&& __u) _NOEXCEPT + { + reset(__u.release()); + __ptr_.second() = _VSTD::forward<deleter_type>(__u.get_deleter()); + return *this; + } + + template <class _Up, class _Ep> + _LIBCPP_INLINE_VISIBILITY + unique_ptr(unique_ptr<_Up, _Ep>&& __u, + typename enable_if + < + is_array<_Up>::value && + __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value + && is_convertible<_Ep, deleter_type>::value && + ( + !is_reference<deleter_type>::value || + is_same<deleter_type, _Ep>::value + ), + __nat + >::type = __nat() + ) _NOEXCEPT + : __ptr_(__u.release(), _VSTD::forward<deleter_type>(__u.get_deleter())) {} + + + template <class _Up, class _Ep> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + is_array<_Up>::value && + __same_or_less_cv_qualified<typename unique_ptr<_Up, _Ep>::pointer, pointer>::value && + is_assignable<deleter_type&, _Ep&&>::value, + unique_ptr& + >::type + operator=(unique_ptr<_Up, _Ep>&& __u) _NOEXCEPT + { + reset(__u.release()); + __ptr_.second() = _VSTD::forward<_Ep>(__u.get_deleter()); + return *this; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(pointer __p) + : __ptr_(__p) + { + static_assert(!is_pointer<deleter_type>::value, + "unique_ptr constructed with null function pointer deleter"); + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(pointer __p, deleter_type __d) + : __ptr_(__p, _VSTD::forward<deleter_type>(__d)) {} + + _LIBCPP_INLINE_VISIBILITY unique_ptr(nullptr_t, deleter_type __d) + : __ptr_(pointer(), _VSTD::forward<deleter_type>(__d)) {} + + _LIBCPP_INLINE_VISIBILITY operator __rv<unique_ptr>() + { + return __rv<unique_ptr>(*this); + } + + _LIBCPP_INLINE_VISIBILITY unique_ptr(__rv<unique_ptr> __u) + : __ptr_(__u->release(), _VSTD::forward<deleter_type>(__u->get_deleter())) {} + + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(__rv<unique_ptr> __u) + { + reset(__u->release()); + __ptr_.second() = _VSTD::forward<deleter_type>(__u->get_deleter()); + return *this; + } + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY ~unique_ptr() {reset();} + + _LIBCPP_INLINE_VISIBILITY unique_ptr& operator=(nullptr_t) _NOEXCEPT + { + reset(); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY typename add_lvalue_reference<_Tp>::type operator[](size_t __i) const + {return __ptr_.first()[__i];} + _LIBCPP_INLINE_VISIBILITY pointer get() const _NOEXCEPT {return __ptr_.first();} + _LIBCPP_INLINE_VISIBILITY _Dp_reference get_deleter() _NOEXCEPT + {return __ptr_.second();} + _LIBCPP_INLINE_VISIBILITY _Dp_const_reference get_deleter() const _NOEXCEPT + {return __ptr_.second();} + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT + {return __ptr_.first() != nullptr;} + + _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT + { + pointer __t = __ptr_.first(); + __ptr_.first() = pointer(); + return __t; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<__same_or_less_cv_qualified<_Pp, pointer>::value>::type + > + _LIBCPP_INLINE_VISIBILITY void reset(_Pp __p) _NOEXCEPT + { + pointer __tmp = __ptr_.first(); + __ptr_.first() = __p; + if (__tmp) + __ptr_.second()(__tmp); + } + _LIBCPP_INLINE_VISIBILITY void reset(nullptr_t) _NOEXCEPT + { + pointer __tmp = __ptr_.first(); + __ptr_.first() = nullptr; + if (__tmp) + __ptr_.second()(__tmp); + } + _LIBCPP_INLINE_VISIBILITY void reset() _NOEXCEPT + { + pointer __tmp = __ptr_.first(); + __ptr_.first() = nullptr; + if (__tmp) + __ptr_.second()(__tmp); + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY void reset(pointer __p = pointer()) + { + pointer __tmp = __ptr_.first(); + __ptr_.first() = __p; + if (__tmp) + __ptr_.second()(__tmp); + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY void swap(unique_ptr& __u) {__ptr_.swap(__u.__ptr_);} +private: + +#ifdef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Up> + explicit unique_ptr(_Up); + template <class _Up> + unique_ptr(_Up __u, + typename conditional< + is_reference<deleter_type>::value, + deleter_type, + typename add_lvalue_reference<const deleter_type>::type>::type, + typename enable_if + < + is_convertible<_Up, pointer>::value, + __nat + >::type = __nat()); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +}; + +template <class _Tp, class _Dp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unique_ptr<_Tp, _Dp>& __x, unique_ptr<_Tp, _Dp>& __y) _NOEXCEPT {__x.swap(__y);} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __x.get() == __y.get();} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x == __y);} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) +{ + typedef typename unique_ptr<_T1, _D1>::pointer _P1; + typedef typename unique_ptr<_T2, _D2>::pointer _P2; + typedef typename common_type<_P1, _P2>::type _V; + return less<_V>()(__x.get(), __y.get()); +} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return __y < __x;} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__y < __x);} + +template <class _T1, class _D1, class _T2, class _D2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const unique_ptr<_T1, _D1>& __x, const unique_ptr<_T2, _D2>& __y) {return !(__x < __y);} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + return !__x; +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + return !__x; +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + return static_cast<bool>(__x); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + return static_cast<bool>(__x); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + typedef typename unique_ptr<_T1, _D1>::pointer _P1; + return less<_P1>()(__x.get(), nullptr); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + typedef typename unique_ptr<_T1, _D1>::pointer _P1; + return less<_P1>()(nullptr, __x.get()); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + return nullptr < __x; +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + return __x < nullptr; +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + return !(nullptr < __x); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + return !(__x < nullptr); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const unique_ptr<_T1, _D1>& __x, nullptr_t) +{ + return !(__x < nullptr); +} + +template <class _T1, class _D1> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(nullptr_t, const unique_ptr<_T1, _D1>& __x) +{ + return !(nullptr < __x); +} + +template <class _Tp> struct hash; + +// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t +// is 64 bits. This is because cityhash64 uses 64bit x 64bit +// multiplication, which can be very slow on 32-bit systems. +template <class _Size, size_t = sizeof(_Size)*__CHAR_BIT__> +struct __murmur2_or_cityhash; + +template <class _Size> +struct __murmur2_or_cityhash<_Size, 32> +{ + _Size operator()(const void* __key, _Size __len); +}; + +// murmur2 +template <class _Size> +_Size +__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) +{ + const _Size __m = 0x5bd1e995; + const _Size __r = 24; + _Size __h = __len; + const unsigned char* __data = static_cast<const unsigned char*>(__key); + for (; __len >= 4; __data += 4, __len -= 4) + { + _Size __k = *(const _Size*)__data; + __k *= __m; + __k ^= __k >> __r; + __k *= __m; + __h *= __m; + __h ^= __k; + } + switch (__len) + { + case 3: + __h ^= __data[2] << 16; + case 2: + __h ^= __data[1] << 8; + case 1: + __h ^= __data[0]; + __h *= __m; + } + __h ^= __h >> 13; + __h *= __m; + __h ^= __h >> 15; + return __h; +} + +template <class _Size> +struct __murmur2_or_cityhash<_Size, 64> +{ + _Size operator()(const void* __key, _Size __len); + + private: + // Some primes between 2^63 and 2^64. + static const _Size __k0 = 0xc3a5c85c97cb3127ULL; + static const _Size __k1 = 0xb492b66fbe98f273ULL; + static const _Size __k2 = 0x9ae16a3b2f90404fULL; + static const _Size __k3 = 0xc949d7c7509e6557ULL; + + static _Size __rotate(_Size __val, int __shift) { + return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); + } + + static _Size __rotate_by_at_least_1(_Size __val, int __shift) { + return (__val >> __shift) | (__val << (64 - __shift)); + } + + static _Size __shift_mix(_Size __val) { + return __val ^ (__val >> 47); + } + + static _Size __hash_len_16(_Size __u, _Size __v) { + const _Size __mul = 0x9ddfea08eb382d69ULL; + _Size __a = (__u ^ __v) * __mul; + __a ^= (__a >> 47); + _Size __b = (__v ^ __a) * __mul; + __b ^= (__b >> 47); + __b *= __mul; + return __b; + } + + static _Size __hash_len_0_to_16(const char* __s, _Size __len) { + if (__len > 8) { + const _Size __a = *(const _Size*)__s; + const _Size __b = *(const _Size*)(__s + __len - 8); + return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; + } + if (__len >= 4) { + const uint32_t __a = *(const uint32_t*)(__s); + const uint32_t __b = *(const uint32_t*)(__s + __len - 4); + return __hash_len_16(__len + (__a << 3), __b); + } + if (__len > 0) { + const unsigned char __a = __s[0]; + const unsigned char __b = __s[__len >> 1]; + const unsigned char __c = __s[__len - 1]; + const uint32_t __y = static_cast<uint32_t>(__a) + + (static_cast<uint32_t>(__b) << 8); + const uint32_t __z = __len + (static_cast<uint32_t>(__c) << 2); + return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; + } + return __k2; + } + + static _Size __hash_len_17_to_32(const char *__s, _Size __len) { + const _Size __a = *(const _Size*)(__s) * __k1; + const _Size __b = *(const _Size*)(__s + 8); + const _Size __c = *(const _Size*)(__s + __len - 8) * __k2; + const _Size __d = *(const _Size*)(__s + __len - 16) * __k0; + return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, + __a + __rotate(__b ^ __k3, 20) - __c + __len); + } + + // Return a 16-byte hash for 48 bytes. Quick and dirty. + // Callers do best to use "random-looking" values for a and b. + static pair<_Size, _Size> __weak_hash_len_32_with_seeds( + _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) { + __a += __w; + __b = __rotate(__b + __a + __z, 21); + const _Size __c = __a; + __a += __x; + __a += __y; + __b += __rotate(__a, 44); + return pair<_Size, _Size>(__a + __z, __b + __c); + } + + // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. + static pair<_Size, _Size> __weak_hash_len_32_with_seeds( + const char* __s, _Size __a, _Size __b) { + return __weak_hash_len_32_with_seeds(*(const _Size*)(__s), + *(const _Size*)(__s + 8), + *(const _Size*)(__s + 16), + *(const _Size*)(__s + 24), + __a, + __b); + } + + // Return an 8-byte hash for 33 to 64 bytes. + static _Size __hash_len_33_to_64(const char *__s, size_t __len) { + _Size __z = *(const _Size*)(__s + 24); + _Size __a = *(const _Size*)(__s) + + (__len + *(const _Size*)(__s + __len - 16)) * __k0; + _Size __b = __rotate(__a + __z, 52); + _Size __c = __rotate(__a, 37); + __a += *(const _Size*)(__s + 8); + __c += __rotate(__a, 7); + __a += *(const _Size*)(__s + 16); + _Size __vf = __a + __z; + _Size __vs = __b + __rotate(__a, 31) + __c; + __a = *(const _Size*)(__s + 16) + *(const _Size*)(__s + __len - 32); + __z += *(const _Size*)(__s + __len - 8); + __b = __rotate(__a + __z, 52); + __c = __rotate(__a, 37); + __a += *(const _Size*)(__s + __len - 24); + __c += __rotate(__a, 7); + __a += *(const _Size*)(__s + __len - 16); + _Size __wf = __a + __z; + _Size __ws = __b + __rotate(__a, 31) + __c; + _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); + return __shift_mix(__r * __k0 + __vs) * __k2; + } +}; + +// cityhash64 +template <class _Size> +_Size +__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) +{ + const char* __s = static_cast<const char*>(__key); + if (__len <= 32) { + if (__len <= 16) { + return __hash_len_0_to_16(__s, __len); + } else { + return __hash_len_17_to_32(__s, __len); + } + } else if (__len <= 64) { + return __hash_len_33_to_64(__s, __len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + _Size __x = *(const _Size*)(__s + __len - 40); + _Size __y = *(const _Size*)(__s + __len - 16) + + *(const _Size*)(__s + __len - 56); + _Size __z = __hash_len_16(*(const _Size*)(__s + __len - 48) + __len, + *(const _Size*)(__s + __len - 24)); + pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); + pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); + __x = __x * __k1 + *(const _Size*)(__s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + __len = (__len - 1) & ~static_cast<_Size>(63); + do { + __x = __rotate(__x + __y + __v.first + *(const _Size*)(__s + 8), 37) * __k1; + __y = __rotate(__y + __v.second + *(const _Size*)(__s + 48), 42) * __k1; + __x ^= __w.second; + __y += __v.first + *(const _Size*)(__s + 40); + __z = __rotate(__z + __w.first, 33) * __k1; + __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); + __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, + __y + *(const _Size*)(__s + 16)); + std::swap(__z, __x); + __s += 64; + __len -= 64; + } while (__len != 0); + return __hash_len_16( + __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, + __hash_len_16(__v.second, __w.second) + __x); +} + +template <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)> +struct __scalar_hash; + +template <class _Tp> +struct __scalar_hash<_Tp, 0> + : public unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + size_t __a; + } __u; + __u.__a = 0; + __u.__t = __v; + return __u.__a; + } +}; + +template <class _Tp> +struct __scalar_hash<_Tp, 1> + : public unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + size_t __a; + } __u; + __u.__t = __v; + return __u.__a; + } +}; + +template <class _Tp> +struct __scalar_hash<_Tp, 2> + : public unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + }; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); + } +}; + +template <class _Tp> +struct __scalar_hash<_Tp, 3> + : public unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + }; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); + } +}; + +template <class _Tp> +struct __scalar_hash<_Tp, 4> + : public unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + size_t __d; + }; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u)); + } +}; + +template<class _Tp> +struct _LIBCPP_VISIBLE hash<_Tp*> + : public __scalar_hash<_Tp*> +{ +}; + +template <class _Tp, class _Dp> +struct _LIBCPP_VISIBLE hash<unique_ptr<_Tp, _Dp> > +{ + typedef unique_ptr<_Tp, _Dp> argument_type; + typedef size_t result_type; + _LIBCPP_INLINE_VISIBILITY + result_type operator()(const argument_type& __ptr) const _NOEXCEPT + { + typedef typename argument_type::pointer pointer; + return hash<pointer>()(__ptr.get()); + } +}; + +struct __destruct_n +{ +private: + size_t size; + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT + {for (size_t __i = 0; __i < size; ++__i, ++__p) __p->~_Tp();} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT + {++size;} + _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT + {size = __s;} + _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT + {} +public: + _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT + : size(__s) {} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void __incr(_Tp*) _NOEXCEPT + {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT + {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT + {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());} +}; + +template <class _Alloc> +class __allocator_destructor +{ + typedef allocator_traits<_Alloc> __alloc_traits; +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::size_type size_type; +private: + _Alloc& __alloc_; + size_type __s_; +public: + _LIBCPP_INLINE_VISIBILITY __allocator_destructor(_Alloc& __a, size_type __s) + _NOEXCEPT + : __alloc_(__a), __s_(__s) {} + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + {__alloc_traits::deallocate(__alloc_, __p, __s_);} +}; + +template <class _InputIterator, class _ForwardIterator> +_ForwardIterator +uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; +#ifndef _LIBCPP_NO_EXCEPTIONS + _ForwardIterator __s = __r; + try + { +#endif + for (; __f != __l; ++__f, ++__r) + ::new(&*__r) value_type(*__f); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (; __s != __r; ++__s) + __s->~value_type(); + throw; + } +#endif + return __r; +} + +template <class _InputIterator, class _Size, class _ForwardIterator> +_ForwardIterator +uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; +#ifndef _LIBCPP_NO_EXCEPTIONS + _ForwardIterator __s = __r; + try + { +#endif + for (; __n > 0; ++__f, ++__r, --__n) + ::new(&*__r) value_type(*__f); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (; __s != __r; ++__s) + __s->~value_type(); + throw; + } +#endif + return __r; +} + +template <class _ForwardIterator, class _Tp> +void +uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; +#ifndef _LIBCPP_NO_EXCEPTIONS + _ForwardIterator __s = __f; + try + { +#endif + for (; __f != __l; ++__f) + ::new(&*__f) value_type(__x); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (; __s != __f; ++__s) + __s->~value_type(); + throw; + } +#endif +} + +template <class _ForwardIterator, class _Size, class _Tp> +_ForwardIterator +uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; +#ifndef _LIBCPP_NO_EXCEPTIONS + _ForwardIterator __s = __f; + try + { +#endif + for (; __n > 0; ++__f, --__n) + ::new(&*__f) value_type(__x); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (; __s != __f; ++__s) + __s->~value_type(); + throw; + } +#endif + return __f; +} + +class _LIBCPP_EXCEPTION_ABI bad_weak_ptr + : public std::exception +{ +public: + virtual ~bad_weak_ptr() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +template<class _Tp> class weak_ptr; + +class __shared_count +{ + __shared_count(const __shared_count&); + __shared_count& operator=(const __shared_count&); + +protected: + long __shared_owners_; + virtual ~__shared_count(); +private: + virtual void __on_zero_shared() _NOEXCEPT = 0; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __shared_count(long __refs = 0) _NOEXCEPT + : __shared_owners_(__refs) {} + + void __add_shared() _NOEXCEPT; + bool __release_shared() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + long use_count() const _NOEXCEPT {return __shared_owners_ + 1;} +}; + +class __shared_weak_count + : private __shared_count +{ + long __shared_weak_owners_; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __shared_weak_count(long __refs = 0) _NOEXCEPT + : __shared_count(__refs), + __shared_weak_owners_(__refs) {} +protected: + virtual ~__shared_weak_count(); + +public: + void __add_shared() _NOEXCEPT; + void __add_weak() _NOEXCEPT; + void __release_shared() _NOEXCEPT; + void __release_weak() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + long use_count() const _NOEXCEPT {return __shared_count::use_count();} + __shared_weak_count* lock() _NOEXCEPT; + + virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; +private: + virtual void __on_zero_shared_weak() _NOEXCEPT = 0; +}; + +template <class _Tp, class _Dp, class _Alloc> +class __shared_ptr_pointer + : public __shared_weak_count +{ + __compressed_pair<__compressed_pair<_Tp, _Dp>, _Alloc> __data_; +public: + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_pointer(_Tp __p, _Dp __d, _Alloc __a) + : __data_(__compressed_pair<_Tp, _Dp>(__p, _VSTD::move(__d)), _VSTD::move(__a)) {} + +#ifndef _LIBCPP_NO_RTTI + virtual const void* __get_deleter(const type_info&) const _NOEXCEPT; +#endif + +private: + virtual void __on_zero_shared() _NOEXCEPT; + virtual void __on_zero_shared_weak() _NOEXCEPT; +}; + +#ifndef _LIBCPP_NO_RTTI + +template <class _Tp, class _Dp, class _Alloc> +const void* +__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__get_deleter(const type_info& __t) const _NOEXCEPT +{ + return __t == typeid(_Dp) ? &__data_.first().second() : 0; +} + +#endif // _LIBCPP_NO_RTTI + +template <class _Tp, class _Dp, class _Alloc> +void +__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared() _NOEXCEPT +{ + __data_.first().second()(__data_.first().first()); + __data_.first().second().~_Dp(); +} + +template <class _Tp, class _Dp, class _Alloc> +void +__shared_ptr_pointer<_Tp, _Dp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT +{ + typename _Alloc::template rebind<__shared_ptr_pointer>::other __a(__data_.second()); + __data_.second().~_Alloc(); + __a.deallocate(this, 1); +} + +template <class _Tp, class _Alloc> +class __shared_ptr_emplace + : public __shared_weak_count +{ + __compressed_pair<_Alloc, _Tp> __data_; +public: +#ifndef _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a) + : __data_(_VSTD::move(__a)) {} + + template <class ..._Args> + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a, _Args&& ...__args) + : __data_(piecewise_construct, _VSTD::forward_as_tuple(__a), + _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)) {} + +#else // _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a) + : __data_(__a) {} + + template <class _A0> + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a, _A0& __a0) + : __data_(__a, _Tp(__a0)) {} + + template <class _A0, class _A1> + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1) + : __data_(__a, _Tp(__a0, __a1)) {} + + template <class _A0, class _A1, class _A2> + _LIBCPP_INLINE_VISIBILITY + __shared_ptr_emplace(_Alloc __a, _A0& __a0, _A1& __a1, _A2& __a2) + : __data_(__a, _Tp(__a0, __a1, __a2)) {} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +private: + virtual void __on_zero_shared() _NOEXCEPT; + virtual void __on_zero_shared_weak() _NOEXCEPT; +public: + _LIBCPP_INLINE_VISIBILITY + _Tp* get() _NOEXCEPT {return &__data_.second();} +}; + +template <class _Tp, class _Alloc> +void +__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared() _NOEXCEPT +{ + __data_.second().~_Tp(); +} + +template <class _Tp, class _Alloc> +void +__shared_ptr_emplace<_Tp, _Alloc>::__on_zero_shared_weak() _NOEXCEPT +{ + typename _Alloc::template rebind<__shared_ptr_emplace>::other __a(__data_.first()); + __data_.first().~_Alloc(); + __a.deallocate(this, 1); +} + +template<class _Tp> class enable_shared_from_this; + +template<class _Tp> +class _LIBCPP_VISIBLE shared_ptr +{ +public: + typedef _Tp element_type; +private: + element_type* __ptr_; + __shared_weak_count* __cntrl_; + + struct __nat {int __for_bool_;}; +public: + shared_ptr() _NOEXCEPT; + shared_ptr(nullptr_t) _NOEXCEPT; + template<class _Yp, + class = typename enable_if + < + is_convertible<_Yp*, element_type*>::value + >::type + > + explicit shared_ptr(_Yp* __p); + template<class _Yp, class _Dp, + class = typename enable_if + < + is_convertible<_Yp*, element_type*>::value + >::type + > + shared_ptr(_Yp* __p, _Dp __d); + template<class _Yp, class _Dp, class _Alloc, + class = typename enable_if + < + is_convertible<_Yp*, element_type*>::value + >::type + > + shared_ptr(_Yp* __p, _Dp __d, _Alloc __a); + template <class _Dp> shared_ptr(nullptr_t __p, _Dp __d); + template <class _Dp, class _Alloc> shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a); + template<class _Yp> shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) _NOEXCEPT; + shared_ptr(const shared_ptr& __r) _NOEXCEPT; + template<class _Yp> + shared_ptr(const shared_ptr<_Yp>& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) + _NOEXCEPT; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + shared_ptr(shared_ptr&& __r) _NOEXCEPT; + template<class _Yp> shared_ptr(shared_ptr<_Yp>&& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type = __nat()) + _NOEXCEPT; +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template<class _Yp> explicit shared_ptr(const weak_ptr<_Yp>& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type= __nat()); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template<class _Yp, + class = typename enable_if + < + is_convertible<_Yp*, element_type*>::value + >::type + > + shared_ptr(auto_ptr<_Yp>&& __r); +#else + template<class _Yp, + class = typename enable_if + < + is_convertible<_Yp*, element_type*>::value + >::type + > + shared_ptr(auto_ptr<_Yp> __r); +#endif +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Yp, class _Dp, + class = typename enable_if + < + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value + >::type + > + shared_ptr(unique_ptr<_Yp, _Dp>&&, + typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); + template <class _Yp, class _Dp, + class = typename enable_if + < + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value + >::type + > + shared_ptr(unique_ptr<_Yp, _Dp>&&, + typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Yp, class _Dp, + class = typename enable_if + < + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value + >::type + > shared_ptr(unique_ptr<_Yp, _Dp>, + typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); + template <class _Yp, class _Dp, + class = typename enable_if + < + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value + >::type + > + shared_ptr(unique_ptr<_Yp, _Dp>, + typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type = __nat()); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + ~shared_ptr(); + + shared_ptr& operator=(const shared_ptr& __r) _NOEXCEPT; + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + shared_ptr& + >::type + operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT; + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + shared_ptr<_Tp>& + >::type + operator=(shared_ptr<_Yp>&& __r); + template<class _Yp> + typename enable_if + < + !is_array<_Yp>::value && + is_convertible<_Yp*, element_type*>::value, + shared_ptr& + >::type + operator=(auto_ptr<_Yp>&& __r); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template<class _Yp> + typename enable_if + < + !is_array<_Yp>::value && + is_convertible<_Yp*, element_type*>::value, + shared_ptr& + >::type + operator=(auto_ptr<_Yp> __r); +#endif + template <class _Yp, class _Dp> + typename enable_if + < + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, element_type*>::value, + shared_ptr& + >::type +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + operator=(unique_ptr<_Yp, _Dp>&& __r); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + operator=(unique_ptr<_Yp, _Dp> __r); +#endif + + void swap(shared_ptr& __r) _NOEXCEPT; + void reset() _NOEXCEPT; + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + void + >::type + reset(_Yp* __p); + template<class _Yp, class _Dp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + void + >::type + reset(_Yp* __p, _Dp __d); + template<class _Yp, class _Dp, class _Alloc> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + void + >::type + reset(_Yp* __p, _Dp __d, _Alloc __a); + + _LIBCPP_INLINE_VISIBILITY + element_type* get() const _NOEXCEPT {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY + typename add_lvalue_reference<element_type>::type operator*() const _NOEXCEPT + {return *__ptr_;} + _LIBCPP_INLINE_VISIBILITY + element_type* operator->() const _NOEXCEPT {return __ptr_;} + _LIBCPP_INLINE_VISIBILITY + long use_count() const _NOEXCEPT {return __cntrl_ ? __cntrl_->use_count() : 0;} + _LIBCPP_INLINE_VISIBILITY + bool unique() const _NOEXCEPT {return use_count() == 1;} + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_EXPLICIT operator bool() const _NOEXCEPT {return get() != 0;} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY + bool owner_before(shared_ptr<_Up> const& __p) const + {return __cntrl_ < __p.__cntrl_;} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY + bool owner_before(weak_ptr<_Up> const& __p) const + {return __cntrl_ < __p.__cntrl_;} + +#ifndef _LIBCPP_NO_RTTI + template <class _Dp> + _LIBCPP_INLINE_VISIBILITY + _Dp* __get_deleter() const _NOEXCEPT + {return (_Dp*)(__cntrl_ ? __cntrl_->__get_deleter(typeid(_Dp)) : 0);} +#endif // _LIBCPP_NO_RTTI + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template<class ..._Args> + static + shared_ptr<_Tp> + make_shared(_Args&& ...__args); + + template<class _Alloc, class ..._Args> + static + shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _Args&& ...__args); + +#else // _LIBCPP_HAS_NO_VARIADICS + + static shared_ptr<_Tp> make_shared(); + + template<class _A0> + static shared_ptr<_Tp> make_shared(_A0&); + + template<class _A0, class _A1> + static shared_ptr<_Tp> make_shared(_A0&, _A1&); + + template<class _A0, class _A1, class _A2> + static shared_ptr<_Tp> make_shared(_A0&, _A1&, _A2&); + + template<class _Alloc> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a); + + template<class _Alloc, class _A0> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0); + + template<class _Alloc, class _A0, class _A1> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1); + + template<class _Alloc, class _A0, class _A1, class _A2> + static shared_ptr<_Tp> + allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2); + +#endif // _LIBCPP_HAS_NO_VARIADICS + +private: + + template <class _Yp> + _LIBCPP_INLINE_VISIBILITY + void + __enable_weak_this(const enable_shared_from_this<_Yp>* __e) _NOEXCEPT + { + if (__e) + __e->__weak_this_ = *this; + } + + _LIBCPP_INLINE_VISIBILITY + void __enable_weak_this(const void*) _NOEXCEPT {} + + template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; + template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; +}; + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr() _NOEXCEPT + : __ptr_(0), + __cntrl_(0) +{ +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(nullptr_t) _NOEXCEPT + : __ptr_(0), + __cntrl_(0) +{ +} + +template<class _Tp> +template<class _Yp, class> +shared_ptr<_Tp>::shared_ptr(_Yp* __p) + : __ptr_(__p) +{ + unique_ptr<_Yp> __hold(__p); + typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), allocator<_Yp>()); + __hold.release(); + __enable_weak_this(__p); +} + +template<class _Tp> +template<class _Yp, class _Dp, class> +shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d) + : __ptr_(__p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Yp>()); + __enable_weak_this(__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __d(__p); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Tp> +template<class _Dp> +shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d) + : __ptr_(0) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef __shared_ptr_pointer<nullptr_t, _Dp, allocator<_Tp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__p, __d, allocator<_Tp>()); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __d(__p); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Tp> +template<class _Yp, class _Dp, class _Alloc, class> +shared_ptr<_Tp>::shared_ptr(_Yp* __p, _Dp __d, _Alloc __a) + : __ptr_(__p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef __shared_ptr_pointer<_Yp*, _Dp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); + __cntrl_ = __hold2.release(); + __enable_weak_this(__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __d(__p); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Tp> +template<class _Dp, class _Alloc> +shared_ptr<_Tp>::shared_ptr(nullptr_t __p, _Dp __d, _Alloc __a) + : __ptr_(0) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef __shared_ptr_pointer<nullptr_t, _Dp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(__hold2.get()) _CntrlBlk(__p, __d, __a); + __cntrl_ = __hold2.release(); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __d(__p); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, element_type *__p) _NOEXCEPT + : __ptr_(__p), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_shared(); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(const shared_ptr& __r) _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_shared(); +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(const shared_ptr<_Yp>& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) + _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_shared(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(shared_ptr&& __r) _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + __r.__ptr_ = 0; + __r.__cntrl_ = 0; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>::shared_ptr(shared_ptr<_Yp>&& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) + _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + __r.__ptr_ = 0; + __r.__cntrl_ = 0; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +template<class _Yp, class> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp>&& __r) +#else +shared_ptr<_Tp>::shared_ptr(auto_ptr<_Yp> __r) +#endif + : __ptr_(__r.get()) +{ + typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, allocator<_Yp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__r.get(), default_delete<_Yp>(), allocator<_Yp>()); + __enable_weak_this(__r.get()); + __r.release(); +} + +template<class _Tp> +template <class _Yp, class _Dp, class> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, +#else +shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, +#endif + typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type) + : __ptr_(__r.get()) +{ + typedef __shared_ptr_pointer<_Yp*, _Dp, allocator<_Yp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__r.get(), __r.get_deleter(), allocator<_Yp>()); + __enable_weak_this(__r.get()); + __r.release(); +} + +template<class _Tp> +template <class _Yp, class _Dp, class> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp>&& __r, +#else +shared_ptr<_Tp>::shared_ptr(unique_ptr<_Yp, _Dp> __r, +#endif + typename enable_if<is_lvalue_reference<_Dp>::value, __nat>::type) + : __ptr_(__r.get()) +{ + typedef __shared_ptr_pointer<_Yp*, + reference_wrapper<typename remove_reference<_Dp>::type>, + allocator<_Yp> > _CntrlBlk; + __cntrl_ = new _CntrlBlk(__r.get(), ref(__r.get_deleter()), allocator<_Yp>()); + __enable_weak_this(__r.get()); + __r.release(); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +template<class ..._Args> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_Args&& ...__args) +{ + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2; + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a2, _VSTD::forward<_Args>(__args)...); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class ..._Args> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _Args&& ...__args) +{ + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _A2; + typedef __allocator_destructor<_A2> _D2; + _A2 __a2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__a2.allocate(1), _D2(__a2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a, _VSTD::forward<_Args>(__args)...); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +#else // _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared() +{ + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0) +{ + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0, class _A1> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1) +{ + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _A0, class _A1, class _A2> +shared_ptr<_Tp> +shared_ptr<_Tp>::make_shared(_A0& __a0, _A1& __a1, _A2& __a2) +{ + typedef __shared_ptr_emplace<_Tp, allocator<_Tp> > _CntrlBlk; + typedef allocator<_CntrlBlk> _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2; + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__alloc2, __a0, __a1, __a2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a) +{ + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0) +{ + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a, __a0); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0, class _A1> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) +{ + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +template<class _Tp> +template<class _Alloc, class _A0, class _A1, class _A2> +shared_ptr<_Tp> +shared_ptr<_Tp>::allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) +{ + typedef __shared_ptr_emplace<_Tp, _Alloc> _CntrlBlk; + typedef typename _Alloc::template rebind<_CntrlBlk>::other _Alloc2; + typedef __allocator_destructor<_Alloc2> _D2; + _Alloc2 __alloc2(__a); + unique_ptr<_CntrlBlk, _D2> __hold2(__alloc2.allocate(1), _D2(__alloc2, 1)); + ::new(__hold2.get()) _CntrlBlk(__a, __a0, __a1, __a2); + shared_ptr<_Tp> __r; + __r.__ptr_ = __hold2.get()->get(); + __r.__cntrl_ = __hold2.release(); + __r.__enable_weak_this(__r.__ptr_); + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +shared_ptr<_Tp>::~shared_ptr() +{ + if (__cntrl_) + __cntrl_->__release_shared(); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>& +shared_ptr<_Tp>::operator=(const shared_ptr& __r) _NOEXCEPT +{ + shared_ptr(__r).swap(*this); + return *this; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT +{ + shared_ptr(__r).swap(*this); + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp>& +shared_ptr<_Tp>::operator=(shared_ptr&& __r) _NOEXCEPT +{ + shared_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(shared_ptr<_Yp>&& __r) +{ + shared_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Yp>::value && + is_convertible<_Yp*, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(auto_ptr<_Yp>&& __r) +{ + shared_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +template<class _Tp> +template <class _Yp, class _Dp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp>&& __r) +{ + shared_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Yp>::value && + is_convertible<_Yp*, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(auto_ptr<_Yp> __r) +{ + shared_ptr(__r).swap(*this); + return *this; +} + +template<class _Tp> +template <class _Yp, class _Dp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Yp>::value && + is_convertible<typename unique_ptr<_Yp, _Dp>::pointer, _Tp*>::value, + shared_ptr<_Tp>& +>::type +shared_ptr<_Tp>::operator=(unique_ptr<_Yp, _Dp> __r) +{ + shared_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +shared_ptr<_Tp>::swap(shared_ptr& __r) _NOEXCEPT +{ + _VSTD::swap(__ptr_, __r.__ptr_); + _VSTD::swap(__cntrl_, __r.__cntrl_); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +shared_ptr<_Tp>::reset() _NOEXCEPT +{ + shared_ptr().swap(*this); +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + void +>::type +shared_ptr<_Tp>::reset(_Yp* __p) +{ + shared_ptr(__p).swap(*this); +} + +template<class _Tp> +template<class _Yp, class _Dp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + void +>::type +shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d) +{ + shared_ptr(__p, __d).swap(*this); +} + +template<class _Tp> +template<class _Yp, class _Dp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + void +>::type +shared_ptr<_Tp>::reset(_Yp* __p, _Dp __d, _Alloc __a) +{ + shared_ptr(__p, __d, __a).swap(*this); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Tp>::value, + shared_ptr<_Tp> +>::type +make_shared(_Args&& ...__args) +{ + return shared_ptr<_Tp>::make_shared(_VSTD::forward<_Args>(__args)...); +} + +template<class _Tp, class _Alloc, class ..._Args> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Tp>::value, + shared_ptr<_Tp> +>::type +allocate_shared(const _Alloc& __a, _Args&& ...__args) +{ + return shared_ptr<_Tp>::allocate_shared(__a, _VSTD::forward<_Args>(__args)...); +} + +#else // _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +make_shared() +{ + return shared_ptr<_Tp>::make_shared(); +} + +template<class _Tp, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +make_shared(_A0& __a0) +{ + return shared_ptr<_Tp>::make_shared(__a0); +} + +template<class _Tp, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +make_shared(_A0& __a0, _A1& __a1) +{ + return shared_ptr<_Tp>::make_shared(__a0, __a1); +} + +template<class _Tp, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +make_shared(_A0& __a0, _A1& __a1, _A2& __a2) +{ + return shared_ptr<_Tp>::make_shared(__a0, __a1, __a2); +} + +template<class _Tp, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +allocate_shared(const _Alloc& __a) +{ + return shared_ptr<_Tp>::allocate_shared(__a); +} + +template<class _Tp, class _Alloc, class _A0> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +allocate_shared(const _Alloc& __a, _A0& __a0) +{ + return shared_ptr<_Tp>::allocate_shared(__a, __a0); +} + +template<class _Tp, class _Alloc, class _A0, class _A1> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1) +{ + return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1); +} + +template<class _Tp, class _Alloc, class _A0, class _A1, class _A2> +inline _LIBCPP_INLINE_VISIBILITY +shared_ptr<_Tp> +allocate_shared(const _Alloc& __a, _A0& __a0, _A1& __a1, _A2& __a2) +{ + return shared_ptr<_Tp>::allocate_shared(__a, __a0, __a1, __a2); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + return __x.get() == __y.get(); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + return !(__x == __y); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + typedef typename common_type<_Tp*, _Up*>::type _V; + return less<_V>()(__x.get(), __y.get()); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + return __y < __x; +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + return !(__y < __x); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const shared_ptr<_Tp>& __x, const shared_ptr<_Up>& __y) _NOEXCEPT +{ + return !(__x < __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return !__x; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return !__x; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return static_cast<bool>(__x); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return static_cast<bool>(__x); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return less<_Tp*>()(__x.get(), nullptr); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return less<_Tp*>()(nullptr, __x.get()); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return nullptr < __x; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return __x < nullptr; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return !(nullptr < __x); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return !(__x < nullptr); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const shared_ptr<_Tp>& __x, nullptr_t) _NOEXCEPT +{ + return !(__x < nullptr); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(nullptr_t, const shared_ptr<_Tp>& __x) _NOEXCEPT +{ + return !(nullptr < __x); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(shared_ptr<_Tp>& __x, shared_ptr<_Tp>& __y) _NOEXCEPT +{ + __x.swap(__y); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Tp>::value && !is_array<_Up>::value, + shared_ptr<_Tp> +>::type +static_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT +{ + return shared_ptr<_Tp>(__r, static_cast<_Tp*>(__r.get())); +} + +template<class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_array<_Tp>::value && !is_array<_Up>::value, + shared_ptr<_Tp> +>::type +dynamic_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT +{ + _Tp* __p = dynamic_cast<_Tp*>(__r.get()); + return __p ? shared_ptr<_Tp>(__r, __p) : shared_ptr<_Tp>(); +} + +template<class _Tp, class _Up> +typename enable_if +< + is_array<_Tp>::value == is_array<_Up>::value, + shared_ptr<_Tp> +>::type +const_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT +{ + typedef typename remove_extent<_Tp>::type _RTp; + return shared_ptr<_Tp>(__r, const_cast<_RTp*>(__r.get())); +} + +#ifndef _LIBCPP_NO_RTTI + +template<class _Dp, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Dp* +get_deleter(const shared_ptr<_Tp>& __p) _NOEXCEPT +{ + return __p.template __get_deleter<_Dp>(); +} + +#endif // _LIBCPP_NO_RTTI + +template<class _Tp> +class _LIBCPP_VISIBLE weak_ptr +{ +public: + typedef _Tp element_type; +private: + element_type* __ptr_; + __shared_weak_count* __cntrl_; + +public: + weak_ptr() _NOEXCEPT; + template<class _Yp> weak_ptr(shared_ptr<_Yp> const& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) + _NOEXCEPT; + weak_ptr(weak_ptr const& __r) _NOEXCEPT; + template<class _Yp> weak_ptr(weak_ptr<_Yp> const& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) + _NOEXCEPT; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + weak_ptr(weak_ptr&& __r) _NOEXCEPT; + template<class _Yp> weak_ptr(weak_ptr<_Yp>&& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type = 0) + _NOEXCEPT; +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + ~weak_ptr(); + + weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT; + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + weak_ptr& + >::type + operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + weak_ptr& operator=(weak_ptr&& __r) _NOEXCEPT; + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + weak_ptr& + >::type + operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template<class _Yp> + typename enable_if + < + is_convertible<_Yp*, element_type*>::value, + weak_ptr& + >::type + operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT; + + void swap(weak_ptr& __r) _NOEXCEPT; + void reset() _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + long use_count() const _NOEXCEPT + {return __cntrl_ ? __cntrl_->use_count() : 0;} + _LIBCPP_INLINE_VISIBILITY + bool expired() const _NOEXCEPT + {return __cntrl_ == 0 || __cntrl_->use_count() == 0;} + shared_ptr<_Tp> lock() const _NOEXCEPT; + template<class _Up> + _LIBCPP_INLINE_VISIBILITY + bool owner_before(const shared_ptr<_Up>& __r) const + {return __cntrl_ < __r.__cntrl_;} + template<class _Up> + _LIBCPP_INLINE_VISIBILITY + bool owner_before(const weak_ptr<_Up>& __r) const + {return __cntrl_ < __r.__cntrl_;} + + template <class _Up> friend class _LIBCPP_VISIBLE weak_ptr; + template <class _Up> friend class _LIBCPP_VISIBLE shared_ptr; +}; + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr() _NOEXCEPT + : __ptr_(0), + __cntrl_(0) +{ +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr(weak_ptr const& __r) _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_weak(); +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr(shared_ptr<_Yp> const& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) + _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_weak(); +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp> const& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) + _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + if (__cntrl_) + __cntrl_->__add_weak(); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr(weak_ptr&& __r) _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + __r.__ptr_ = 0; + __r.__cntrl_ = 0; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>::weak_ptr(weak_ptr<_Yp>&& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat*>::type) + _NOEXCEPT + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_) +{ + __r.__ptr_ = 0; + __r.__cntrl_ = 0; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +weak_ptr<_Tp>::~weak_ptr() +{ + if (__cntrl_) + __cntrl_->__release_weak(); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>& +weak_ptr<_Tp>::operator=(weak_ptr const& __r) _NOEXCEPT +{ + weak_ptr(__r).swap(*this); + return *this; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + weak_ptr<_Tp>& +>::type +weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT +{ + weak_ptr(__r).swap(*this); + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +weak_ptr<_Tp>& +weak_ptr<_Tp>::operator=(weak_ptr&& __r) _NOEXCEPT +{ + weak_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + weak_ptr<_Tp>& +>::type +weak_ptr<_Tp>::operator=(weak_ptr<_Yp>&& __r) _NOEXCEPT +{ + weak_ptr(_VSTD::move(__r)).swap(*this); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _Tp> +template<class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Yp*, _Tp*>::value, + weak_ptr<_Tp>& +>::type +weak_ptr<_Tp>::operator=(shared_ptr<_Yp> const& __r) _NOEXCEPT +{ + weak_ptr(__r).swap(*this); + return *this; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +weak_ptr<_Tp>::swap(weak_ptr& __r) _NOEXCEPT +{ + _VSTD::swap(__ptr_, __r.__ptr_); + _VSTD::swap(__cntrl_, __r.__cntrl_); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(weak_ptr<_Tp>& __x, weak_ptr<_Tp>& __y) _NOEXCEPT +{ + __x.swap(__y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +weak_ptr<_Tp>::reset() _NOEXCEPT +{ + weak_ptr().swap(*this); +} + +template<class _Tp> +template<class _Yp> +shared_ptr<_Tp>::shared_ptr(const weak_ptr<_Yp>& __r, + typename enable_if<is_convertible<_Yp*, _Tp*>::value, __nat>::type) + : __ptr_(__r.__ptr_), + __cntrl_(__r.__cntrl_ ? __r.__cntrl_->lock() : __r.__cntrl_) +{ + if (__cntrl_ == 0) +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_weak_ptr(); +#else + assert(!"bad_weak_ptr"); +#endif +} + +template<class _Tp> +shared_ptr<_Tp> +weak_ptr<_Tp>::lock() const _NOEXCEPT +{ + shared_ptr<_Tp> __r; + __r.__cntrl_ = __cntrl_ ? __cntrl_->lock() : __cntrl_; + if (__r.__cntrl_) + __r.__ptr_ = __ptr_; + return __r; +} + +template <class _Tp> struct owner_less; + +template <class _Tp> +struct _LIBCPP_VISIBLE owner_less<shared_ptr<_Tp> > + : binary_function<shared_ptr<_Tp>, shared_ptr<_Tp>, bool> +{ + typedef bool result_type; + _LIBCPP_INLINE_VISIBILITY + bool operator()(shared_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE owner_less<weak_ptr<_Tp> > + : binary_function<weak_ptr<_Tp>, weak_ptr<_Tp>, bool> +{ + typedef bool result_type; + _LIBCPP_INLINE_VISIBILITY + bool operator()( weak_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(shared_ptr<_Tp> const& __x, weak_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()( weak_ptr<_Tp> const& __x, shared_ptr<_Tp> const& __y) const + {return __x.owner_before(__y);} +}; + +template<class _Tp> +class _LIBCPP_VISIBLE enable_shared_from_this +{ + mutable weak_ptr<_Tp> __weak_this_; +protected: + _LIBCPP_INLINE_VISIBILITY + enable_shared_from_this() _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY + enable_shared_from_this(enable_shared_from_this const&) _NOEXCEPT {} + _LIBCPP_INLINE_VISIBILITY + enable_shared_from_this& operator=(enable_shared_from_this const&) _NOEXCEPT + {return *this;} + _LIBCPP_INLINE_VISIBILITY + ~enable_shared_from_this() {} +public: + _LIBCPP_INLINE_VISIBILITY + shared_ptr<_Tp> shared_from_this() + {return shared_ptr<_Tp>(__weak_this_);} + _LIBCPP_INLINE_VISIBILITY + shared_ptr<_Tp const> shared_from_this() const + {return shared_ptr<const _Tp>(__weak_this_);} + + template <class _Up> friend class shared_ptr; +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE hash<shared_ptr<_Tp> > +{ + typedef shared_ptr<_Tp> argument_type; + typedef size_t result_type; + _LIBCPP_INLINE_VISIBILITY + result_type operator()(const argument_type& __ptr) const _NOEXCEPT + { + return hash<_Tp*>()(__ptr.get()); + } +}; + +template<class _CharT, class _Traits, class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p); + +//enum class +struct _LIBCPP_VISIBLE pointer_safety +{ + enum _ + { + relaxed, + preferred, + strict + }; + + _ __v_; + + _LIBCPP_INLINE_VISIBILITY + pointer_safety(_ __v) : __v_(__v) {} + _LIBCPP_INLINE_VISIBILITY + operator int() const {return __v_;} +}; + +void declare_reachable(void* __p); +void declare_no_pointers(char* __p, size_t __n); +void undeclare_no_pointers(char* __p, size_t __n); +pointer_safety get_pointer_safety() _NOEXCEPT; +void* __undeclare_reachable(void* __p); + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +undeclare_reachable(_Tp* __p) +{ + return static_cast<_Tp*>(__undeclare_reachable(__p)); +} + +void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_MEMORY diff --git a/contrib/libc++/include/mutex b/contrib/libc++/include/mutex new file mode 100644 index 0000000..62b733f --- /dev/null +++ b/contrib/libc++/include/mutex @@ -0,0 +1,564 @@ +// -*- C++ -*- +//===--------------------------- mutex ------------------------------------===// +// +// 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_MUTEX +#define _LIBCPP_MUTEX + +/* + mutex synopsis + +namespace std +{ + +class mutex +{ +public: + mutex(); + ~mutex(); + + mutex(const mutex&) = delete; + mutex& operator=(const mutex&) = delete; + + void lock(); + bool try_lock(); + void unlock(); + + typedef pthread_mutex_t* native_handle_type; + native_handle_type native_handle(); +}; + +class recursive_mutex +{ +public: + recursive_mutex(); + ~recursive_mutex(); + + recursive_mutex(const recursive_mutex&) = delete; + recursive_mutex& operator=(const recursive_mutex&) = delete; + + void lock(); + bool try_lock(); + void unlock(); + + typedef pthread_mutex_t* native_handle_type; + native_handle_type native_handle(); +}; + +class timed_mutex +{ +public: + timed_mutex(); + ~timed_mutex(); + + timed_mutex(const timed_mutex&) = delete; + timed_mutex& operator=(const timed_mutex&) = delete; + + void lock(); + bool try_lock(); + template <class Rep, class Period> + bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); + template <class Clock, class Duration> + bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); + void unlock(); +}; + +class recursive_timed_mutex +{ +public: + recursive_timed_mutex(); + ~recursive_timed_mutex(); + + recursive_timed_mutex(const recursive_timed_mutex&) = delete; + recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete; + + void lock(); + bool try_lock(); + template <class Rep, class Period> + bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); + template <class Clock, class Duration> + bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); + void unlock(); +}; + +struct defer_lock_t {}; +struct try_to_lock_t {}; +struct adopt_lock_t {}; + +constexpr defer_lock_t defer_lock{}; +constexpr try_to_lock_t try_to_lock{}; +constexpr adopt_lock_t adopt_lock{}; + +template <class Mutex> +class lock_guard +{ +public: + typedef Mutex mutex_type; + + explicit lock_guard(mutex_type& m); + lock_guard(mutex_type& m, adopt_lock_t); + ~lock_guard(); + + lock_guard(lock_guard const&) = delete; + lock_guard& operator=(lock_guard const&) = delete; +}; + +template <class Mutex> +class unique_lock +{ +public: + typedef Mutex mutex_type; + unique_lock(); + explicit unique_lock(mutex_type& m); + unique_lock(mutex_type& m, defer_lock_t); + unique_lock(mutex_type& m, try_to_lock_t); + unique_lock(mutex_type& m, adopt_lock_t); + template <class Clock, class Duration> + unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time); + template <class Rep, class Period> + unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time); + ~unique_lock(); + + unique_lock(unique_lock const&) = delete; + unique_lock& operator=(unique_lock const&) = delete; + + unique_lock(unique_lock&& u); + unique_lock& operator=(unique_lock&& u); + + void lock(); + bool try_lock(); + + template <class Rep, class Period> + bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); + template <class Clock, class Duration> + bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); + + void unlock(); + + void swap(unique_lock& u); + mutex_type* release(); + + bool owns_lock() const; + explicit operator bool () const; + mutex_type* mutex() const; +}; + +template <class Mutex> + void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y); + +template <class L1, class L2, class... L3> + int try_lock(L1&, L2&, L3&...); +template <class L1, class L2, class... L3> + void lock(L1&, L2&, L3&...); + +struct once_flag +{ + constexpr once_flag(); + + once_flag(const once_flag&) = delete; + once_flag& operator=(const once_flag&) = delete; +}; + +template<class Callable, class ...Args> + void call_once(once_flag& flag, Callable&& func, Args&&... args); + +} // std + +*/ + +#include <__config> +#include <__mutex_base> +#include <functional> +#ifndef _LIBCPP_HAS_NO_VARIADICS +#include <tuple> +#endif + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_VISIBLE recursive_mutex +{ + pthread_mutex_t __m_; + +public: + recursive_mutex(); + ~recursive_mutex(); + +private: + recursive_mutex(const recursive_mutex&); // = delete; + recursive_mutex& operator=(const recursive_mutex&); // = delete; + +public: + void lock(); + bool try_lock(); + void unlock(); + + typedef pthread_mutex_t* native_handle_type; + _LIBCPP_INLINE_VISIBILITY + native_handle_type native_handle() {return &__m_;} +}; + +class _LIBCPP_VISIBLE timed_mutex +{ + mutex __m_; + condition_variable __cv_; + bool __locked_; +public: + timed_mutex(); + ~timed_mutex(); + +private: + timed_mutex(const timed_mutex&); // = delete; + timed_mutex& operator=(const timed_mutex&); // = delete; + +public: + void lock(); + bool try_lock(); + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + bool try_lock_for(const chrono::duration<_Rep, _Period>& __d) + {return try_lock_until(chrono::steady_clock::now() + __d);} + template <class _Clock, class _Duration> + bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t); + void unlock(); +}; + +template <class _Clock, class _Duration> +bool +timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t) +{ + using namespace chrono; + unique_lock<mutex> __lk(__m_); + bool no_timeout = _Clock::now() < __t; + while (no_timeout && __locked_) + no_timeout = __cv_.wait_until(__lk, __t) == cv_status::no_timeout; + if (!__locked_) + { + __locked_ = true; + return true; + } + return false; +} + +class _LIBCPP_VISIBLE recursive_timed_mutex +{ + mutex __m_; + condition_variable __cv_; + size_t __count_; + pthread_t __id_; +public: + recursive_timed_mutex(); + ~recursive_timed_mutex(); + +private: + recursive_timed_mutex(const recursive_timed_mutex&); // = delete; + recursive_timed_mutex& operator=(const recursive_timed_mutex&); // = delete; + +public: + void lock(); + bool try_lock(); + template <class _Rep, class _Period> + _LIBCPP_INLINE_VISIBILITY + bool try_lock_for(const chrono::duration<_Rep, _Period>& __d) + {return try_lock_until(chrono::steady_clock::now() + __d);} + template <class _Clock, class _Duration> + bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t); + void unlock(); +}; + +template <class _Clock, class _Duration> +bool +recursive_timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t) +{ + using namespace chrono; + pthread_t __id = pthread_self(); + unique_lock<mutex> lk(__m_); + if (pthread_equal(__id, __id_)) + { + if (__count_ == numeric_limits<size_t>::max()) + return false; + ++__count_; + return true; + } + bool no_timeout = _Clock::now() < __t; + while (no_timeout && __count_ != 0) + no_timeout = __cv_.wait_until(lk, __t) == cv_status::no_timeout; + if (__count_ == 0) + { + __count_ = 1; + __id_ = __id; + return true; + } + return false; +} + +template <class _L0, class _L1> +int +try_lock(_L0& __l0, _L1& __l1) +{ + unique_lock<_L0> __u0(__l0, try_to_lock); + if (__u0.owns_lock()) + { + if (__l1.try_lock()) + { + __u0.release(); + return -1; + } + else + return 1; + } + return 0; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _L0, class _L1, class _L2, class... _L3> +int +try_lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) +{ + int __r = 0; + unique_lock<_L0> __u0(__l0, try_to_lock); + if (__u0.owns_lock()) + { + __r = try_lock(__l1, __l2, __l3...); + if (__r == -1) + __u0.release(); + else + ++__r; + } + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _L0, class _L1> +void +lock(_L0& __l0, _L1& __l1) +{ + while (true) + { + { + unique_lock<_L0> __u0(__l0); + if (__l1.try_lock()) + { + __u0.release(); + break; + } + } + sched_yield(); + { + unique_lock<_L1> __u1(__l1); + if (__l0.try_lock()) + { + __u1.release(); + break; + } + } + sched_yield(); + } +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _L0, class _L1, class _L2, class ..._L3> +void +__lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3) +{ + while (true) + { + switch (__i) + { + case 0: + { + unique_lock<_L0> __u0(__l0); + __i = try_lock(__l1, __l2, __l3...); + if (__i == -1) + { + __u0.release(); + return; + } + } + ++__i; + sched_yield(); + break; + case 1: + { + unique_lock<_L1> __u1(__l1); + __i = try_lock(__l2, __l3..., __l0); + if (__i == -1) + { + __u1.release(); + return; + } + } + if (__i == sizeof...(_L3) + 1) + __i = 0; + else + __i += 2; + sched_yield(); + break; + default: + __lock_first(__i - 2, __l2, __l3..., __l0, __l1); + return; + } + } +} + +template <class _L0, class _L1, class _L2, class ..._L3> +inline _LIBCPP_INLINE_VISIBILITY +void +lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3) +{ + __lock_first(0, __l0, __l1, __l2, __l3...); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +struct once_flag; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template<class _Callable, class... _Args> + void call_once(once_flag&, _Callable&&, _Args&&...); + +#else // _LIBCPP_HAS_NO_VARIADICS + +template<class _Callable> + void call_once(once_flag&, _Callable); + +#endif // _LIBCPP_HAS_NO_VARIADICS + +struct _LIBCPP_VISIBLE once_flag +{ + _LIBCPP_INLINE_VISIBILITY + // constexpr + once_flag() {} + +private: + once_flag(const once_flag&); // = delete; + once_flag& operator=(const once_flag&); // = delete; + + unsigned long __state_; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + template<class _Callable, class... _Args> + friend + void call_once(once_flag&, _Callable&&, _Args&&...); +#else // _LIBCPP_HAS_NO_VARIADICS + template<class _Callable> + friend + void call_once(once_flag&, _Callable); +#endif // _LIBCPP_HAS_NO_VARIADICS +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Fp> +class __call_once_param +{ + _Fp __f_; +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit __call_once_param(_Fp&& __f) : __f_(_VSTD::move(__f)) {} +#else + _LIBCPP_INLINE_VISIBILITY + explicit __call_once_param(const _Fp& __f) : __f_(__f) {} +#endif + + _LIBCPP_INLINE_VISIBILITY + void operator()() + { + typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 1>::type _Index; + __execute(_Index()); + } + +private: + template <size_t ..._Indices> + _LIBCPP_INLINE_VISIBILITY + void __execute(__tuple_indices<_Indices...>) + { + __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...); + } +}; + +#else + +template <class _Fp> +class __call_once_param +{ + _Fp __f_; +public: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit __call_once_param(_Fp&& __f) : __f_(_VSTD::move(__f)) {} +#else + _LIBCPP_INLINE_VISIBILITY + explicit __call_once_param(const _Fp& __f) : __f_(__f) {} +#endif + + _LIBCPP_INLINE_VISIBILITY + void operator()() + { + __f_(); + } +}; + +#endif + +template <class _Fp> +void +__call_once_proxy(void* __vp) +{ + __call_once_param<_Fp>* __p = static_cast<__call_once_param<_Fp>*>(__vp); + (*__p)(); +} + +void __call_once(volatile unsigned long&, void*, void(*)(void*)); + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template<class _Callable, class... _Args> +inline _LIBCPP_INLINE_VISIBILITY +void +call_once(once_flag& __flag, _Callable&& __func, _Args&&... __args) +{ + if (__flag.__state_ != ~0ul) + { + typedef tuple<typename decay<_Callable>::type, typename decay<_Args>::type...> _Gp; + __call_once_param<_Gp> __p(_Gp(__decay_copy(_VSTD::forward<_Callable>(__func)), + __decay_copy(_VSTD::forward<_Args>(__args))...)); + __call_once(__flag.__state_, &__p, &__call_once_proxy<_Gp>); + } +} + +#else // _LIBCPP_HAS_NO_VARIADICS + +template<class _Callable> +inline _LIBCPP_INLINE_VISIBILITY +void +call_once(once_flag& __flag, _Callable __func) +{ + if (__flag.__state_ != ~0ul) + { + __call_once_param<_Callable> __p(__func); + __call_once(__flag.__state_, &__p, &__call_once_proxy<_Callable>); + } +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_MUTEX diff --git a/contrib/libc++/include/new b/contrib/libc++/include/new new file mode 100644 index 0000000..5bcbad0 --- /dev/null +++ b/contrib/libc++/include/new @@ -0,0 +1,117 @@ +// -*- C++ -*- +//===----------------------------- new ------------------------------------===// +// +// 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_NEW +#define _LIBCPP_NEW + +/* + new synopsis + +namespace std +{ + +class bad_alloc + : public exception +{ +public: + bad_alloc() noexcept; + bad_alloc(const bad_alloc&) noexcept; + bad_alloc& operator=(const bad_alloc&) noexcept; + virtual const char* what() const noexcept; +}; + +struct nothrow_t {}; +extern const nothrow_t nothrow; +typedef void (*new_handler)(); +new_handler set_new_handler(new_handler new_p) noexcept; +new_handler get_new_handler() noexcept; + +} // std + +void* operator new(std::size_t size); // replaceable +void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // replaceable +void operator delete(void* ptr) noexcept; // replaceable +void operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable + +void* operator new[](std::size_t size); // replaceable +void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable +void operator delete[](void* ptr) noexcept; // replaceable +void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable + +void* operator new (std::size_t size, void* ptr) noexcept; +void* operator new[](std::size_t size, void* ptr) noexcept; +void operator delete (void* ptr, void*) noexcept; +void operator delete[](void* ptr, void*) noexcept; + +*/ + +#include <__config> +#include <exception> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not using versioning namespace +{ + +class _LIBCPP_EXCEPTION_ABI bad_alloc + : public exception +{ +public: + bad_alloc() _NOEXCEPT; + virtual ~bad_alloc() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI bad_array_new_length + : public bad_alloc +{ +public: + bad_array_new_length() _NOEXCEPT; + virtual ~bad_array_new_length() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +void __throw_bad_alloc(); // not in C++ spec + +struct _LIBCPP_VISIBLE nothrow_t {}; +extern _LIBCPP_VISIBLE const nothrow_t nothrow; +typedef void (*new_handler)(); +_LIBCPP_VISIBLE new_handler set_new_handler(new_handler) _NOEXCEPT; +_LIBCPP_VISIBLE new_handler get_new_handler() _NOEXCEPT; + +} // std + +_LIBCPP_VISIBLE void* operator new(std::size_t __sz) +#if !__has_feature(cxx_noexcept) + throw(std::bad_alloc) +#endif +; +_LIBCPP_VISIBLE void* operator new(std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; +_LIBCPP_VISIBLE void operator delete(void* __p) _NOEXCEPT; +_LIBCPP_VISIBLE void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT; + +_LIBCPP_VISIBLE void* operator new[](std::size_t __sz) +#if !__has_feature(cxx_noexcept) + throw(std::bad_alloc) +#endif +; +_LIBCPP_VISIBLE void* operator new[](std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; +_LIBCPP_VISIBLE void operator delete[](void* __p) _NOEXCEPT; +_LIBCPP_VISIBLE void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT; + +_LIBCPP_INLINE_VISIBILITY inline void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;} +_LIBCPP_INLINE_VISIBILITY inline void* operator new[](std::size_t, void* __p) _NOEXCEPT {return __p;} +_LIBCPP_INLINE_VISIBILITY inline void operator delete (void*, void*) _NOEXCEPT {} +_LIBCPP_INLINE_VISIBILITY inline void operator delete[](void*, void*) _NOEXCEPT {} + +#endif // _LIBCPP_NEW diff --git a/contrib/libc++/include/numeric b/contrib/libc++/include/numeric new file mode 100644 index 0000000..c201a5f --- /dev/null +++ b/contrib/libc++/include/numeric @@ -0,0 +1,197 @@ +// -*- C++ -*- +//===---------------------------- numeric ---------------------------------===// +// +// 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_NUMERIC +#define _LIBCPP_NUMERIC + +/* + numeric synopsis + +namespace std +{ + +template <class InputIterator, class T> + T + accumulate(InputIterator first, InputIterator last, T init); + +template <class InputIterator, class T, class BinaryOperation> + T + accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op); + +template <class InputIterator1, class InputIterator2, class T> + T + inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, T init); + +template <class InputIterator1, class InputIterator2, class T, class BinaryOperation1, class BinaryOperation2> + T + inner_product(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, + T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2); + +template <class InputIterator, class OutputIterator> + OutputIterator + partial_sum(InputIterator first, InputIterator last, OutputIterator result); + +template <class InputIterator, class OutputIterator, class BinaryOperation> + OutputIterator + partial_sum(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); + +template <class InputIterator, class OutputIterator> + OutputIterator + adjacent_difference(InputIterator first, InputIterator last, OutputIterator result); + +template <class InputIterator, class OutputIterator, class BinaryOperation> + OutputIterator + adjacent_difference(InputIterator first, InputIterator last, OutputIterator result, BinaryOperation binary_op); + +template <class ForwardIterator, class T> + void iota(ForwardIterator first, ForwardIterator last, T value); + +} // std + +*/ + +#include <__config> +#include <iterator> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _InputIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) +{ + for (; __first != __last; ++__first) + __init = __init + *__first; + return __init; +} + +template <class _InputIterator, class _Tp, class _BinaryOperation> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) +{ + for (; __first != __last; ++__first) + __init = __binary_op(__init, *__first); + return __init; +} + +template <class _InputIterator1, class _InputIterator2, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) +{ + for (; __first1 != __last1; ++__first1, ++__first2) + __init = __init + *__first1 * *__first2; + return __init; +} + +template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, + _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) +{ + for (; __first1 != __last1; ++__first1, ++__first2) + __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); + return __init; +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + if (__first != __last) + { + typename iterator_traits<_InputIterator>::value_type __t(*__first); + *__result = __t; + for (++__first, ++__result; __first != __last; ++__first, ++__result) + { + __t = __t + *__first; + *__result = __t; + } + } + return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOperation> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + _BinaryOperation __binary_op) +{ + if (__first != __last) + { + typename iterator_traits<_InputIterator>::value_type __t(*__first); + *__result = __t; + for (++__first, ++__result; __first != __last; ++__first, ++__result) + { + __t = __binary_op(__t, *__first); + *__result = __t; + } + } + return __result; +} + +template <class _InputIterator, class _OutputIterator> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ + if (__first != __last) + { + typename iterator_traits<_InputIterator>::value_type __t1(*__first); + *__result = __t1; + for (++__first, ++__result; __first != __last; ++__first, ++__result) + { + typename iterator_traits<_InputIterator>::value_type __t2(*__first); + *__result = __t2 - __t1; + __t1 = __t2; + } + } + return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOperation> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + _BinaryOperation __binary_op) +{ + if (__first != __last) + { + typename iterator_traits<_InputIterator>::value_type __t1(*__first); + *__result = __t1; + for (++__first, ++__result; __first != __last; ++__first, ++__result) + { + typename iterator_traits<_InputIterator>::value_type __t2(*__first); + *__result = __binary_op(__t2, __t1); + __t1 = __t2; + } + } + return __result; +} + +template <class _ForwardIterator, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_) +{ + for (; __first != __last; ++__first, ++__value_) + *__first = __value_; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_NUMERIC diff --git a/contrib/libc++/include/ostream b/contrib/libc++/include/ostream new file mode 100644 index 0000000..e6dd4b5 --- /dev/null +++ b/contrib/libc++/include/ostream @@ -0,0 +1,1295 @@ +// -*- C++ -*- +//===-------------------------- ostream -----------------------------------===// +// +// 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_OSTREAM +#define _LIBCPP_OSTREAM + +/* + ostream synopsis + +template <class charT, class traits = char_traits<charT> > +class basic_ostream + : virtual public basic_ios<charT,traits> +{ +public: + // types (inherited from basic_ios (27.5.4)): + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // 27.7.2.2 Constructor/destructor: + explicit basic_ostream(basic_streambuf<char_type,traits>* sb); + basic_ostream(basic_ostream&& rhs); + virtual ~basic_ostream(); + + // 27.7.2.3 Assign/swap + basic_ostream& operator=(basic_ostream&& rhs); + void swap(basic_ostream& rhs); + + // 27.7.2.4 Prefix/suffix: + class sentry; + + // 27.7.2.6 Formatted output: + basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); + basic_ostream& operator<<(basic_ios<charT, traits>& (*pf)(basic_ios<charT,traits>&)); + basic_ostream& operator<<(ios_base& (*pf)(ios_base&)); + basic_ostream& operator<<(bool n); + basic_ostream& operator<<(short n); + basic_ostream& operator<<(unsigned short n); + basic_ostream& operator<<(int n); + basic_ostream& operator<<(unsigned int n); + basic_ostream& operator<<(long n); + basic_ostream& operator<<(unsigned long n); + basic_ostream& operator<<(long long n); + basic_ostream& operator<<(unsigned long long n); + basic_ostream& operator<<(float f); + basic_ostream& operator<<(double f); + basic_ostream& operator<<(long double f); + basic_ostream& operator<<(const void* p); + basic_ostream& operator<<(basic_streambuf<char_type,traits>* sb); + + // 27.7.2.7 Unformatted output: + basic_ostream& put(char_type c); + basic_ostream& write(const char_type* s, streamsize n); + basic_ostream& flush(); + + // 27.7.2.5 seeks: + pos_type tellp(); + basic_ostream& seekp(pos_type); + basic_ostream& seekp(off_type, ios_base::seekdir); +}; + +// 27.7.2.6.4 character inserters + +template<class charT, class traits> + basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, charT); + +template<class charT, class traits> + basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, char); + +template<class traits> + basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, char); + +// signed and unsigned + +template<class traits> + basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, signed char); + +template<class traits> + basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, unsigned char); + +// NTBS +template<class charT, class traits> + basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const charT*); + +template<class charT, class traits> + basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>&, const char*); + +template<class traits> + basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const char*); + +// signed and unsigned +template<class traits> +basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const signed char*); + +template<class traits> + basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>&, const unsigned char*); + +// swap: +template <class charT, class traits> + void swap(basic_ostream<charT, traits>& x, basic_ostream<charT, traits>& y); + +template <class charT, class traits> + basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os); + +template <class charT, class traits> + basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os); + +template <class charT, class traits> + basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os); + +// rvalue stream insertion +template <class charT, class traits, class T> + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>&& os, const T& x); + +} // std + +*/ + +#include <__config> +#include <ios> +#include <streambuf> +#include <locale> +#include <iterator> +#include <bitset> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_ostream + : virtual public basic_ios<_CharT, _Traits> +{ +public: + // types (inherited from basic_ios (27.5.4)): + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + // 27.7.2.2 Constructor/destructor: + explicit basic_ostream(basic_streambuf<char_type, traits_type>* __sb); + virtual ~basic_ostream(); +protected: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_ostream(basic_ostream&& __rhs); +#endif + + // 27.7.2.3 Assign/swap +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_ostream& operator=(basic_ostream&& __rhs); +#endif + void swap(basic_ostream& __rhs); +public: + + // 27.7.2.4 Prefix/suffix: + class sentry; + + // 27.7.2.6 Formatted output: + basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)); + basic_ostream& operator<<(basic_ios<char_type, traits_type>& + (*__pf)(basic_ios<char_type,traits_type>&)); + basic_ostream& operator<<(ios_base& (*__pf)(ios_base&)); + basic_ostream& operator<<(bool __n); + basic_ostream& operator<<(short __n); + basic_ostream& operator<<(unsigned short __n); + basic_ostream& operator<<(int __n); + basic_ostream& operator<<(unsigned int __n); + basic_ostream& operator<<(long __n); + basic_ostream& operator<<(unsigned long __n); + basic_ostream& operator<<(long long __n); + basic_ostream& operator<<(unsigned long long __n); + basic_ostream& operator<<(float __f); + basic_ostream& operator<<(double __f); + basic_ostream& operator<<(long double __f); + basic_ostream& operator<<(const void* __p); + basic_ostream& operator<<(basic_streambuf<char_type, traits_type>* __sb); + + // 27.7.2.7 Unformatted output: + basic_ostream& put(char_type __c); + basic_ostream& write(const char_type* __s, streamsize __n); + basic_ostream& flush(); + + // 27.7.2.5 seeks: + pos_type tellp(); + basic_ostream& seekp(pos_type __pos); + basic_ostream& seekp(off_type __off, ios_base::seekdir __dir); + +protected: + _LIBCPP_ALWAYS_INLINE + basic_ostream() {} // extension, intentially does not initialize +}; + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_ostream<_CharT, _Traits>::sentry +{ + bool __ok_; + basic_ostream<_CharT, _Traits>& __os_; + + sentry(const sentry&); // = delete; + sentry& operator=(const sentry&); // = delete; + +public: + explicit sentry(basic_ostream<_CharT, _Traits>& __os); + ~sentry(); + + _LIBCPP_ALWAYS_INLINE + _LIBCPP_EXPLICIT + operator bool() const {return __ok_;} +}; + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) + : __ok_(false), + __os_(__os) +{ + if (__os.good()) + { + if (__os.tie()) + __os.tie()->flush(); + __ok_ = true; + } +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>::sentry::~sentry() +{ + if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) + && !uncaught_exception()) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + if (__os_.rdbuf()->pubsync() == -1) + __os_.setstate(ios_base::badbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>::basic_ostream(basic_streambuf<char_type, traits_type>* __sb) +{ + this->init(__sb); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) +{ + this->move(__rhs); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator=(basic_ostream&& __rhs) +{ + swap(__rhs); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>::~basic_ostream() +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ostream<_CharT, _Traits>::swap(basic_ostream& __rhs) +{ + basic_ios<char_type, traits_type>::swap(__rhs); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(basic_ostream& (*__pf)(basic_ostream&)) +{ + return __pf(*this); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(basic_ios<char_type, traits_type>& + (*__pf)(basic_ios<char_type,traits_type>&)) +{ + __pf(*this); + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(ios_base& (*__pf)(ios_base&)) +{ + __pf(*this); + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + if (__sb) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef istreambuf_iterator<_CharT, _Traits> _Ip; + typedef ostreambuf_iterator<_CharT, _Traits> _Op; + _Ip __i(__sb); + _Ip __eof; + _Op __o(*this); + size_t __c = 0; + for (; __i != __eof; ++__i, ++__o, ++__c) + { + *__o = *__i; + if (__o.failed()) + break; + } + if (__c == 0) + this->setstate(ios_base::failbit); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_failbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + else + this->setstate(ios_base::badbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(bool __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(short __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), + __flags == ios_base::oct || __flags == ios_base::hex ? + static_cast<long>(static_cast<unsigned short>(__n)) : + static_cast<long>(__n)).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(int __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), + __flags == ios_base::oct || __flags == ios_base::hex ? + static_cast<long>(static_cast<unsigned int>(__n)) : + static_cast<long>(__n)).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(long __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(long long __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(float __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(double __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(long double __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::operator<<(const void* __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; + const _Fp& __f = use_facet<_Fp>(this->getloc()); + if (__f.put(*this, *this, this->fill(), __n).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template<class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Ip; + if (__pad_and_output(_Ip(__os), + &__c, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + &__c + 1 : + &__c, + &__c + 1, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + _CharT __c = __os.widen(__cn); + typedef ostreambuf_iterator<_CharT, _Traits> _Ip; + if (__pad_and_output(_Ip(__os), + &__c, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + &__c + 1 : + &__c, + &__c + 1, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, char __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + if (__pad_and_output(_Ip(__os), + &__c, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + &__c + 1 : + &__c, + &__c + 1, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, signed char __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + if (__pad_and_output(_Ip(__os), + (char*)&__c, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + (char*)&__c + 1 : + (char*)&__c, + (char*)&__c + 1, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + if (__pad_and_output(_Ip(__os), + (char*)&__c, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + (char*)&__c + 1 : + (char*)&__c, + (char*)&__c + 1, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Ip; + size_t __len = _Traits::length(__str); + if (__pad_and_output(_Ip(__os), + __str, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + __str + __len : + __str, + __str + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Ip; + size_t __len = char_traits<char>::length(__strn); + const int __bs = 100; + _CharT __wbb[__bs]; + _CharT* __wb = __wbb; + unique_ptr<_CharT, void(*)(void*)> __h(0, free); + if (__len > __bs) + { + __wb = (_CharT*)malloc(__len*sizeof(_CharT)); + if (__wb == 0) + __throw_bad_alloc(); + __h.reset(__wb); + } + for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) + *__p = __os.widen(*__strn); + if (__pad_and_output(_Ip(__os), + __wb, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + __wb + __len : + __wb, + __wb + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, const char* __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + size_t __len = _Traits::length(__str); + if (__pad_and_output(_Ip(__os), + __str, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + __str + __len : + __str, + __str + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + size_t __len = _Traits::length((const char*)__str); + if (__pad_and_output(_Ip(__os), + (const char*)__str, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + (const char*)__str + __len : + (const char*)__str, + (const char*)__str + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template<class _Traits> +basic_ostream<char, _Traits>& +operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<char, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<char, _Traits> _Ip; + size_t __len = _Traits::length((const char*)__str); + if (__pad_and_output(_Ip(__os), + (const char*)__str, + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + (const char*)__str + __len : + (const char*)__str, + (const char*)__str + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::put(char_type __c) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __s(*this); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Op; + _Op __o(*this); + *__o = __c; + if (__o.failed()) + this->setstate(ios_base::badbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + sentry __sen(*this); + if (__sen && __n) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Op; + _Op __o(*this); + for (; __n; --__n, ++__o, ++__s) + { + *__o = *__s; + if (__o.failed()) + { + this->setstate(ios_base::badbit); + break; + } + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::flush() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + if (this->rdbuf()) + { + sentry __s(*this); + if (__s) + { + if (this->rdbuf()->pubsync() == -1) + this->setstate(ios_base::badbit); + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + this->__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_ostream<_CharT, _Traits>::pos_type +basic_ostream<_CharT, _Traits>::tellp() +{ + if (this->fail()) + return pos_type(-1); + return this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) +{ + if (!this->fail()) + { + if (this->rdbuf()->pubseekpos(__pos, ios_base::out) == pos_type(-1)) + this->setstate(ios_base::failbit); + } + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) +{ + if (!this->fail()) + this->rdbuf()->pubseekoff(__off, __dir, ios_base::out); + return *this; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +endl(basic_ostream<_CharT, _Traits>& __os) +{ + __os.put(__os.widen('\n')); + __os.flush(); + return __os; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +ends(basic_ostream<_CharT, _Traits>& __os) +{ + __os.put(_CharT()); + return __os; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +flush(basic_ostream<_CharT, _Traits>& __os) +{ + __os.flush(); + return __os; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Stream, class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_lvalue_reference<_Stream>::value && + is_base_of<ios_base, _Stream>::value, + _Stream&& +>::type +operator<<(_Stream&& __os, const _Tp& __x) +{ + __os << __x; + return _VSTD::move(__os); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _CharT, class _Traits, class _Allocator> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT, _Traits, _Allocator>& __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typename basic_ostream<_CharT, _Traits>::sentry __s(__os); + if (__s) + { + typedef ostreambuf_iterator<_CharT, _Traits> _Ip; + size_t __len = __str.size(); + if (__pad_and_output(_Ip(__os), + __str.data(), + (__os.flags() & ios_base::adjustfield) == ios_base::left ? + __str.data() + __len : + __str.data(), + __str.data() + __len, + __os, + __os.fill()).failed()) + __os.setstate(ios_base::badbit | ios_base::failbit); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __os.__set_badbit_and_consider_rethrow(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + return __os; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) +{ + return __os << __ec.category().name() << ':' << __ec.value(); +} + +template<class _CharT, class _Traits, class _Yp> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) +{ + return __os << __p.get(); +} + +template <class _CharT, class _Traits, size_t _Size> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) +{ + return __os << __x.template to_string<_CharT, _Traits> + (use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), + use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); +} + +extern template class basic_ostream<char>; +extern template class basic_ostream<wchar_t>; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_OSTREAM diff --git a/contrib/libc++/include/queue b/contrib/libc++/include/queue new file mode 100644 index 0000000..e05ab8f --- /dev/null +++ b/contrib/libc++/include/queue @@ -0,0 +1,715 @@ +// -*- C++ -*- +//===--------------------------- queue ------------------------------------===// +// +// 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_QUEUE +#define _LIBCPP_QUEUE + +/* + queue synopsis + +namespace std +{ + +template <class T, class Container = deque<T>> +class queue +{ +public: + typedef Container container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + +public: + queue() = default; + ~queue() = default; + + queue(const queue& q) = default; + queue(queue&& q) = default; + + queue& operator=(const queue& q) = default; + queue& operator=(queue&& q) = default; + + explicit queue(const container_type& c); + explicit queue(container_type&& c) + template <class Alloc> + explicit queue(const Alloc& a); + template <class Alloc> + queue(const container_type& c, const Alloc& a); + template <class Alloc> + queue(container_type&& c, const Alloc& a); + template <class Alloc> + queue(const queue& q, const Alloc& a); + template <class Alloc> + queue(queue&& q, const Alloc& a); + + bool empty() const; + size_type size() const; + + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + void push(const value_type& v); + void push(value_type&& v); + template <class... Args> void emplace(Args&&... args); + void pop(); + + void swap(queue& q) noexcept(noexcept(swap(c, q.c))); +}; + +template <class T, class Container> + bool operator==(const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + bool operator< (const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + bool operator!=(const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + bool operator> (const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + bool operator>=(const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + bool operator<=(const queue<T, Container>& x,const queue<T, Container>& y); + +template <class T, class Container> + void swap(queue<T, Container>& x, queue<T, Container>& y) + noexcept(noexcept(x.swap(y))); + +template <class T, class Container = vector<T>, + class Compare = less<typename Container::value_type>> +class priority_queue +{ +public: + typedef Container container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + Compare comp; + +public: + priority_queue() = default; + ~priority_queue() = default; + + priority_queue(const priority_queue& q) = default; + priority_queue(priority_queue&& q) = default; + + priority_queue& operator=(const priority_queue& q) = default; + priority_queue& operator=(priority_queue&& q) = default; + + explicit priority_queue(const Compare& comp); + priority_queue(const Compare& comp, const container_type& c); + explicit priority_queue(const Compare& comp, container_type&& c); + template <class InputIterator> + priority_queue(InputIterator first, InputIterator last, + const Compare& comp = Compare()); + template <class InputIterator> + priority_queue(InputIterator first, InputIterator last, + const Compare& comp, const container_type& c); + template <class InputIterator> + priority_queue(InputIterator first, InputIterator last, + const Compare& comp, container_type&& c); + template <class Alloc> + explicit priority_queue(const Alloc& a); + template <class Alloc> + priority_queue(const Compare& comp, const Alloc& a); + template <class Alloc> + priority_queue(const Compare& comp, const container_type& c, + const Alloc& a); + template <class Alloc> + priority_queue(const Compare& comp, container_type&& c, + const Alloc& a); + template <class Alloc> + priority_queue(const priority_queue& q, const Alloc& a); + template <class Alloc> + priority_queue(priority_queue&& q, const Alloc& a); + + bool empty() const; + size_type size() const; + const_reference top() const; + + void push(const value_type& v); + void push(value_type&& v); + template <class... Args> void emplace(Args&&... args); + void pop(); + + void swap(priority_queue& q) + noexcept(noexcept(swap(c, q.c)) && noexcept(swap(comp.q.comp))); +}; + +template <class T, class Container, class Compare> + void swap(priority_queue<T, Container, Compare>& x, + priority_queue<T, Container, Compare>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> +#include <deque> +#include <vector> +#include <functional> +#include <algorithm> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _Container> class queue; + +template <class _Tp, class _Container> +bool +operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); + +template <class _Tp, class _Container> +bool +operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); + +template <class _Tp, class _Container = deque<_Tp> > +class _LIBCPP_VISIBLE queue +{ +public: + typedef _Container container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + +public: + _LIBCPP_INLINE_VISIBILITY + queue() + _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) + : c() {} + + _LIBCPP_INLINE_VISIBILITY + queue(const queue& __q) : c(__q.c) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + queue(queue&& __q) + _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value) + : c(_VSTD::move(__q.c)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + queue& operator=(const queue& __q) {c = __q.c; return *this;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + queue& operator=(queue&& __q) + _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value) + {c = _VSTD::move(__q.c); return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + explicit queue(const container_type& __c) : c(__c) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit queue(container_type&& __c) : c(_VSTD::move(__c)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit queue(const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + queue(const queue& __q, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__q.c, __a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + queue(const container_type& __c, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__c, __a) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + queue(container_type&& __c, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(_VSTD::move(__c), __a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + queue(queue&& __q, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(_VSTD::move(__q.c), __a) {} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return c.empty();} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return c.size();} + + _LIBCPP_INLINE_VISIBILITY + reference front() {return c.front();} + _LIBCPP_INLINE_VISIBILITY + const_reference front() const {return c.front();} + _LIBCPP_INLINE_VISIBILITY + reference back() {return c.back();} + _LIBCPP_INLINE_VISIBILITY + const_reference back() const {return c.back();} + + _LIBCPP_INLINE_VISIBILITY + void push(const value_type& __v) {c.push_back(__v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void push(value_type&& __v) {c.push_back(_VSTD::move(__v));} +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + void emplace(_Args&&... __args) + {c.emplace_back(_VSTD::forward<_Args>(__args)...);} +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void pop() {c.pop_front();} + + _LIBCPP_INLINE_VISIBILITY + void swap(queue& __q) + _NOEXCEPT_(__is_nothrow_swappable<container_type>::value) + { + using _VSTD::swap; + swap(c, __q.c); + } + + template <class _T1, class _C1> + friend + _LIBCPP_INLINE_VISIBILITY + bool + operator==(const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y); + + template <class _T1, class _C1> + friend + _LIBCPP_INLINE_VISIBILITY + bool + operator< (const queue<_T1, _C1>& __x,const queue<_T1, _C1>& __y); +}; + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return __x.c == __y.c; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return __x.c < __y.c; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(queue<_Tp, _Container>& __x, queue<_Tp, _Container>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Tp, class _Container, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator<queue<_Tp, _Container>, _Alloc> + : public uses_allocator<_Container, _Alloc> +{ +}; + +template <class _Tp, class _Container = vector<_Tp>, + class _Compare = less<typename _Container::value_type> > +class _LIBCPP_VISIBLE priority_queue +{ +public: + typedef _Container container_type; + typedef _Compare value_compare; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + value_compare comp; + +public: + _LIBCPP_INLINE_VISIBILITY + priority_queue() + _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value && + is_nothrow_default_constructible<value_compare>::value) + : c(), comp() {} + + _LIBCPP_INLINE_VISIBILITY + priority_queue(const priority_queue& __q) : c(__q.c), comp(__q.comp) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + priority_queue(priority_queue&& __q) + _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value && + is_nothrow_move_constructible<value_compare>::value) + : c(_VSTD::move(__q.c)), comp(_VSTD::move(__q.comp)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + priority_queue& operator=(const priority_queue& __q) + {c = __q.c; comp = __q.comp; return *this;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + priority_queue& operator=(priority_queue&& __q) + _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value && + is_nothrow_move_assignable<value_compare>::value) + {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + explicit priority_queue(const value_compare& __comp) + : c(), comp(__comp) {} + priority_queue(const value_compare& __comp, const container_type& __c); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + explicit priority_queue(const value_compare& __comp, container_type&& __c); +#endif + template <class _InputIter> + priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp = value_compare()); + template <class _InputIter> + priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp, const container_type& __c); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIter> + priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp, container_type&& __c); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + explicit priority_queue(const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); + template <class _Alloc> + priority_queue(const value_compare& __comp, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); + template <class _Alloc> + priority_queue(const value_compare& __comp, const container_type& __c, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); + template <class _Alloc> + priority_queue(const priority_queue& __q, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + priority_queue(const value_compare& __comp, container_type&& __c, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); + template <class _Alloc> + priority_queue(priority_queue&& __q, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return c.empty();} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return c.size();} + _LIBCPP_INLINE_VISIBILITY + const_reference top() const {return c.front();} + + void push(const value_type& __v); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + void push(value_type&& __v); +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> void emplace(_Args&&... __args); +#endif +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void pop(); + + void swap(priority_queue& __q) + _NOEXCEPT_(__is_nothrow_swappable<container_type>::value && + __is_nothrow_swappable<value_compare>::value); +}; + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Compare& __comp, + const container_type& __c) + : c(__c), + comp(__comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, + container_type&& __c) + : c(_VSTD::move(__c)), + comp(__comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp) + : c(__f, __l), + comp(__comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +template <class _Tp, class _Container, class _Compare> +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp, + const container_type& __c) + : c(__c), + comp(__comp) +{ + c.insert(c.end(), __f, __l); + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +template <class _InputIter> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(_InputIter __f, _InputIter __l, + const value_compare& __comp, + container_type&& __c) + : c(_VSTD::move(__c)), + comp(__comp) +{ + c.insert(c.end(), __f, __l); + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(__a) +{ +} + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(__a), + comp(__comp) +{ +} + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, + const container_type& __c, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(__c, __a), + comp(__comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const priority_queue& __q, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(__q.c, __a), + comp(__q.comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(const value_compare& __comp, + container_type&& __c, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(_VSTD::move(__c), __a), + comp(__comp) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +template <class _Tp, class _Container, class _Compare> +template <class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +priority_queue<_Tp, _Container, _Compare>::priority_queue(priority_queue&& __q, + const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type*) + : c(_VSTD::move(__q.c), __a), + comp(_VSTD::move(__q.comp)) +{ + _VSTD::make_heap(c.begin(), c.end(), comp); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +priority_queue<_Tp, _Container, _Compare>::push(const value_type& __v) +{ + c.push_back(__v); + _VSTD::push_heap(c.begin(), c.end(), comp); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +priority_queue<_Tp, _Container, _Compare>::push(value_type&& __v) +{ + c.push_back(_VSTD::move(__v)); + _VSTD::push_heap(c.begin(), c.end(), comp); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Container, class _Compare> +template <class... _Args> +inline _LIBCPP_INLINE_VISIBILITY +void +priority_queue<_Tp, _Container, _Compare>::emplace(_Args&&... __args) +{ + c.emplace_back(_VSTD::forward<_Args>(__args)...); + _VSTD::push_heap(c.begin(), c.end(), comp); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +priority_queue<_Tp, _Container, _Compare>::pop() +{ + _VSTD::pop_heap(c.begin(), c.end(), comp); + c.pop_back(); +} + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +priority_queue<_Tp, _Container, _Compare>::swap(priority_queue& __q) + _NOEXCEPT_(__is_nothrow_swappable<container_type>::value && + __is_nothrow_swappable<value_compare>::value) +{ + using _VSTD::swap; + swap(c, __q.c); + swap(comp, __q.comp); +} + +template <class _Tp, class _Container, class _Compare> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(priority_queue<_Tp, _Container, _Compare>& __x, + priority_queue<_Tp, _Container, _Compare>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Tp, class _Container, class _Compare, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc> + : public uses_allocator<_Container, _Alloc> +{ +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_QUEUE diff --git a/contrib/libc++/include/random b/contrib/libc++/include/random new file mode 100644 index 0000000..02ea9b6 --- /dev/null +++ b/contrib/libc++/include/random @@ -0,0 +1,6608 @@ +// -*- C++ -*- +//===--------------------------- random -----------------------------------===// +// +// 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_RANDOM +#define _LIBCPP_RANDOM + +/* + random synopsis + +#include <initializer_list> + +namespace std +{ + +// Engines + +template <class UIntType, UIntType a, UIntType c, UIntType m> +class linear_congruential_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr result_type multiplier = a; + static constexpr result_type increment = c; + static constexpr result_type modulus = m; + static constexpr result_type min() { return c == 0u ? 1u: 0u;} + static constexpr result_type max() { return m - 1u;} + static constexpr result_type default_seed = 1u; + + // constructors and seeding functions + explicit linear_congruential_engine(result_type s = default_seed); + template<class Sseq> explicit linear_congruential_engine(Sseq& q); + void seed(result_type s = default_seed); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template <class UIntType, UIntType a, UIntType c, UIntType m> +bool +operator==(const linear_congruential_engine<UIntType, a, c, m>& x, + const linear_congruential_engine<UIntType, a, c, m>& y); + +template <class UIntType, UIntType a, UIntType c, UIntType m> +bool +operator!=(const linear_congruential_engine<UIntType, a, c, m>& x, + const linear_congruential_engine<UIntType, a, c, m>& y); + +template <class charT, class traits, + class UIntType, UIntType a, UIntType c, UIntType m> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const linear_congruential_engine<UIntType, a, c, m>& x); + +template <class charT, class traits, + class UIntType, UIntType a, UIntType c, UIntType m> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + linear_congruential_engine<UIntType, a, c, m>& x); + +template <class UIntType, size_t w, size_t n, size_t m, size_t r, + UIntType a, size_t u, UIntType d, size_t s, + UIntType b, size_t t, UIntType c, size_t l, UIntType f> +class mersenne_twister_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr size_t word_size = w; + static constexpr size_t state_size = n; + static constexpr size_t shift_size = m; + static constexpr size_t mask_bits = r; + static constexpr result_type xor_mask = a; + static constexpr size_t tempering_u = u; + static constexpr result_type tempering_d = d; + static constexpr size_t tempering_s = s; + static constexpr result_type tempering_b = b; + static constexpr size_t tempering_t = t; + static constexpr result_type tempering_c = c; + static constexpr size_t tempering_l = l; + static constexpr result_type initialization_multiplier = f; + static constexpr result_type min () { return 0; } + static constexpr result_type max() { return 2^w - 1; } + static constexpr result_type default_seed = 5489u; + + // constructors and seeding functions + explicit mersenne_twister_engine(result_type value = default_seed); + template<class Sseq> explicit mersenne_twister_engine(Sseq& q); + void seed(result_type value = default_seed); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template <class UIntType, size_t w, size_t n, size_t m, size_t r, + UIntType a, size_t u, UIntType d, size_t s, + UIntType b, size_t t, UIntType c, size_t l, UIntType f> +bool +operator==( + const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, + const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); + +template <class UIntType, size_t w, size_t n, size_t m, size_t r, + UIntType a, size_t u, UIntType d, size_t s, + UIntType b, size_t t, UIntType c, size_t l, UIntType f> +bool +operator!=( + const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x, + const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& y); + +template <class charT, class traits, + class UIntType, size_t w, size_t n, size_t m, size_t r, + UIntType a, size_t u, UIntType d, size_t s, + UIntType b, size_t t, UIntType c, size_t l, UIntType f> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); + +template <class charT, class traits, + class UIntType, size_t w, size_t n, size_t m, size_t r, + UIntType a, size_t u, UIntType d, size_t s, + UIntType b, size_t t, UIntType c, size_t l, UIntType f> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + mersenne_twister_engine<UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f>& x); + +template<class UIntType, size_t w, size_t s, size_t r> +class subtract_with_carry_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr size_t word_size = w; + static constexpr size_t short_lag = s; + static constexpr size_t long_lag = r; + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return m-1; } + static constexpr result_type default_seed = 19780503u; + + // constructors and seeding functions + explicit subtract_with_carry_engine(result_type value = default_seed); + template<class Sseq> explicit subtract_with_carry_engine(Sseq& q); + void seed(result_type value = default_seed); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); +}; + +template<class UIntType, size_t w, size_t s, size_t r> +bool +operator==( + const subtract_with_carry_engine<UIntType, w, s, r>& x, + const subtract_with_carry_engine<UIntType, w, s, r>& y); + +template<class UIntType, size_t w, size_t s, size_t r> +bool +operator!=( + const subtract_with_carry_engine<UIntType, w, s, r>& x, + const subtract_with_carry_engine<UIntType, w, s, r>& y); + +template <class charT, class traits, + class UIntType, size_t w, size_t s, size_t r> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const subtract_with_carry_engine<UIntType, w, s, r>& x); + +template <class charT, class traits, + class UIntType, size_t w, size_t s, size_t r> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + subtract_with_carry_engine<UIntType, w, s, r>& x); + +template<class Engine, size_t p, size_t r> +class discard_block_engine +{ +public: + // types + typedef typename Engine::result_type result_type; + + // engine characteristics + static constexpr size_t block_size = p; + static constexpr size_t used_block = r; + static constexpr result_type min() { return Engine::min(); } + static constexpr result_type max() { return Engine::max(); } + + // constructors and seeding functions + discard_block_engine(); + explicit discard_block_engine(const Engine& e); + explicit discard_block_engine(Engine&& e); + explicit discard_block_engine(result_type s); + template<class Sseq> explicit discard_block_engine(Sseq& q); + void seed(); + void seed(result_type s); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); + + // property functions + const Engine& base() const; +}; + +template<class Engine, size_t p, size_t r> +bool +operator==( + const discard_block_engine<Engine, p, r>& x, + const discard_block_engine<Engine, p, r>& y); + +template<class Engine, size_t p, size_t r> +bool +operator!=( + const discard_block_engine<Engine, p, r>& x, + const discard_block_engine<Engine, p, r>& y); + +template <class charT, class traits, + class Engine, size_t p, size_t r> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const discard_block_engine<Engine, p, r>& x); + +template <class charT, class traits, + class Engine, size_t p, size_t r> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + discard_block_engine<Engine, p, r>& x); + +template<class Engine, size_t w, class UIntType> +class independent_bits_engine +{ +public: + // types + typedef UIntType result_type; + + // engine characteristics + static constexpr result_type min() { return 0; } + static constexpr result_type max() { return 2^w - 1; } + + // constructors and seeding functions + independent_bits_engine(); + explicit independent_bits_engine(const Engine& e); + explicit independent_bits_engine(Engine&& e); + explicit independent_bits_engine(result_type s); + template<class Sseq> explicit independent_bits_engine(Sseq& q); + void seed(); + void seed(result_type s); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); void discard(unsigned long long z); + + // property functions + const Engine& base() const; +}; + +template<class Engine, size_t w, class UIntType> +bool +operator==( + const independent_bits_engine<Engine, w, UIntType>& x, + const independent_bits_engine<Engine, w, UIntType>& y); + +template<class Engine, size_t w, class UIntType> +bool +operator!=( + const independent_bits_engine<Engine, w, UIntType>& x, + const independent_bits_engine<Engine, w, UIntType>& y); + +template <class charT, class traits, + class Engine, size_t w, class UIntType> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const independent_bits_engine<Engine, w, UIntType>& x); + +template <class charT, class traits, + class Engine, size_t w, class UIntType> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + independent_bits_engine<Engine, w, UIntType>& x); + +template<class Engine, size_t k> +class shuffle_order_engine +{ +public: + // types + typedef typename Engine::result_type result_type; + + // engine characteristics + static constexpr size_t table_size = k; + static constexpr result_type min() { return Engine::min; } + static constexpr result_type max() { return Engine::max; } + + // constructors and seeding functions + shuffle_order_engine(); + explicit shuffle_order_engine(const Engine& e); + explicit shuffle_order_engine(Engine&& e); + explicit shuffle_order_engine(result_type s); + template<class Sseq> explicit shuffle_order_engine(Sseq& q); + void seed(); + void seed(result_type s); + template<class Sseq> void seed(Sseq& q); + + // generating functions + result_type operator()(); + void discard(unsigned long long z); + + // property functions + const Engine& base() const; +}; + +template<class Engine, size_t k> +bool +operator==( + const shuffle_order_engine<Engine, k>& x, + const shuffle_order_engine<Engine, k>& y); + +template<class Engine, size_t k> +bool +operator!=( + const shuffle_order_engine<Engine, k>& x, + const shuffle_order_engine<Engine, k>& y); + +template <class charT, class traits, + class Engine, size_t k> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, + const shuffle_order_engine<Engine, k>& x); + +template <class charT, class traits, + class Engine, size_t k> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, + shuffle_order_engine<Engine, k>& x); + +typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> + minstd_rand0; +typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> + minstd_rand; +typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, + 0x9908b0df, + 11, 0xffffffff, + 7, 0x9d2c5680, + 15, 0xefc60000, + 18, 1812433253> mt19937; +typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, + 0xb5026f5aa96619e9, + 29, 0x5555555555555555, + 17, 0x71d67fffeda60000, + 37, 0xfff7eee000000000, + 43, 6364136223846793005> mt19937_64; +typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; +typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; +typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; +typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; +typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; +typedef minstd_rand default_random_engine; + +// Generators + +class random_device +{ +public: + // types + typedef unsigned int result_type; + + // generator characteristics + static constexpr result_type min() { return numeric_limits<result_type>::min(); } + static constexpr result_type max() { return numeric_limits<result_type>::max(); } + + // constructors + explicit random_device(const string& token = "/dev/urandom"); + + // generating functions + result_type operator()(); + + // property functions + double entropy() const; + + // no copy functions + random_device(const random_device& ) = delete; + void operator=(const random_device& ) = delete; +}; + +// Utilities + +class seed_seq +{ +public: + // types + typedef uint_least32_t result_type; + + // constructors + seed_seq(); + template<class T> + seed_seq(initializer_list<T> il); + template<class InputIterator> + seed_seq(InputIterator begin, InputIterator end); + + // generating functions + template<class RandomAccessIterator> + void generate(RandomAccessIterator begin, RandomAccessIterator end); + + // property functions + size_t size() const; + template<class OutputIterator> + void param(OutputIterator dest) const; + + // no copy functions + seed_seq(const seed_seq&) = delete; + void operator=(const seed_seq& ) = delete; +}; + +template<class RealType, size_t bits, class URNG> + RealType generate_canonical(URNG& g); + +// Distributions + +template<class IntType = int> +class uniform_int_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef uniform_int_distribution distribution_type; + + explicit param_type(IntType a = 0, + IntType b = numeric_limits<IntType>::max()); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit uniform_int_distribution(IntType a = 0, + IntType b = numeric_limits<IntType>::max()); + explicit uniform_int_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const uniform_int_distribution& x, + const uniform_int_distribution& y); + friend bool operator!=(const uniform_int_distribution& x, + const uniform_int_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const uniform_int_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + uniform_int_distribution& x); +}; + +template<class RealType = double> +class uniform_real_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef uniform_real_distribution distribution_type; + + explicit param_type(RealType a = 0, + RealType b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); + explicit uniform_real_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const uniform_real_distribution& x, + const uniform_real_distribution& y); + friend bool operator!=(const uniform_real_distribution& x, + const uniform_real_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const uniform_real_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + uniform_real_distribution& x); +}; + +class bernoulli_distribution +{ +public: + // types + typedef bool result_type; + + class param_type + { + public: + typedef bernoulli_distribution distribution_type; + + explicit param_type(double p = 0.5); + + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit bernoulli_distribution(double p = 0.5); + explicit bernoulli_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const bernoulli_distribution& x, + const bernoulli_distribution& y); + friend bool operator!=(const bernoulli_distribution& x, + const bernoulli_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const bernoulli_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + bernoulli_distribution& x); +}; + +template<class IntType = int> +class binomial_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef binomial_distribution distribution_type; + + explicit param_type(IntType t = 1, double p = 0.5); + + IntType t() const; + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit binomial_distribution(IntType t = 1, double p = 0.5); + explicit binomial_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + IntType t() const; + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const binomial_distribution& x, + const binomial_distribution& y); + friend bool operator!=(const binomial_distribution& x, + const binomial_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const binomial_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + binomial_distribution& x); +}; + +template<class IntType = int> +class geometric_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef geometric_distribution distribution_type; + + explicit param_type(double p = 0.5); + + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit geometric_distribution(double p = 0.5); + explicit geometric_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const geometric_distribution& x, + const geometric_distribution& y); + friend bool operator!=(const geometric_distribution& x, + const geometric_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const geometric_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + geometric_distribution& x); +}; + +template<class IntType = int> +class negative_binomial_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef negative_binomial_distribution distribution_type; + + explicit param_type(result_type k = 1, double p = 0.5); + + result_type k() const; + double p() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit negative_binomial_distribution(result_type k = 1, double p = 0.5); + explicit negative_binomial_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type k() const; + double p() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const negative_binomial_distribution& x, + const negative_binomial_distribution& y); + friend bool operator!=(const negative_binomial_distribution& x, + const negative_binomial_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const negative_binomial_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + negative_binomial_distribution& x); +}; + +template<class IntType = int> +class poisson_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef poisson_distribution distribution_type; + + explicit param_type(double mean = 1.0); + + double mean() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit poisson_distribution(double mean = 1.0); + explicit poisson_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + double mean() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const poisson_distribution& x, + const poisson_distribution& y); + friend bool operator!=(const poisson_distribution& x, + const poisson_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const poisson_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + poisson_distribution& x); +}; + +template<class RealType = double> +class exponential_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef exponential_distribution distribution_type; + + explicit param_type(result_type lambda = 1.0); + + result_type lambda() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit exponential_distribution(result_type lambda = 1.0); + explicit exponential_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type lambda() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const exponential_distribution& x, + const exponential_distribution& y); + friend bool operator!=(const exponential_distribution& x, + const exponential_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const exponential_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + exponential_distribution& x); +}; + +template<class RealType = double> +class gamma_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef gamma_distribution distribution_type; + + explicit param_type(result_type alpha = 1, result_type beta = 1); + + result_type alpha() const; + result_type beta() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit gamma_distribution(result_type alpha = 1, result_type beta = 1); + explicit gamma_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type alpha() const; + result_type beta() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const gamma_distribution& x, + const gamma_distribution& y); + friend bool operator!=(const gamma_distribution& x, + const gamma_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const gamma_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + gamma_distribution& x); +}; + +template<class RealType = double> +class weibull_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef weibull_distribution distribution_type; + + explicit param_type(result_type alpha = 1, result_type beta = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit weibull_distribution(result_type a = 1, result_type b = 1); + explicit weibull_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const weibull_distribution& x, + const weibull_distribution& y); + friend bool operator!=(const weibull_distribution& x, + const weibull_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const weibull_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + weibull_distribution& x); +}; + +template<class RealType = double> +class extreme_value_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef extreme_value_distribution distribution_type; + + explicit param_type(result_type a = 0, result_type b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit extreme_value_distribution(result_type a = 0, result_type b = 1); + explicit extreme_value_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const extreme_value_distribution& x, + const extreme_value_distribution& y); + friend bool operator!=(const extreme_value_distribution& x, + const extreme_value_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const extreme_value_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + extreme_value_distribution& x); +}; + +template<class RealType = double> +class normal_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef normal_distribution distribution_type; + + explicit param_type(result_type mean = 0, result_type stddev = 1); + + result_type mean() const; + result_type stddev() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructors and reset functions + explicit normal_distribution(result_type mean = 0, result_type stddev = 1); + explicit normal_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type mean() const; + result_type stddev() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const normal_distribution& x, + const normal_distribution& y); + friend bool operator!=(const normal_distribution& x, + const normal_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const normal_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + normal_distribution& x); +}; + +template<class RealType = double> +class lognormal_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef lognormal_distribution distribution_type; + + explicit param_type(result_type m = 0, result_type s = 1); + + result_type m() const; + result_type s() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit lognormal_distribution(result_type m = 0, result_type s = 1); + explicit lognormal_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type m() const; + result_type s() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const lognormal_distribution& x, + const lognormal_distribution& y); + friend bool operator!=(const lognormal_distribution& x, + const lognormal_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const lognormal_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + lognormal_distribution& x); +}; + +template<class RealType = double> +class chi_squared_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef chi_squared_distribution distribution_type; + + explicit param_type(result_type n = 1); + + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit chi_squared_distribution(result_type n = 1); + explicit chi_squared_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const chi_squared_distribution& x, + const chi_squared_distribution& y); + friend bool operator!=(const chi_squared_distribution& x, + const chi_squared_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const chi_squared_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + chi_squared_distribution& x); +}; + +template<class RealType = double> +class cauchy_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef cauchy_distribution distribution_type; + + explicit param_type(result_type a = 0, result_type b = 1); + + result_type a() const; + result_type b() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit cauchy_distribution(result_type a = 0, result_type b = 1); + explicit cauchy_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type a() const; + result_type b() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const cauchy_distribution& x, + const cauchy_distribution& y); + friend bool operator!=(const cauchy_distribution& x, + const cauchy_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const cauchy_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + cauchy_distribution& x); +}; + +template<class RealType = double> +class fisher_f_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef fisher_f_distribution distribution_type; + + explicit param_type(result_type m = 1, result_type n = 1); + + result_type m() const; + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit fisher_f_distribution(result_type m = 1, result_type n = 1); + explicit fisher_f_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type m() const; + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const fisher_f_distribution& x, + const fisher_f_distribution& y); + friend bool operator!=(const fisher_f_distribution& x, + const fisher_f_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const fisher_f_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + fisher_f_distribution& x); +}; + +template<class RealType = double> +class student_t_distribution +{ +public: + // types + typedef RealType result_type; + + class param_type + { + public: + typedef student_t_distribution distribution_type; + + explicit param_type(result_type n = 1); + + result_type n() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + explicit student_t_distribution(result_type n = 1); + explicit student_t_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + result_type n() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const student_t_distribution& x, + const student_t_distribution& y); + friend bool operator!=(const student_t_distribution& x, + const student_t_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const student_t_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + student_t_distribution& x); +}; + +template<class IntType = int> +class discrete_distribution +{ +public: + // types + typedef IntType result_type; + + class param_type + { + public: + typedef discrete_distribution distribution_type; + + param_type(); + template<class InputIterator> + param_type(InputIterator firstW, InputIterator lastW); + param_type(initializer_list<double> wl); + template<class UnaryOperation> + param_type(size_t nw, double xmin, double xmax, UnaryOperation fw); + + vector<double> probabilities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + discrete_distribution(); + template<class InputIterator> + discrete_distribution(InputIterator firstW, InputIterator lastW); + discrete_distribution(initializer_list<double> wl); + template<class UnaryOperation> + discrete_distribution(size_t nw, double xmin, double xmax, + UnaryOperation fw); + explicit discrete_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector<double> probabilities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const discrete_distribution& x, + const discrete_distribution& y); + friend bool operator!=(const discrete_distribution& x, + const discrete_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const discrete_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + discrete_distribution& x); +}; + +template<class RealType = double> +class piecewise_constant_distribution +{ + // types + typedef RealType result_type; + + class param_type + { + public: + typedef piecewise_constant_distribution distribution_type; + + param_type(); + template<class InputIteratorB, class InputIteratorW> + param_type(InputIteratorB firstB, InputIteratorB lastB, + InputIteratorW firstW); + template<class UnaryOperation> + param_type(initializer_list<result_type> bl, UnaryOperation fw); + template<class UnaryOperation> + param_type(size_t nw, result_type xmin, result_type xmax, + UnaryOperation fw); + + vector<result_type> intervals() const; + vector<result_type> densities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + piecewise_constant_distribution(); + template<class InputIteratorB, class InputIteratorW> + piecewise_constant_distribution(InputIteratorB firstB, + InputIteratorB lastB, + InputIteratorW firstW); + template<class UnaryOperation> + piecewise_constant_distribution(initializer_list<result_type> bl, + UnaryOperation fw); + template<class UnaryOperation> + piecewise_constant_distribution(size_t nw, result_type xmin, + result_type xmax, UnaryOperation fw); + explicit piecewise_constant_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector<result_type> intervals() const; + vector<result_type> densities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const piecewise_constant_distribution& x, + const piecewise_constant_distribution& y); + friend bool operator!=(const piecewise_constant_distribution& x, + const piecewise_constant_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const piecewise_constant_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + piecewise_constant_distribution& x); +}; + +template<class RealType = double> +class piecewise_linear_distribution +{ + // types + typedef RealType result_type; + + class param_type + { + public: + typedef piecewise_linear_distribution distribution_type; + + param_type(); + template<class InputIteratorB, class InputIteratorW> + param_type(InputIteratorB firstB, InputIteratorB lastB, + InputIteratorW firstW); + template<class UnaryOperation> + param_type(initializer_list<result_type> bl, UnaryOperation fw); + template<class UnaryOperation> + param_type(size_t nw, result_type xmin, result_type xmax, + UnaryOperation fw); + + vector<result_type> intervals() const; + vector<result_type> densities() const; + + friend bool operator==(const param_type& x, const param_type& y); + friend bool operator!=(const param_type& x, const param_type& y); + }; + + // constructor and reset functions + piecewise_linear_distribution(); + template<class InputIteratorB, class InputIteratorW> + piecewise_linear_distribution(InputIteratorB firstB, + InputIteratorB lastB, + InputIteratorW firstW); + + template<class UnaryOperation> + piecewise_linear_distribution(initializer_list<result_type> bl, + UnaryOperation fw); + + template<class UnaryOperation> + piecewise_linear_distribution(size_t nw, result_type xmin, + result_type xmax, UnaryOperation fw); + + explicit piecewise_linear_distribution(const param_type& parm); + void reset(); + + // generating functions + template<class URNG> result_type operator()(URNG& g); + template<class URNG> result_type operator()(URNG& g, const param_type& parm); + + // property functions + vector<result_type> intervals() const; + vector<result_type> densities() const; + + param_type param() const; + void param(const param_type& parm); + + result_type min() const; + result_type max() const; + + friend bool operator==(const piecewise_linear_distribution& x, + const piecewise_linear_distribution& y); + friend bool operator!=(const piecewise_linear_distribution& x, + const piecewise_linear_distribution& y); + + template <class charT, class traits> + friend + basic_ostream<charT, traits>& + operator<<(basic_ostream<charT, traits>& os, + const piecewise_linear_distribution& x); + + template <class charT, class traits> + friend + basic_istream<charT, traits>& + operator>>(basic_istream<charT, traits>& is, + piecewise_linear_distribution& x); +}; + +} // std +*/ + +#include <__config> +#include <cstddef> +#include <type_traits> +#include <initializer_list> +#include <cstdint> +#include <limits> +#include <algorithm> +#include <numeric> +#include <vector> +#include <string> +#include <istream> +#include <ostream> +#include <cmath> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// __is_seed_sequence + +template <class _Sseq, class _Engine> +struct __is_seed_sequence +{ + static const bool value = + !is_convertible<_Sseq, typename _Engine::result_type>::value && + !is_same<typename remove_cv<_Sseq>::type, _Engine>::value; +}; + +// linear_congruential_engine + +template <unsigned long long __a, unsigned long long __c, + unsigned long long __m, unsigned long long _Mp, + bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a)> +struct __lce_ta; + +// 64 + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m> +struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true> +{ + typedef unsigned long long result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + // Schrage's algorithm + const result_type __q = __m / __a; + const result_type __r = __m % __a; + const result_type __t0 = __a * (__x % __q); + const result_type __t1 = __r * (__x / __q); + __x = __t0 + (__t0 < __t1) * __m - __t1; + __x += __c - (__x >= __m - __c) * __m; + return __x; + } +}; + +template <unsigned long long __a, unsigned long long __m> +struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true> +{ + typedef unsigned long long result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + // Schrage's algorithm + const result_type __q = __m / __a; + const result_type __r = __m % __a; + const result_type __t0 = __a * (__x % __q); + const result_type __t1 = __r * (__x / __q); + __x = __t0 + (__t0 < __t1) * __m - __t1; + return __x; + } +}; + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m> +struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false> +{ + typedef unsigned long long result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + return (__a * __x + __c) % __m; + } +}; + +template <unsigned long long __a, unsigned long long __c> +struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false> +{ + typedef unsigned long long result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + return __a * __x + __c; + } +}; + +// 32 + +template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> +struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true> +{ + typedef unsigned result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + const result_type __a = static_cast<result_type>(_Ap); + const result_type __c = static_cast<result_type>(_Cp); + const result_type __m = static_cast<result_type>(_Mp); + // Schrage's algorithm + const result_type __q = __m / __a; + const result_type __r = __m % __a; + const result_type __t0 = __a * (__x % __q); + const result_type __t1 = __r * (__x / __q); + __x = __t0 + (__t0 < __t1) * __m - __t1; + __x += __c - (__x >= __m - __c) * __m; + return __x; + } +}; + +template <unsigned long long _Ap, unsigned long long _Mp> +struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true> +{ + typedef unsigned result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + const result_type __a = static_cast<result_type>(_Ap); + const result_type __m = static_cast<result_type>(_Mp); + // Schrage's algorithm + const result_type __q = __m / __a; + const result_type __r = __m % __a; + const result_type __t0 = __a * (__x % __q); + const result_type __t1 = __r * (__x / __q); + __x = __t0 + (__t0 < __t1) * __m - __t1; + return __x; + } +}; + +template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> +struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false> +{ + typedef unsigned result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + const result_type __a = static_cast<result_type>(_Ap); + const result_type __c = static_cast<result_type>(_Cp); + const result_type __m = static_cast<result_type>(_Mp); + return (__a * __x + __c) % __m; + } +}; + +template <unsigned long long _Ap, unsigned long long _Cp> +struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false> +{ + typedef unsigned result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + const result_type __a = static_cast<result_type>(_Ap); + const result_type __c = static_cast<result_type>(_Cp); + return __a * __x + __c; + } +}; + +// 16 + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b> +struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b> +{ + typedef unsigned short result_type; + _LIBCPP_INLINE_VISIBILITY + static result_type next(result_type __x) + { + return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x)); + } +}; + +template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +class linear_congruential_engine; + +template <class _CharT, class _Traits, + class _Up, _Up _Ap, _Up _Cp, _Up _Np> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); + +template <class _CharT, class _Traits, + class _Up, _Up _Ap, _Up _Cp, _Up _Np> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); + +template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +class _LIBCPP_VISIBLE linear_congruential_engine +{ +public: + // types + typedef _UIntType result_type; + +private: + result_type __x_; + + static const result_type _Mp = result_type(~0); + + static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); + static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); +public: + static const result_type _Min = __c == 0u ? 1u: 0u; + static const result_type _Max = __m - 1u; + static_assert(_Min < _Max, "linear_congruential_engine invalid parameters"); + + // engine characteristics + static const/*expr*/ result_type multiplier = __a; + static const/*expr*/ result_type increment = __c; + static const/*expr*/ result_type modulus = __m; + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() {return _Min;} + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() {return _Max;} + static const/*expr*/ result_type default_seed = 1u; + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + explicit linear_congruential_engine(result_type __s = default_seed) + {seed(__s);} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit linear_congruential_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0) + {seed(__q);} + _LIBCPP_INLINE_VISIBILITY + void seed(result_type __s = default_seed) + {seed(integral_constant<bool, __m == 0>(), + integral_constant<bool, __c == 0>(), __s);} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, linear_congruential_engine>::value, + void + >::type + seed(_Sseq& __q) + {__seed(__q, integral_constant<unsigned, + 1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32 + : (__m-1) / 0x100000000ull)>());} + + // generating functions + _LIBCPP_INLINE_VISIBILITY + result_type operator()() + {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));} + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const linear_congruential_engine& __x, + const linear_congruential_engine& __y) + {return __x.__x_ == __y.__x_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const linear_congruential_engine& __x, + const linear_congruential_engine& __y) + {return !(__x == __y);} + +private: + + _LIBCPP_INLINE_VISIBILITY + void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;} + _LIBCPP_INLINE_VISIBILITY + void seed(true_type, false_type, result_type __s) {__x_ = __s;} + _LIBCPP_INLINE_VISIBILITY + void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ? + 1 : __s % __m;} + _LIBCPP_INLINE_VISIBILITY + void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;} + + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 1>); + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 2>); + + template <class _CharT, class _Traits, + class _Up, _Up _Ap, _Up _Cp, _Up _Np> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&); + + template <class _CharT, class _Traits, + class _Up, _Up _Ap, _Up _Cp, _Up _Np> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x); +}; + +template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +template<class _Sseq> +void +linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, + integral_constant<unsigned, 1>) +{ + const unsigned __k = 1; + uint32_t __ar[__k+3]; + __q.generate(__ar, __ar + __k + 3); + result_type __s = static_cast<result_type>(__ar[3] % __m); + __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; +} + +template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +template<class _Sseq> +void +linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, + integral_constant<unsigned, 2>) +{ + const unsigned __k = 2; + uint32_t __ar[__k+3]; + __q.generate(__ar, __ar + __k + 3); + result_type __s = static_cast<result_type>((__ar[3] + + (uint64_t)__ar[4] << 32) % __m); + __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; +} + +template <class _CharT, class _Traits> +class __save_flags +{ + typedef basic_ios<_CharT, _Traits> __stream_type; + typedef typename __stream_type::fmtflags fmtflags; + + __stream_type& __stream_; + fmtflags __fmtflags_; + _CharT __fill_; + + __save_flags(const __save_flags&); + __save_flags& operator=(const __save_flags&); +public: + _LIBCPP_INLINE_VISIBILITY + explicit __save_flags(__stream_type& __stream) + : __stream_(__stream), + __fmtflags_(__stream.flags()), + __fill_(__stream.fill()) + {} + _LIBCPP_INLINE_VISIBILITY + ~__save_flags() + { + __stream_.flags(__fmtflags_); + __stream_.fill(__fill_); + } +}; + +template <class _CharT, class _Traits, + class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + __os.fill(__os.widen(' ')); + return __os << __x.__x_; +} + +template <class _CharT, class _Traits, + class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + linear_congruential_engine<_UIntType, __a, __c, __m>& __x) +{ + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + _UIntType __t; + __is >> __t; + if (!__is.fail()) + __x.__x_ = __t; + return __is; +} + +typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> + minstd_rand0; +typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> + minstd_rand; +typedef minstd_rand default_random_engine; +// mersenne_twister_engine + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +class mersenne_twister_engine; + +template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +bool +operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +bool +operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +class _LIBCPP_VISIBLE mersenne_twister_engine +{ +public: + // types + typedef _UIntType result_type; + +private: + result_type __x_[__n]; + size_t __i_; + + static_assert( 0 < __m, "mersenne_twister_engine invalid parameters"); + static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); + static const result_type _Dt = numeric_limits<result_type>::digits; + static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); + static_assert( 2 <= __w, "mersenne_twister_engine invalid parameters"); + static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); + static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); + static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); + static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); + static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); +public: + static const result_type _Min = 0; + static const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); + static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); + static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); + static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); + static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); + static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); + static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); + + // engine characteristics + static const/*expr*/ size_t word_size = __w; + static const/*expr*/ size_t state_size = __n; + static const/*expr*/ size_t shift_size = __m; + static const/*expr*/ size_t mask_bits = __r; + static const/*expr*/ result_type xor_mask = __a; + static const/*expr*/ size_t tempering_u = __u; + static const/*expr*/ result_type tempering_d = __d; + static const/*expr*/ size_t tempering_s = __s; + static const/*expr*/ result_type tempering_b = __b; + static const/*expr*/ size_t tempering_t = __t; + static const/*expr*/ result_type tempering_c = __c; + static const/*expr*/ size_t tempering_l = __l; + static const/*expr*/ result_type initialization_multiplier = __f; + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() { return _Min; } + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() { return _Max; } + static const/*expr*/ result_type default_seed = 5489u; + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + explicit mersenne_twister_engine(result_type __sd = default_seed) + {seed(__sd);} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit mersenne_twister_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) + {seed(__q);} + void seed(result_type __sd = default_seed); + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, mersenne_twister_engine>::value, + void + >::type + seed(_Sseq& __q) + {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} + + // generating functions + result_type operator()(); + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> + friend + bool + operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + + template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> + friend + bool + operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + + template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + + template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x); +private: + + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 1>); + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 2>); + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + __count < __w, + result_type + >::type + __lshift(result_type __x) {return (__x << __count) & _Max;} + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + (__count >= __w), + result_type + >::type + __lshift(result_type) {return result_type(0);} + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + __count < _Dt, + result_type + >::type + __rshift(result_type __x) {return __x >> __count;} + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + (__count >= _Dt), + result_type + >::type + __rshift(result_type) {return result_type(0);} +}; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, + __t, __c, __l, __f>::seed(result_type __sd) +{ // __w >= 2 + __x_[0] = __sd & _Max; + for (size_t __i = 1; __i < __n; ++__i) + __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; + __i_ = 0; +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +template<class _Sseq> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, + __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) +{ + const unsigned __k = 1; + uint32_t __ar[__n * __k]; + __q.generate(__ar, __ar + __n * __k); + for (size_t __i = 0; __i < __n; ++__i) + __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); + const result_type __mask = __r == _Dt ? result_type(~0) : + (result_type(1) << __r) - result_type(1); + __i_ = 0; + if ((__x_[0] & ~__mask) == 0) + { + for (size_t __i = 1; __i < __n; ++__i) + if (__x_[__i] != 0) + return; + __x_[0] = _Max; + } +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +template<class _Sseq> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, + __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) +{ + const unsigned __k = 2; + uint32_t __ar[__n * __k]; + __q.generate(__ar, __ar + __n * __k); + for (size_t __i = 0; __i < __n; ++__i) + __x_[__i] = static_cast<result_type>( + (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); + const result_type __mask = __r == _Dt ? result_type(~0) : + (result_type(1) << __r) - result_type(1); + __i_ = 0; + if ((__x_[0] & ~__mask) == 0) + { + for (size_t __i = 1; __i < __n; ++__i) + if (__x_[__i] != 0) + return; + __x_[0] = _Max; + } +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, + _UIntType __a, size_t __u, _UIntType __d, size_t __s, + _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +_UIntType +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, + __t, __c, __l, __f>::operator()() +{ + const size_t __j = (__i_ + 1) % __n; + const result_type __mask = __r == _Dt ? result_type(~0) : + (result_type(1) << __r) - result_type(1); + const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); + const size_t __k = (__i_ + __m) % __n; + __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); + result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); + __i_ = __j; + __z ^= __lshift<__s>(__z) & __b; + __z ^= __lshift<__t>(__z) & __c; + return __z ^ __rshift<__l>(__z); +} + +template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +bool +operator==(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y) +{ + if (__x.__i_ == __y.__i_) + return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); + if (__x.__i_ == 0 || __y.__i_ == 0) + { + size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); + if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, + __y.__x_ + __y.__i_)) + return false; + if (__x.__i_ == 0) + return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); + return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); + } + if (__x.__i_ < __y.__i_) + { + size_t __j = _Np - __y.__i_; + if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), + __y.__x_ + __y.__i_)) + return false; + if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, + __y.__x_)) + return false; + return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, + __y.__x_ + (_Np - (__x.__i_ + __j))); + } + size_t __j = _Np - __x.__i_; + if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), + __x.__x_ + __x.__i_)) + return false; + if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, + __x.__x_)) + return false; + return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, + __x.__x_ + (_Np - (__y.__i_ + __j))); +} + +template <class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __y) +{ + return !(__x == __y); +} + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.__x_[__x.__i_]; + for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) + __os << __sp << __x.__x_[__j]; + for (size_t __j = 0; __j < __x.__i_; ++__j) + __os << __sp << __x.__x_[__j]; + return __os; +} + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, + _UI _Ap, size_t _Up, _UI _Dp, size_t _Sp, + _UI _Bp, size_t _Tp, _UI _Cp, size_t _Lp, _UI _Fp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + mersenne_twister_engine<_UI, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, + _Bp, _Tp, _Cp, _Lp, _Fp>& __x) +{ + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + _UI __t[_Np]; + for (size_t __i = 0; __i < _Np; ++__i) + __is >> __t[__i]; + if (!__is.fail()) + { + for (size_t __i = 0; __i < _Np; ++__i) + __x.__x_[__i] = __t[__i]; + __x.__i_ = 0; + } + return __is; +} + +typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, + 0x9908b0df, 11, 0xffffffff, + 7, 0x9d2c5680, + 15, 0xefc60000, + 18, 1812433253> mt19937; +typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, + 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, + 17, 0x71d67fffeda60000ULL, + 37, 0xfff7eee000000000ULL, + 43, 6364136223846793005ULL> mt19937_64; + +// subtract_with_carry_engine + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +class subtract_with_carry_engine; + +template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +bool +operator==( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); + +template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +bool +operator!=( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +class _LIBCPP_VISIBLE subtract_with_carry_engine +{ +public: + // types + typedef _UIntType result_type; + +private: + result_type __x_[__r]; + result_type __c_; + size_t __i_; + + static const result_type _Dt = numeric_limits<result_type>::digits; + static_assert( 0 < __w, "subtract_with_carry_engine invalid parameters"); + static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); + static_assert( 0 < __s, "subtract_with_carry_engine invalid parameters"); + static_assert(__s < __r, "subtract_with_carry_engine invalid parameters"); +public: + static const result_type _Min = 0; + static const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); + static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); + + // engine characteristics + static const/*expr*/ size_t word_size = __w; + static const/*expr*/ size_t short_lag = __s; + static const/*expr*/ size_t long_lag = __r; + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() { return _Min; } + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() { return _Max; } + static const/*expr*/ result_type default_seed = 19780503u; + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + explicit subtract_with_carry_engine(result_type __sd = default_seed) + {seed(__sd);} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit subtract_with_carry_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) + {seed(__q);} + _LIBCPP_INLINE_VISIBILITY + void seed(result_type __sd = default_seed) + {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, + void + >::type + seed(_Sseq& __q) + {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} + + // generating functions + result_type operator()(); + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> + friend + bool + operator==( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); + + template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> + friend + bool + operator!=( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y); + + template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); + + template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x); + +private: + + void seed(result_type __sd, integral_constant<unsigned, 1>); + void seed(result_type __sd, integral_constant<unsigned, 2>); + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 1>); + template<class _Sseq> + void __seed(_Sseq& __q, integral_constant<unsigned, 2>); +}; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, + integral_constant<unsigned, 1>) +{ + linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> + __e(__sd == 0u ? default_seed : __sd); + for (size_t __i = 0; __i < __r; ++__i) + __x_[__i] = static_cast<result_type>(__e() & _Max); + __c_ = __x_[__r-1] == 0; + __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, + integral_constant<unsigned, 2>) +{ + linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> + __e(__sd == 0u ? default_seed : __sd); + for (size_t __i = 0; __i < __r; ++__i) + { + result_type __e0 = __e(); + __x_[__i] = static_cast<result_type>( + (__e0 + ((uint64_t)__e() << 32)) & _Max); + } + __c_ = __x_[__r-1] == 0; + __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +template<class _Sseq> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, + integral_constant<unsigned, 1>) +{ + const unsigned __k = 1; + uint32_t __ar[__r * __k]; + __q.generate(__ar, __ar + __r * __k); + for (size_t __i = 0; __i < __r; ++__i) + __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); + __c_ = __x_[__r-1] == 0; + __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +template<class _Sseq> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, + integral_constant<unsigned, 2>) +{ + const unsigned __k = 2; + uint32_t __ar[__r * __k]; + __q.generate(__ar, __ar + __r * __k); + for (size_t __i = 0; __i < __r; ++__i) + __x_[__i] = static_cast<result_type>( + (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); + __c_ = __x_[__r-1] == 0; + __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +_UIntType +subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() +{ + const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; + result_type& __xr = __x_[__i_]; + result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; + __xr = (__xs - __xr - __c_) & _Max; + __c_ = __new_c; + __i_ = (__i_ + 1) % __r; + return __xr; +} + +template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +bool +operator==( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) +{ + if (__x.__c_ != __y.__c_) + return false; + if (__x.__i_ == __y.__i_) + return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); + if (__x.__i_ == 0 || __y.__i_ == 0) + { + size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); + if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, + __y.__x_ + __y.__i_)) + return false; + if (__x.__i_ == 0) + return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); + return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); + } + if (__x.__i_ < __y.__i_) + { + size_t __j = _Rp - __y.__i_; + if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), + __y.__x_ + __y.__i_)) + return false; + if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, + __y.__x_)) + return false; + return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, + __y.__x_ + (_Rp - (__x.__i_ + __j))); + } + size_t __j = _Rp - __x.__i_; + if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), + __x.__x_ + __x.__i_)) + return false; + if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, + __x.__x_)) + return false; + return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, + __x.__x_ + (_Rp - (__y.__i_ + __j))); +} + +template<class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __y) +{ + return !(__x == __y); +} + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.__x_[__x.__i_]; + for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) + __os << __sp << __x.__x_[__j]; + for (size_t __j = 0; __j < __x.__i_; ++__j) + __os << __sp << __x.__x_[__j]; + __os << __sp << __x.__c_; + return __os; +} + +template <class _CharT, class _Traits, + class _UI, size_t _Wp, size_t _Sp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + subtract_with_carry_engine<_UI, _Wp, _Sp, _Rp>& __x) +{ + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + _UI __t[_Rp+1]; + for (size_t __i = 0; __i < _Rp+1; ++__i) + __is >> __t[__i]; + if (!__is.fail()) + { + for (size_t __i = 0; __i < _Rp; ++__i) + __x.__x_[__i] = __t[__i]; + __x.__c_ = __t[_Rp]; + __x.__i_ = 0; + } + return __is; +} + +typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; +typedef subtract_with_carry_engine<uint_fast64_t, 48, 5, 12> ranlux48_base; + +// discard_block_engine + +template<class _Engine, size_t __p, size_t __r> +class _LIBCPP_VISIBLE discard_block_engine +{ + _Engine __e_; + int __n_; + + static_assert( 0 < __r, "discard_block_engine invalid parameters"); + static_assert(__r <= __p, "discard_block_engine invalid parameters"); +public: + // types + typedef typename _Engine::result_type result_type; + + // engine characteristics + static const/*expr*/ size_t block_size = __p; + static const/*expr*/ size_t used_block = __r; + + // Temporary work around for lack of constexpr + static const result_type _Min = _Engine::_Min; + static const result_type _Max = _Engine::_Max; + + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() { return _Engine::min(); } + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() { return _Engine::max(); } + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + discard_block_engine() : __n_(0) {} + _LIBCPP_INLINE_VISIBILITY + explicit discard_block_engine(const _Engine& __e) + : __e_(__e), __n_(0) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit discard_block_engine(_Engine&& __e) + : __e_(_VSTD::move(__e)), __n_(0) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit discard_block_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && + !is_convertible<_Sseq, _Engine>::value>::type* = 0) + : __e_(__q), __n_(0) {} + _LIBCPP_INLINE_VISIBILITY + void seed() {__e_.seed(); __n_ = 0;} + _LIBCPP_INLINE_VISIBILITY + void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, discard_block_engine>::value, + void + >::type + seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} + + // generating functions + result_type operator()(); + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + // property functions + _LIBCPP_INLINE_VISIBILITY + const _Engine& base() const {return __e_;} + + template<class _Eng, size_t _Pp, size_t _Rp> + friend + bool + operator==( + const discard_block_engine<_Eng, _Pp, _Rp>& __x, + const discard_block_engine<_Eng, _Pp, _Rp>& __y); + + template<class _Eng, size_t _Pp, size_t _Rp> + friend + bool + operator!=( + const discard_block_engine<_Eng, _Pp, _Rp>& __x, + const discard_block_engine<_Eng, _Pp, _Rp>& __y); + + template <class _CharT, class _Traits, + class _Eng, size_t _Pp, size_t _Rp> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const discard_block_engine<_Eng, _Pp, _Rp>& __x); + + template <class _CharT, class _Traits, + class _Eng, size_t _Pp, size_t _Rp> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + discard_block_engine<_Eng, _Pp, _Rp>& __x); +}; + +template<class _Engine, size_t __p, size_t __r> +typename discard_block_engine<_Engine, __p, __r>::result_type +discard_block_engine<_Engine, __p, __r>::operator()() +{ + if (__n_ >= __r) + { + __e_.discard(__p - __r); + __n_ = 0; + } + ++__n_; + return __e_(); +} + +template<class _Eng, size_t _Pp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, + const discard_block_engine<_Eng, _Pp, _Rp>& __y) +{ + return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; +} + +template<class _Eng, size_t _Pp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, + const discard_block_engine<_Eng, _Pp, _Rp>& __y) +{ + return !(__x == __y); +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Pp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const discard_block_engine<_Eng, _Pp, _Rp>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.__e_ << __sp << __x.__n_; +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Pp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + discard_block_engine<_Eng, _Pp, _Rp>& __x) +{ + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + _Eng __e; + int __n; + __is >> __e >> __n; + if (!__is.fail()) + { + __x.__e_ = __e; + __x.__n_ = __n; + } + return __is; +} + +typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; +typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; + +// independent_bits_engine + +template<class _Engine, size_t __w, class _UIntType> +class _LIBCPP_VISIBLE independent_bits_engine +{ + template <class _UI, _UI _R0, size_t _Wp, size_t _Mp> + class __get_n + { + static const size_t _Dt = numeric_limits<_UI>::digits; + static const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); + static const size_t _W0 = _Wp / _Np; + static const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; + public: + static const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; + }; +public: + // types + typedef _UIntType result_type; + +private: + _Engine __e_; + + static const result_type _Dt = numeric_limits<result_type>::digits; + static_assert( 0 < __w, "independent_bits_engine invalid parameters"); + static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); + + typedef typename _Engine::result_type _Engine_result_type; + typedef typename conditional + < + sizeof(_Engine_result_type) <= sizeof(result_type), + result_type, + _Engine_result_type + >::type _Working_result_type; + // Temporary work around for lack of constexpr + static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min + + _Working_result_type(1); + static const size_t __m = __log2<_Working_result_type, _Rp>::value; + static const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; + static const size_t __w0 = __w / __n; + static const size_t __n0 = __n - __w % __n; + static const size_t _WDt = numeric_limits<_Working_result_type>::digits; + static const size_t _EDt = numeric_limits<_Engine_result_type>::digits; + static const _Working_result_type __y0 = __w0 >= _WDt ? 0 : + (_Rp >> __w0) << __w0; + static const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : + (_Rp >> (__w0+1)) << (__w0+1); + static const _Engine_result_type __mask0 = __w0 > 0 ? + _Engine_result_type(~0) >> (_EDt - __w0) : + _Engine_result_type(0); + static const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? + _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : + _Engine_result_type(~0); +public: + static const result_type _Min = 0; + static const result_type _Max = __w == _Dt ? result_type(~0) : + (result_type(1) << __w) - result_type(1); + static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); + + // engine characteristics + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() { return _Min; } + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() { return _Max; } + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + independent_bits_engine() {} + _LIBCPP_INLINE_VISIBILITY + explicit independent_bits_engine(const _Engine& __e) + : __e_(__e) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit independent_bits_engine(_Engine&& __e) + : __e_(_VSTD::move(__e)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit independent_bits_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && + !is_convertible<_Sseq, _Engine>::value>::type* = 0) + : __e_(__q) {} + _LIBCPP_INLINE_VISIBILITY + void seed() {__e_.seed();} + _LIBCPP_INLINE_VISIBILITY + void seed(result_type __sd) {__e_.seed(__sd);} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, independent_bits_engine>::value, + void + >::type + seed(_Sseq& __q) {__e_.seed(__q);} + + // generating functions + _LIBCPP_INLINE_VISIBILITY + result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + // property functions + _LIBCPP_INLINE_VISIBILITY + const _Engine& base() const {return __e_;} + + template<class _Eng, size_t _Wp, class _UI> + friend + bool + operator==( + const independent_bits_engine<_Eng, _Wp, _UI>& __x, + const independent_bits_engine<_Eng, _Wp, _UI>& __y); + + template<class _Eng, size_t _Wp, class _UI> + friend + bool + operator!=( + const independent_bits_engine<_Eng, _Wp, _UI>& __x, + const independent_bits_engine<_Eng, _Wp, _UI>& __y); + + template <class _CharT, class _Traits, + class _Eng, size_t _Wp, class _UI> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const independent_bits_engine<_Eng, _Wp, _UI>& __x); + + template <class _CharT, class _Traits, + class _Eng, size_t _Wp, class _UI> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + independent_bits_engine<_Eng, _Wp, _UI>& __x); + +private: + result_type __eval(false_type); + result_type __eval(true_type); + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + __count < _Dt, + result_type + >::type + __lshift(result_type __x) {return __x << __count;} + + template <size_t __count> + _LIBCPP_INLINE_VISIBILITY + static + typename enable_if + < + (__count >= _Dt), + result_type + >::type + __lshift(result_type) {return result_type(0);} +}; + +template<class _Engine, size_t __w, class _UIntType> +inline _LIBCPP_INLINE_VISIBILITY +_UIntType +independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type) +{ + return static_cast<result_type>(__e_() & __mask0); +} + +template<class _Engine, size_t __w, class _UIntType> +_UIntType +independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type) +{ + result_type _Sp = 0; + for (size_t __k = 0; __k < __n0; ++__k) + { + _Engine_result_type __u; + do + { + __u = __e_() - _Engine::min(); + } while (__u >= __y0); + _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0)); + } + for (size_t __k = __n0; __k < __n; ++__k) + { + _Engine_result_type __u; + do + { + __u = __e_() - _Engine::min(); + } while (__u >= __y1); + _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1)); + } + return _Sp; +} + +template<class _Eng, size_t _Wp, class _UI> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==( + const independent_bits_engine<_Eng, _Wp, _UI>& __x, + const independent_bits_engine<_Eng, _Wp, _UI>& __y) +{ + return __x.base() == __y.base(); +} + +template<class _Eng, size_t _Wp, class _UI> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( + const independent_bits_engine<_Eng, _Wp, _UI>& __x, + const independent_bits_engine<_Eng, _Wp, _UI>& __y) +{ + return !(__x == __y); +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Wp, class _UI> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const independent_bits_engine<_Eng, _Wp, _UI>& __x) +{ + return __os << __x.base(); +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Wp, class _UI> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + independent_bits_engine<_Eng, _Wp, _UI>& __x) +{ + _Eng __e; + __is >> __e; + if (!__is.fail()) + __x.__e_ = __e; + return __is; +} + +// shuffle_order_engine + +template <uint64_t _Xp, uint64_t _Yp> +struct __ugcd +{ + static const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; +}; + +template <uint64_t _Xp> +struct __ugcd<_Xp, 0> +{ + static const uint64_t value = _Xp; +}; + +template <uint64_t _Np, uint64_t _Dp> +class __uratio +{ + static_assert(_Dp != 0, "__uratio divide by 0"); + static const uint64_t __gcd = __ugcd<_Np, _Dp>::value; +public: + static const uint64_t num = _Np / __gcd; + static const uint64_t den = _Dp / __gcd; + + typedef __uratio<num, den> type; +}; + +template<class _Engine, size_t __k> +class _LIBCPP_VISIBLE shuffle_order_engine +{ + static_assert(0 < __k, "shuffle_order_engine invalid parameters"); +public: + // types + typedef typename _Engine::result_type result_type; + +private: + _Engine __e_; + result_type _V_[__k]; + result_type _Y_; + +public: + // engine characteristics + static const/*expr*/ size_t table_size = __k; + + static const result_type _Min = _Engine::_Min; + static const result_type _Max = _Engine::_Max; + static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type min() { return _Min; } + _LIBCPP_INLINE_VISIBILITY + static const/*expr*/ result_type max() { return _Max; } + + static const unsigned long long _Rp = _Max - _Min + 1ull; + + // constructors and seeding functions + _LIBCPP_INLINE_VISIBILITY + shuffle_order_engine() {__init();} + _LIBCPP_INLINE_VISIBILITY + explicit shuffle_order_engine(const _Engine& __e) + : __e_(__e) {__init();} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit shuffle_order_engine(_Engine&& __e) + : __e_(_VSTD::move(__e)) {__init();} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + explicit shuffle_order_engine(_Sseq& __q, + typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value && + !is_convertible<_Sseq, _Engine>::value>::type* = 0) + : __e_(__q) {__init();} + _LIBCPP_INLINE_VISIBILITY + void seed() {__e_.seed(); __init();} + _LIBCPP_INLINE_VISIBILITY + void seed(result_type __sd) {__e_.seed(__sd); __init();} + template<class _Sseq> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_seed_sequence<_Sseq, shuffle_order_engine>::value, + void + >::type + seed(_Sseq& __q) {__e_.seed(__q); __init();} + + // generating functions + _LIBCPP_INLINE_VISIBILITY + result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} + _LIBCPP_INLINE_VISIBILITY + void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + + // property functions + _LIBCPP_INLINE_VISIBILITY + const _Engine& base() const {return __e_;} + +private: + template<class _Eng, size_t _Kp> + friend + bool + operator==( + const shuffle_order_engine<_Eng, _Kp>& __x, + const shuffle_order_engine<_Eng, _Kp>& __y); + + template<class _Eng, size_t _Kp> + friend + bool + operator!=( + const shuffle_order_engine<_Eng, _Kp>& __x, + const shuffle_order_engine<_Eng, _Kp>& __y); + + template <class _CharT, class _Traits, + class _Eng, size_t _Kp> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const shuffle_order_engine<_Eng, _Kp>& __x); + + template <class _CharT, class _Traits, + class _Eng, size_t _Kp> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + shuffle_order_engine<_Eng, _Kp>& __x); + + _LIBCPP_INLINE_VISIBILITY + void __init() + { + for (size_t __i = 0; __i < __k; ++__i) + _V_[__i] = __e_(); + _Y_ = __e_(); + } + + _LIBCPP_INLINE_VISIBILITY + result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());} + _LIBCPP_INLINE_VISIBILITY + result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());} + + _LIBCPP_INLINE_VISIBILITY + result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());} + _LIBCPP_INLINE_VISIBILITY + result_type __eval2(true_type) {return __evalf<__k, 0>();} + + template <uint64_t _Np, uint64_t _Dp> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)), + result_type + >::type + __eval(__uratio<_Np, _Dp>) + {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();} + + template <uint64_t _Np, uint64_t _Dp> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min), + result_type + >::type + __eval(__uratio<_Np, _Dp>) + { + const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min) + / __uratio<_Np, _Dp>::den); + _Y_ = _V_[__j]; + _V_[__j] = __e_(); + return _Y_; + } + + template <uint64_t __n, uint64_t __d> + _LIBCPP_INLINE_VISIBILITY + result_type __evalf() + { + const double _Fp = __d == 0 ? + __n / (2. * 0x8000000000000000ull) : + __n / (double)__d; + const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min)); + _Y_ = _V_[__j]; + _V_[__j] = __e_(); + return _Y_; + } +}; + +template<class _Eng, size_t _Kp> +bool +operator==( + const shuffle_order_engine<_Eng, _Kp>& __x, + const shuffle_order_engine<_Eng, _Kp>& __y) +{ + return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) && + __x.__e_ == __y.__e_; +} + +template<class _Eng, size_t _Kp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( + const shuffle_order_engine<_Eng, _Kp>& __x, + const shuffle_order_engine<_Eng, _Kp>& __y) +{ + return !(__x == __y); +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Kp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const shuffle_order_engine<_Eng, _Kp>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.__e_ << __sp << __x._V_[0]; + for (size_t __i = 1; __i < _Kp; ++__i) + __os << __sp << __x._V_[__i]; + return __os << __sp << __x._Y_; +} + +template <class _CharT, class _Traits, + class _Eng, size_t _Kp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + shuffle_order_engine<_Eng, _Kp>& __x) +{ + typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + _Eng __e; + result_type _Vp[_Kp+1]; + __is >> __e; + for (size_t __i = 0; __i < _Kp+1; ++__i) + __is >> _Vp[__i]; + if (!__is.fail()) + { + __x.__e_ = __e; + for (size_t __i = 0; __i < _Kp; ++__i) + __x._V_[__i] = _Vp[__i]; + __x._Y_ = _Vp[_Kp]; + } + return __is; +} + +typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; + +// random_device + +class _LIBCPP_VISIBLE random_device +{ + int __f_; +public: + // types + typedef unsigned result_type; + + // generator characteristics + static const result_type _Min = 0; + static const result_type _Max = 0xFFFFFFFFu; + + _LIBCPP_INLINE_VISIBILITY + static constexpr result_type min() { return _Min;} + _LIBCPP_INLINE_VISIBILITY + static constexpr result_type max() { return _Max;} + + // constructors + explicit random_device(const string& __token = "/dev/urandom"); + ~random_device(); + + // generating functions + result_type operator()(); + + // property functions + double entropy() const; + +private: + // no copy functions + random_device(const random_device&); // = delete; + random_device& operator=(const random_device&); // = delete; +}; + +// seed_seq + +class _LIBCPP_VISIBLE seed_seq +{ +public: + // types + typedef uint32_t result_type; + +private: + vector<result_type> __v_; + + template<class _InputIterator> + void init(_InputIterator __first, _InputIterator __last); +public: + // constructors + _LIBCPP_INLINE_VISIBILITY + seed_seq() {} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _Tp> + _LIBCPP_INLINE_VISIBILITY + seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + template<class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + seed_seq(_InputIterator __first, _InputIterator __last) + {init(__first, __last);} + + // generating functions + template<class _RandomAccessIterator> + void generate(_RandomAccessIterator __first, _RandomAccessIterator __last); + + // property functions + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __v_.size();} + template<class _OutputIterator> + _LIBCPP_INLINE_VISIBILITY + void param(_OutputIterator __dest) const + {_VSTD::copy(__v_.begin(), __v_.end(), __dest);} + +private: + // no copy functions + seed_seq(const seed_seq&); // = delete; + void operator=(const seed_seq&); // = delete; + + _LIBCPP_INLINE_VISIBILITY + static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);} +}; + +template<class _InputIterator> +void +seed_seq::init(_InputIterator __first, _InputIterator __last) +{ + for (_InputIterator __s = __first; __s != __last; ++__s) + __v_.push_back(*__s & 0xFFFFFFFF); +} + +template<class _RandomAccessIterator> +void +seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + if (__first != __last) + { + _VSTD::fill(__first, __last, 0x8b8b8b8b); + const size_t __n = static_cast<size_t>(__last - __first); + const size_t __s = __v_.size(); + const size_t __t = (__n >= 623) ? 11 + : (__n >= 68) ? 7 + : (__n >= 39) ? 5 + : (__n >= 7) ? 3 + : (__n - 1) / 2; + const size_t __p = (__n - __t) / 2; + const size_t __q = __p + __t; + const size_t __m = _VSTD::max(__s + 1, __n); + // __k = 0; + { + result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p] + ^ __first[__n - 1]); + __first[__p] += __r; + __r += __s; + __first[__q] += __r; + __first[0] = __r; + } + for (size_t __k = 1; __k <= __s; ++__k) + { + const size_t __kmodn = __k % __n; + const size_t __kpmodn = (__k + __p) % __n; + result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] + ^ __first[(__k - 1) % __n]); + __first[__kpmodn] += __r; + __r += __kmodn + __v_[__k-1]; + __first[(__k + __q) % __n] += __r; + __first[__kmodn] = __r; + } + for (size_t __k = __s + 1; __k < __m; ++__k) + { + const size_t __kmodn = __k % __n; + const size_t __kpmodn = (__k + __p) % __n; + result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] + ^ __first[(__k - 1) % __n]); + __first[__kpmodn] += __r; + __r += __kmodn; + __first[(__k + __q) % __n] += __r; + __first[__kmodn] = __r; + } + for (size_t __k = __m; __k < __m + __n; ++__k) + { + const size_t __kmodn = __k % __n; + const size_t __kpmodn = (__k + __p) % __n; + result_type __r = 1566083941 * _Tp(__first[__kmodn] + + __first[__kpmodn] + + __first[(__k - 1) % __n]); + __first[__kpmodn] ^= __r; + __r -= __kmodn; + __first[(__k + __q) % __n] ^= __r; + __first[__kmodn] = __r; + } + } +} + +// generate_canonical + +template<class _RealType, size_t __bits, class _URNG> +_RealType +generate_canonical(_URNG& __g) +{ + const size_t _Dt = numeric_limits<_RealType>::digits; + const size_t __b = _Dt < __bits ? _Dt : __bits; + const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value; + const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); + const _RealType _Rp = _URNG::_Max - _URNG::_Min + _RealType(1); + _RealType __base = _Rp; + _RealType _Sp = __g() - _URNG::_Min; + for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) + _Sp += (__g() - _URNG::_Min) * __base; + return _Sp / __base; +} + +// uniform_int_distribution + +// in <algorithm> + +template <class _CharT, class _Traits, class _IT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const uniform_int_distribution<_IT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.a() << __sp << __x.b(); +} + +template <class _CharT, class _Traits, class _IT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + uniform_int_distribution<_IT>& __x) +{ + typedef uniform_int_distribution<_IT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __a; + result_type __b; + __is >> __a >> __b; + if (!__is.fail()) + __x.param(param_type(__a, __b)); + return __is; +} + +// uniform_real_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE uniform_real_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __a_; + result_type __b_; + public: + typedef uniform_real_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __a = 0, + result_type __b = 1) + : __a_(__a), __b_(__b) {} + + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __a_;} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __b_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1) + : __p_(param_type(__a, __b)) {} + _LIBCPP_INLINE_VISIBILITY + explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __p_.a();} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __p_.b();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return a();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return b();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const uniform_real_distribution& __x, + const uniform_real_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const uniform_real_distribution& __x, + const uniform_real_distribution& __y) + {return !(__x == __y);} +}; + +template<class _RealType> +template<class _URNG> +inline _LIBCPP_INLINE_VISIBILITY +typename uniform_real_distribution<_RealType>::result_type +uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + return (__p.b() - __p.a()) + * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g) + + __p.a(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const uniform_real_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.a() << __sp << __x.b(); +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + uniform_real_distribution<_RT>& __x) +{ + typedef uniform_real_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __a; + result_type __b; + __is >> __a >> __b; + if (!__is.fail()) + __x.param(param_type(__a, __b)); + return __is; +} + +// bernoulli_distribution + +class _LIBCPP_VISIBLE bernoulli_distribution +{ +public: + // types + typedef bool result_type; + + class _LIBCPP_VISIBLE param_type + { + double __p_; + public: + typedef bernoulli_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(double __p = 0.5) : __p_(__p) {} + + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit bernoulli_distribution(double __p = 0.5) + : __p_(param_type(__p)) {} + _LIBCPP_INLINE_VISIBILITY + explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_.p();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return false;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return true;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const bernoulli_distribution& __x, + const bernoulli_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const bernoulli_distribution& __x, + const bernoulli_distribution& __y) + {return !(__x == __y);} +}; + +template<class _URNG> +inline _LIBCPP_INLINE_VISIBILITY +bernoulli_distribution::result_type +bernoulli_distribution::operator()(_URNG& __g, const param_type& __p) +{ + uniform_real_distribution<double> __gen; + return __gen(__g) < __p.p(); +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.p(); +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x) +{ + typedef bernoulli_distribution _Eng; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + double __p; + __is >> __p; + if (!__is.fail()) + __x.param(param_type(__p)); + return __is; +} + +// binomial_distribution + +template<class _IntType = int> +class _LIBCPP_VISIBLE binomial_distribution +{ +public: + // types + typedef _IntType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __t_; + double __p_; + double __pr_; + double __odds_ratio_; + result_type __r0_; + public: + typedef binomial_distribution distribution_type; + + explicit param_type(result_type __t = 1, double __p = 0.5); + + _LIBCPP_INLINE_VISIBILITY + result_type t() const {return __t_;} + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + + friend class binomial_distribution; + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit binomial_distribution(result_type __t = 1, double __p = 0.5) + : __p_(param_type(__t, __p)) {} + _LIBCPP_INLINE_VISIBILITY + explicit binomial_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type t() const {return __p_.t();} + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_.p();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return t();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const binomial_distribution& __x, + const binomial_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const binomial_distribution& __x, + const binomial_distribution& __y) + {return !(__x == __y);} +}; + +template<class _IntType> +binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p) + : __t_(__t), __p_(__p) +{ + if (0 < __p_ && __p_ < 1) + { + __r0_ = static_cast<result_type>((__t_ + 1) * __p_); + __pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) - + _VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) + + (__t_ - __r0_) * _VSTD::log(1 - __p_)); + __odds_ratio_ = __p_ / (1 - __p_); + } +} + +template<class _IntType> +template<class _URNG> +_IntType +binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr) +{ + if (__pr.__t_ == 0 || __pr.__p_ == 0) + return 0; + if (__pr.__p_ == 1) + return __pr.__t_; + uniform_real_distribution<double> __gen; + double __u = __gen(__g) - __pr.__pr_; + if (__u < 0) + return __pr.__r0_; + double __pu = __pr.__pr_; + double __pd = __pu; + result_type __ru = __pr.__r0_; + result_type __rd = __ru; + while (true) + { + if (__rd >= 1) + { + __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1)); + __u -= __pd; + if (__u < 0) + return __rd - 1; + } + --__rd; + ++__ru; + if (__ru <= __pr.__t_) + { + __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru; + __u -= __pu; + if (__u < 0) + return __ru; + } + } +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const binomial_distribution<_IntType>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.t() << __sp << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + binomial_distribution<_IntType>& __x) +{ + typedef binomial_distribution<_IntType> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __t; + double __p; + __is >> __t >> __p; + if (!__is.fail()) + __x.param(param_type(__t, __p)); + return __is; +} + +// exponential_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE exponential_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __lambda_; + public: + typedef exponential_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {} + + _LIBCPP_INLINE_VISIBILITY + result_type lambda() const {return __lambda_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__lambda_ == __y.__lambda_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit exponential_distribution(result_type __lambda = 1) + : __p_(param_type(__lambda)) {} + _LIBCPP_INLINE_VISIBILITY + explicit exponential_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type lambda() const {return __p_.lambda();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const exponential_distribution& __x, + const exponential_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const exponential_distribution& __x, + const exponential_distribution& __y) + {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + return -_VSTD::log + ( + result_type(1) - + _VSTD::generate_canonical<result_type, + numeric_limits<result_type>::digits>(__g) + ) + / __p.lambda(); +} + +template <class _CharT, class _Traits, class _RealType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const exponential_distribution<_RealType>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + return __os << __x.lambda(); +} + +template <class _CharT, class _Traits, class _RealType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + exponential_distribution<_RealType>& __x) +{ + typedef exponential_distribution<_RealType> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __lambda; + __is >> __lambda; + if (!__is.fail()) + __x.param(param_type(__lambda)); + return __is; +} + +// normal_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE normal_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __mean_; + result_type __stddev_; + public: + typedef normal_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __mean = 0, result_type __stddev = 1) + : __mean_(__mean), __stddev_(__stddev) {} + + _LIBCPP_INLINE_VISIBILITY + result_type mean() const {return __mean_;} + _LIBCPP_INLINE_VISIBILITY + result_type stddev() const {return __stddev_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + result_type _V_; + bool _V_hot_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit normal_distribution(result_type __mean = 0, result_type __stddev = 1) + : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} + _LIBCPP_INLINE_VISIBILITY + explicit normal_distribution(const param_type& __p) + : __p_(__p), _V_hot_(false) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {_V_hot_ = false;} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type mean() const {return __p_.mean();} + _LIBCPP_INLINE_VISIBILITY + result_type stddev() const {return __p_.stddev();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return -numeric_limits<result_type>::infinity();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const normal_distribution& __x, + const normal_distribution& __y) + {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ && + (!__x._V_hot_ || __x._V_ == __y._V_);} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const normal_distribution& __x, + const normal_distribution& __y) + {return !(__x == __y);} + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const normal_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + normal_distribution<_RT>& __x); +}; + +template <class _RealType> +template<class _URNG> +_RealType +normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + result_type _Up; + if (_V_hot_) + { + _V_hot_ = false; + _Up = _V_; + } + else + { + uniform_real_distribution<result_type> _Uni(-1, 1); + result_type __u; + result_type __v; + result_type __s; + do + { + __u = _Uni(__g); + __v = _Uni(__g); + __s = __u * __u + __v * __v; + } while (__s > 1 || __s == 0); + result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); + _V_ = __v * _Fp; + _V_hot_ = true; + _Up = __u * _Fp; + } + return _Up * __p.stddev() + __p.mean(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const normal_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_; + if (__x._V_hot_) + __os << __sp << __x._V_; + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + normal_distribution<_RT>& __x) +{ + typedef normal_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __mean; + result_type __stddev; + result_type _Vp = 0; + bool _V_hot = false; + __is >> __mean >> __stddev >> _V_hot; + if (_V_hot) + __is >> _Vp; + if (!__is.fail()) + { + __x.param(param_type(__mean, __stddev)); + __x._V_hot_ = _V_hot; + __x._V_ = _Vp; + } + return __is; +} + +// lognormal_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE lognormal_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + normal_distribution<result_type> __nd_; + public: + typedef lognormal_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __m = 0, result_type __s = 1) + : __nd_(__m, __s) {} + + _LIBCPP_INLINE_VISIBILITY + result_type m() const {return __nd_.mean();} + _LIBCPP_INLINE_VISIBILITY + result_type s() const {return __nd_.stddev();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__nd_ == __y.__nd_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + friend class lognormal_distribution; + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const lognormal_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + lognormal_distribution<_RT>& __x); + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit lognormal_distribution(result_type __m = 0, result_type __s = 1) + : __p_(param_type(__m, __s)) {} + _LIBCPP_INLINE_VISIBILITY + explicit lognormal_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {__p_.__nd_.reset();} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g, const param_type& __p) + {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));} + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type m() const {return __p_.m();} + _LIBCPP_INLINE_VISIBILITY + result_type s() const {return __p_.s();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const lognormal_distribution& __x, + const lognormal_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const lognormal_distribution& __x, + const lognormal_distribution& __y) + {return !(__x == __y);} + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const lognormal_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + lognormal_distribution<_RT>& __x); +}; + +template <class _CharT, class _Traits, class _RT> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const lognormal_distribution<_RT>& __x) +{ + return __os << __x.__p_.__nd_; +} + +template <class _CharT, class _Traits, class _RT> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + lognormal_distribution<_RT>& __x) +{ + return __is >> __x.__p_.__nd_; +} + +// poisson_distribution + +template<class _IntType = int> +class _LIBCPP_VISIBLE poisson_distribution +{ +public: + // types + typedef _IntType result_type; + + class _LIBCPP_VISIBLE param_type + { + double __mean_; + double __s_; + double __d_; + double __l_; + double __omega_; + double __c0_; + double __c1_; + double __c2_; + double __c3_; + double __c_; + + public: + typedef poisson_distribution distribution_type; + + explicit param_type(double __mean = 1.0); + + _LIBCPP_INLINE_VISIBILITY + double mean() const {return __mean_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__mean_ == __y.__mean_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + + friend class poisson_distribution; + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit poisson_distribution(double __mean = 1.0) : __p_(__mean) {} + _LIBCPP_INLINE_VISIBILITY + explicit poisson_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + double mean() const {return __p_.mean();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::max();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const poisson_distribution& __x, + const poisson_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const poisson_distribution& __x, + const poisson_distribution& __y) + {return !(__x == __y);} +}; + +template<class _IntType> +poisson_distribution<_IntType>::param_type::param_type(double __mean) + : __mean_(__mean) +{ + if (__mean_ < 10) + { + __s_ = 0; + __d_ = 0; + __l_ = _VSTD::exp(-__mean_); + __omega_ = 0; + __c3_ = 0; + __c2_ = 0; + __c1_ = 0; + __c0_ = 0; + __c_ = 0; + } + else + { + __s_ = _VSTD::sqrt(__mean_); + __d_ = 6 * __mean_ * __mean_; + __l_ = static_cast<result_type>(__mean_ - 1.1484); + __omega_ = .3989423 / __s_; + double __b1_ = .4166667E-1 / __mean_; + double __b2_ = .3 * __b1_ * __b1_; + __c3_ = .1428571 * __b1_ * __b2_; + __c2_ = __b2_ - 15. * __c3_; + __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_; + __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_; + __c_ = .1069 / __mean_; + } +} + +template <class _IntType> +template<class _URNG> +_IntType +poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) +{ + result_type __x; + uniform_real_distribution<double> __urd; + if (__pr.__mean_ < 10) + { + __x = 0; + for (double __p = __urd(__urng); __p > __pr.__l_; ++__x) + __p *= __urd(__urng); + } + else + { + double __difmuk; + double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng); + double __u; + if (__g > 0) + { + __x = static_cast<result_type>(__g); + if (__x >= __pr.__l_) + return __x; + __difmuk = __pr.__mean_ - __x; + __u = __urd(__urng); + if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk) + return __x; + } + exponential_distribution<double> __edist; + for (bool __using_exp_dist = false; true; __using_exp_dist = true) + { + double __e; + if (__using_exp_dist || __g < 0) + { + double __t; + do + { + __e = __edist(__urng); + __u = __urd(__urng); + __u += __u - 1; + __t = 1.8 + (__u < 0 ? -__e : __e); + } while (__t <= -.6744); + __x = __pr.__mean_ + __pr.__s_ * __t; + __difmuk = __pr.__mean_ - __x; + __using_exp_dist = true; + } + double __px; + double __py; + if (__x < 10) + { + const result_type __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, + 40320, 362880}; + __px = -__pr.__mean_; + __py = _VSTD::pow(__pr.__mean_, (double)__x) / __fac[__x]; + } + else + { + double __del = .8333333E-1 / __x; + __del -= 4.8 * __del * __del * __del; + double __v = __difmuk / __x; + if (_VSTD::abs(__v) > 0.25) + __px = __x * _VSTD::log(1 + __v) - __difmuk - __del; + else + __px = __x * __v * __v * (((((((.1250060 * __v + -.1384794) * + __v + .1421878) * __v + -.1661269) * __v + .2000118) * + __v + -.2500068) * __v + .3333333) * __v + -.5) - __del; + __py = .3989423 / _VSTD::sqrt(__x); + } + double __r = (0.5 - __difmuk) / __pr.__s_; + double __r2 = __r * __r; + double __fx = -0.5 * __r2; + double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) * + __r2 + __pr.__c1_) * __r2 + __pr.__c0_); + if (__using_exp_dist) + { + if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) - + __fy * _VSTD::exp(__fx + __e)) + break; + } + else + { + if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx)) + break; + } + } + } + return __x; +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const poisson_distribution<_IntType>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + return __os << __x.mean(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + poisson_distribution<_IntType>& __x) +{ + typedef poisson_distribution<_IntType> _Eng; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + double __mean; + __is >> __mean; + if (!__is.fail()) + __x.param(param_type(__mean)); + return __is; +} + +// weibull_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE weibull_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __a_; + result_type __b_; + public: + typedef weibull_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __a = 1, result_type __b = 1) + : __a_(__a), __b_(__b) {} + + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __a_;} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __b_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit weibull_distribution(result_type __a = 1, result_type __b = 1) + : __p_(param_type(__a, __b)) {} + _LIBCPP_INLINE_VISIBILITY + explicit weibull_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g, const param_type& __p) + {return __p.b() * + _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());} + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __p_.a();} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __p_.b();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const weibull_distribution& __x, + const weibull_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const weibull_distribution& __x, + const weibull_distribution& __y) + {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const weibull_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.a() << __sp << __x.b(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + weibull_distribution<_RT>& __x) +{ + typedef weibull_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __a; + result_type __b; + __is >> __a >> __b; + if (!__is.fail()) + __x.param(param_type(__a, __b)); + return __is; +} + +template<class _RealType = double> +class _LIBCPP_VISIBLE extreme_value_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __a_; + result_type __b_; + public: + typedef extreme_value_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __a = 0, result_type __b = 1) + : __a_(__a), __b_(__b) {} + + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __a_;} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __b_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit extreme_value_distribution(result_type __a = 0, result_type __b = 1) + : __p_(param_type(__a, __b)) {} + _LIBCPP_INLINE_VISIBILITY + explicit extreme_value_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __p_.a();} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __p_.b();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return -numeric_limits<result_type>::infinity();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const extreme_value_distribution& __x, + const extreme_value_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const extreme_value_distribution& __x, + const extreme_value_distribution& __y) + {return !(__x == __y);} +}; + +template<class _RealType> +template<class _URNG> +_RealType +extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + return __p.a() - __p.b() * + _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g))); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const extreme_value_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.a() << __sp << __x.b(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + extreme_value_distribution<_RT>& __x) +{ + typedef extreme_value_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __a; + result_type __b; + __is >> __a >> __b; + if (!__is.fail()) + __x.param(param_type(__a, __b)); + return __is; +} + +// gamma_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE gamma_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __alpha_; + result_type __beta_; + public: + typedef gamma_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __alpha = 1, result_type __beta = 1) + : __alpha_(__alpha), __beta_(__beta) {} + + _LIBCPP_INLINE_VISIBILITY + result_type alpha() const {return __alpha_;} + _LIBCPP_INLINE_VISIBILITY + result_type beta() const {return __beta_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit gamma_distribution(result_type __alpha = 1, result_type __beta = 1) + : __p_(param_type(__alpha, __beta)) {} + _LIBCPP_INLINE_VISIBILITY + explicit gamma_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type alpha() const {return __p_.alpha();} + _LIBCPP_INLINE_VISIBILITY + result_type beta() const {return __p_.beta();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const gamma_distribution& __x, + const gamma_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const gamma_distribution& __x, + const gamma_distribution& __y) + {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + result_type __a = __p.alpha(); + uniform_real_distribution<result_type> __gen(0, 1); + exponential_distribution<result_type> __egen; + result_type __x; + if (__a == 1) + __x = __egen(__g); + else if (__a > 1) + { + const result_type __b = __a - 1; + const result_type __c = 3 * __a - result_type(0.75); + while (true) + { + const result_type __u = __gen(__g); + const result_type __v = __gen(__g); + const result_type __w = __u * (1 - __u); + if (__w != 0) + { + const result_type __y = _VSTD::sqrt(__c / __w) * + (__u - result_type(0.5)); + __x = __b + __y; + if (__x >= 0) + { + const result_type __z = 64 * __w * __w * __w * __v * __v; + if (__z <= 1 - 2 * __y * __y / __x) + break; + if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y)) + break; + } + } + } + } + else // __a < 1 + { + while (true) + { + const result_type __u = __gen(__g); + const result_type __es = __egen(__g); + if (__u <= 1 - __a) + { + __x = _VSTD::pow(__u, 1 / __a); + if (__x <= __es) + break; + } + else + { + const result_type __e = -_VSTD::log((1-__u)/__a); + __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a); + if (__x <= __e + __es) + break; + } + } + } + return __x * __p.beta(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const gamma_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.alpha() << __sp << __x.beta(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + gamma_distribution<_RT>& __x) +{ + typedef gamma_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __alpha; + result_type __beta; + __is >> __alpha >> __beta; + if (!__is.fail()) + __x.param(param_type(__alpha, __beta)); + return __is; +} + +// negative_binomial_distribution + +template<class _IntType = int> +class _LIBCPP_VISIBLE negative_binomial_distribution +{ +public: + // types + typedef _IntType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __k_; + double __p_; + public: + typedef negative_binomial_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __k = 1, double __p = 0.5) + : __k_(__k), __p_(__p) {} + + _LIBCPP_INLINE_VISIBILITY + result_type k() const {return __k_;} + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit negative_binomial_distribution(result_type __k = 1, double __p = 0.5) + : __p_(__k, __p) {} + _LIBCPP_INLINE_VISIBILITY + explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type k() const {return __p_.k();} + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_.p();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::max();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const negative_binomial_distribution& __x, + const negative_binomial_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const negative_binomial_distribution& __x, + const negative_binomial_distribution& __y) + {return !(__x == __y);} +}; + +template <class _IntType> +template<class _URNG> +_IntType +negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) +{ + result_type __k = __pr.k(); + double __p = __pr.p(); + if (__k <= 21 * __p) + { + bernoulli_distribution __gen(__p); + result_type __f = 0; + result_type __s = 0; + while (__s < __k) + { + if (__gen(__urng)) + ++__s; + else + ++__f; + } + return __f; + } + return poisson_distribution<result_type>(gamma_distribution<double> + (__k, (1-__p)/__p)(__urng))(__urng); +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const negative_binomial_distribution<_IntType>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + return __os << __x.k() << __sp << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + negative_binomial_distribution<_IntType>& __x) +{ + typedef negative_binomial_distribution<_IntType> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __k; + double __p; + __is >> __k >> __p; + if (!__is.fail()) + __x.param(param_type(__k, __p)); + return __is; +} + +// geometric_distribution + +template<class _IntType = int> +class _LIBCPP_VISIBLE geometric_distribution +{ +public: + // types + typedef _IntType result_type; + + class _LIBCPP_VISIBLE param_type + { + double __p_; + public: + typedef geometric_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(double __p = 0.5) : __p_(__p) {} + + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructors and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit geometric_distribution(double __p = 0.5) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + explicit geometric_distribution(const param_type& __p) : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g, const param_type& __p) + {return negative_binomial_distribution<result_type>(1, __p.p())(__g);} + + // property functions + _LIBCPP_INLINE_VISIBILITY + double p() const {return __p_.p();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::max();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const geometric_distribution& __x, + const geometric_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const geometric_distribution& __x, + const geometric_distribution& __y) + {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const geometric_distribution<_IntType>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + return __os << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + geometric_distribution<_IntType>& __x) +{ + typedef geometric_distribution<_IntType> _Eng; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + double __p; + __is >> __p; + if (!__is.fail()) + __x.param(param_type(__p)); + return __is; +} + +// chi_squared_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE chi_squared_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __n_; + public: + typedef chi_squared_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __n = 1) : __n_(__n) {} + + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __n_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__n_ == __y.__n_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit chi_squared_distribution(result_type __n = 1) + : __p_(param_type(__n)) {} + _LIBCPP_INLINE_VISIBILITY + explicit chi_squared_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g, const param_type& __p) + {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);} + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __p_.n();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const chi_squared_distribution& __x, + const chi_squared_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const chi_squared_distribution& __x, + const chi_squared_distribution& __y) + {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const chi_squared_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + __os << __x.n(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + chi_squared_distribution<_RT>& __x) +{ + typedef chi_squared_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __n; + __is >> __n; + if (!__is.fail()) + __x.param(param_type(__n)); + return __is; +} + +// cauchy_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE cauchy_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __a_; + result_type __b_; + public: + typedef cauchy_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __a = 0, result_type __b = 1) + : __a_(__a), __b_(__b) {} + + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __a_;} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __b_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit cauchy_distribution(result_type __a = 0, result_type __b = 1) + : __p_(param_type(__a, __b)) {} + _LIBCPP_INLINE_VISIBILITY + explicit cauchy_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type a() const {return __p_.a();} + _LIBCPP_INLINE_VISIBILITY + result_type b() const {return __p_.b();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return -numeric_limits<result_type>::infinity();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const cauchy_distribution& __x, + const cauchy_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const cauchy_distribution& __x, + const cauchy_distribution& __y) + {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +inline _LIBCPP_INLINE_VISIBILITY +_RealType +cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + uniform_real_distribution<result_type> __gen; + // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite + return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const cauchy_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.a() << __sp << __x.b(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + cauchy_distribution<_RT>& __x) +{ + typedef cauchy_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __a; + result_type __b; + __is >> __a >> __b; + if (!__is.fail()) + __x.param(param_type(__a, __b)); + return __is; +} + +// fisher_f_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE fisher_f_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __m_; + result_type __n_; + public: + typedef fisher_f_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __m = 1, result_type __n = 1) + : __m_(__m), __n_(__n) {} + + _LIBCPP_INLINE_VISIBILITY + result_type m() const {return __m_;} + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __n_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1) + : __p_(param_type(__m, __n)) {} + _LIBCPP_INLINE_VISIBILITY + explicit fisher_f_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type m() const {return __p_.m();} + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __p_.n();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const fisher_f_distribution& __x, + const fisher_f_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const fisher_f_distribution& __x, + const fisher_f_distribution& __y) + {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + gamma_distribution<result_type> __gdm(__p.m() * result_type(.5)); + gamma_distribution<result_type> __gdn(__p.n() * result_type(.5)); + return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const fisher_f_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + __os << __x.m() << __sp << __x.n(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + fisher_f_distribution<_RT>& __x) +{ + typedef fisher_f_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __m; + result_type __n; + __is >> __m >> __n; + if (!__is.fail()) + __x.param(param_type(__m, __n)); + return __is; +} + +// student_t_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE student_t_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + result_type __n_; + public: + typedef student_t_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + explicit param_type(result_type __n = 1) : __n_(__n) {} + + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __n_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__n_ == __y.__n_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + }; + +private: + param_type __p_; + normal_distribution<result_type> __nd_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + explicit student_t_distribution(result_type __n = 1) + : __p_(param_type(__n)) {} + _LIBCPP_INLINE_VISIBILITY + explicit student_t_distribution(const param_type& __p) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {__nd_.reset();} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + result_type n() const {return __p_.n();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return -numeric_limits<result_type>::infinity();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return numeric_limits<result_type>::infinity();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const student_t_distribution& __x, + const student_t_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const student_t_distribution& __x, + const student_t_distribution& __y) + {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + gamma_distribution<result_type> __gd(__p.n() * .5, 2); + return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const student_t_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + __os << __x.n(); + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + student_t_distribution<_RT>& __x) +{ + typedef student_t_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + result_type __n; + __is >> __n; + if (!__is.fail()) + __x.param(param_type(__n)); + return __is; +} + +// discrete_distribution + +template<class _IntType = int> +class _LIBCPP_VISIBLE discrete_distribution +{ +public: + // types + typedef _IntType result_type; + + class _LIBCPP_VISIBLE param_type + { + vector<double> __p_; + public: + typedef discrete_distribution distribution_type; + + _LIBCPP_INLINE_VISIBILITY + param_type() {} + template<class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + param_type(_InputIterator __f, _InputIterator __l) + : __p_(__f, __l) {__init();} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + param_type(initializer_list<double> __wl) + : __p_(__wl.begin(), __wl.end()) {__init();} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + param_type(size_t __nw, double __xmin, double __xmax, + _UnaryOperation __fw); + + vector<double> probabilities() const; + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + + private: + void __init(); + + friend class discrete_distribution; + + template <class _CharT, class _Traits, class _IT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const discrete_distribution<_IT>& __x); + + template <class _CharT, class _Traits, class _IT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + discrete_distribution<_IT>& __x); + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + discrete_distribution() {} + template<class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + discrete_distribution(_InputIterator __f, _InputIterator __l) + : __p_(__f, __l) {} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + discrete_distribution(initializer_list<double> __wl) + : __p_(__wl) {} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + _LIBCPP_INLINE_VISIBILITY + discrete_distribution(size_t __nw, double __xmin, double __xmax, + _UnaryOperation __fw) + : __p_(__nw, __xmin, __xmax, __fw) {} + explicit discrete_distribution(const param_type& __p) + _LIBCPP_INLINE_VISIBILITY + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + vector<double> probabilities() const {return __p_.probabilities();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return 0;} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return __p_.__p_.size();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const discrete_distribution& __x, + const discrete_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const discrete_distribution& __x, + const discrete_distribution& __y) + {return !(__x == __y);} + + template <class _CharT, class _Traits, class _IT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const discrete_distribution<_IT>& __x); + + template <class _CharT, class _Traits, class _IT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + discrete_distribution<_IT>& __x); +}; + +template<class _IntType> +template<class _UnaryOperation> +discrete_distribution<_IntType>::param_type::param_type(size_t __nw, + double __xmin, + double __xmax, + _UnaryOperation __fw) +{ + if (__nw > 1) + { + __p_.reserve(__nw - 1); + double __d = (__xmax - __xmin) / __nw; + double __d2 = __d / 2; + for (size_t __k = 0; __k < __nw; ++__k) + __p_.push_back(__fw(__xmin + __k * __d + __d2)); + __init(); + } +} + +template<class _IntType> +void +discrete_distribution<_IntType>::param_type::__init() +{ + if (!__p_.empty()) + { + if (__p_.size() > 1) + { + double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0); + for (_VSTD::vector<double>::iterator __i = __p_.begin(), __e = __p_.end(); + __i < __e; ++__i) + *__i /= __s; + vector<double> __t(__p_.size() - 1); + _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin()); + swap(__p_, __t); + } + else + { + __p_.clear(); + __p_.shrink_to_fit(); + } + } +} + +template<class _IntType> +vector<double> +discrete_distribution<_IntType>::param_type::probabilities() const +{ + size_t __n = __p_.size(); + _VSTD::vector<double> __p(__n+1); + _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin()); + if (__n > 0) + __p[__n] = 1 - __p_[__n-1]; + else + __p[0] = 1; + return __p; +} + +template<class _IntType> +template<class _URNG> +_IntType +discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) +{ + uniform_real_distribution<double> __gen; + return static_cast<_IntType>( + _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) - + __p.__p_.begin()); +} + +template <class _CharT, class _Traits, class _IT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const discrete_distribution<_IT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + size_t __n = __x.__p_.__p_.size(); + __os << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__p_[__i]; + return __os; +} + +template <class _CharT, class _Traits, class _IT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + discrete_distribution<_IT>& __x) +{ + typedef discrete_distribution<_IT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + size_t __n; + __is >> __n; + vector<double> __p(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __p[__i]; + if (!__is.fail()) + swap(__x.__p_.__p_, __p); + return __is; +} + +// piecewise_constant_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE piecewise_constant_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + vector<result_type> __b_; + vector<result_type> __densities_; + vector<result_type> __areas_; + public: + typedef piecewise_constant_distribution distribution_type; + + param_type(); + template<class _InputIteratorB, class _InputIteratorW> + param_type(_InputIteratorB __fB, _InputIteratorB __lB, + _InputIteratorW __fW); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + param_type(size_t __nw, result_type __xmin, result_type __xmax, + _UnaryOperation __fw); + param_type & operator=(const param_type& __rhs); + + _LIBCPP_INLINE_VISIBILITY + vector<result_type> intervals() const {return __b_;} + _LIBCPP_INLINE_VISIBILITY + vector<result_type> densities() const {return __densities_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + + private: + void __init(); + + friend class piecewise_constant_distribution; + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_constant_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_constant_distribution<_RT>& __x); + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + piecewise_constant_distribution() {} + template<class _InputIteratorB, class _InputIteratorW> + _LIBCPP_INLINE_VISIBILITY + piecewise_constant_distribution(_InputIteratorB __fB, + _InputIteratorB __lB, + _InputIteratorW __fW) + : __p_(__fB, __lB, __fW) {} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + _LIBCPP_INLINE_VISIBILITY + piecewise_constant_distribution(initializer_list<result_type> __bl, + _UnaryOperation __fw) + : __p_(__bl, __fw) {} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + template<class _UnaryOperation> + _LIBCPP_INLINE_VISIBILITY + piecewise_constant_distribution(size_t __nw, result_type __xmin, + result_type __xmax, _UnaryOperation __fw) + : __p_(__nw, __xmin, __xmax, __fw) {} + + _LIBCPP_INLINE_VISIBILITY + explicit piecewise_constant_distribution(const param_type& __p) + : __p_(__p) {} + + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + vector<result_type> intervals() const {return __p_.intervals();} + _LIBCPP_INLINE_VISIBILITY + vector<result_type> densities() const {return __p_.densities();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return __p_.__b_.front();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return __p_.__b_.back();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const piecewise_constant_distribution& __x, + const piecewise_constant_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const piecewise_constant_distribution& __x, + const piecewise_constant_distribution& __y) + {return !(__x == __y);} + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_constant_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_constant_distribution<_RT>& __x); +}; + +template<class _RealType> +typename piecewise_constant_distribution<_RealType>::param_type & +piecewise_constant_distribution<_RealType>::param_type::operator= + (const param_type& __rhs) +{ +// These can throw + __b_.reserve (__rhs.__b_.size ()); + __densities_.reserve(__rhs.__densities_.size()); + __areas_.reserve (__rhs.__areas_.size()); + +// These can not throw + __b_ = __rhs.__b_; + __densities_ = __rhs.__densities_; + __areas_ = __rhs.__areas_; + return *this; +} + +template<class _RealType> +void +piecewise_constant_distribution<_RealType>::param_type::__init() +{ + // __densities_ contains non-normalized areas + result_type __total_area = _VSTD::accumulate(__densities_.begin(), + __densities_.end(), + result_type()); + for (size_t __i = 0; __i < __densities_.size(); ++__i) + __densities_[__i] /= __total_area; + // __densities_ contains normalized areas + __areas_.assign(__densities_.size(), result_type()); + _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1, + __areas_.begin() + 1); + // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1] + __densities_.back() = 1 - __areas_.back(); // correct round off error + for (size_t __i = 0; __i < __densities_.size(); ++__i) + __densities_[__i] /= (__b_[__i+1] - __b_[__i]); + // __densities_ now contains __densities_ +} + +template<class _RealType> +piecewise_constant_distribution<_RealType>::param_type::param_type() + : __b_(2), + __densities_(1, 1.0), + __areas_(1, 0.0) +{ + __b_[1] = 1; +} + +template<class _RealType> +template<class _InputIteratorB, class _InputIteratorW> +piecewise_constant_distribution<_RealType>::param_type::param_type( + _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) + : __b_(__fB, __lB) +{ + if (__b_.size() < 2) + { + __b_.resize(2); + __b_[0] = 0; + __b_[1] = 1; + __densities_.assign(1, 1.0); + __areas_.assign(1, 0.0); + } + else + { + __densities_.reserve(__b_.size() - 1); + for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW) + __densities_.push_back(*__fW); + __init(); + } +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _RealType> +template<class _UnaryOperation> +piecewise_constant_distribution<_RealType>::param_type::param_type( + initializer_list<result_type> __bl, _UnaryOperation __fw) + : __b_(__bl.begin(), __bl.end()) +{ + if (__b_.size() < 2) + { + __b_.resize(2); + __b_[0] = 0; + __b_[1] = 1; + __densities_.assign(1, 1.0); + __areas_.assign(1, 0.0); + } + else + { + __densities_.reserve(__b_.size() - 1); + for (size_t __i = 0; __i < __b_.size() - 1; ++__i) + __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5)); + __init(); + } +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _RealType> +template<class _UnaryOperation> +piecewise_constant_distribution<_RealType>::param_type::param_type( + size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) + : __b_(__nw == 0 ? 2 : __nw + 1) +{ + size_t __n = __b_.size() - 1; + result_type __d = (__xmax - __xmin) / __n; + __densities_.reserve(__n); + for (size_t __i = 0; __i < __n; ++__i) + { + __b_[__i] = __xmin + __i * __d; + __densities_.push_back(__fw(__b_[__i] + __d*.5)); + } + __b_[__n] = __xmax; + __init(); +} + +template<class _RealType> +template<class _URNG> +_RealType +piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + typedef uniform_real_distribution<result_type> _Gen; + result_type __u = _Gen()(__g); + ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), + __u) - __p.__areas_.begin() - 1; + return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k]; +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_constant_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + size_t __n = __x.__p_.__b_.size(); + __os << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__b_[__i]; + __n = __x.__p_.__densities_.size(); + __os << __sp << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__densities_[__i]; + __n = __x.__p_.__areas_.size(); + __os << __sp << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__areas_[__i]; + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_constant_distribution<_RT>& __x) +{ + typedef piecewise_constant_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + size_t __n; + __is >> __n; + vector<result_type> __b(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __b[__i]; + __is >> __n; + vector<result_type> __densities(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __densities[__i]; + __is >> __n; + vector<result_type> __areas(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __areas[__i]; + if (!__is.fail()) + { + swap(__x.__p_.__b_, __b); + swap(__x.__p_.__densities_, __densities); + swap(__x.__p_.__areas_, __areas); + } + return __is; +} + +// piecewise_linear_distribution + +template<class _RealType = double> +class _LIBCPP_VISIBLE piecewise_linear_distribution +{ +public: + // types + typedef _RealType result_type; + + class _LIBCPP_VISIBLE param_type + { + vector<result_type> __b_; + vector<result_type> __densities_; + vector<result_type> __areas_; + public: + typedef piecewise_linear_distribution distribution_type; + + param_type(); + template<class _InputIteratorB, class _InputIteratorW> + param_type(_InputIteratorB __fB, _InputIteratorB __lB, + _InputIteratorW __fW); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + param_type(size_t __nw, result_type __xmin, result_type __xmax, + _UnaryOperation __fw); + param_type & operator=(const param_type& __rhs); + + _LIBCPP_INLINE_VISIBILITY + vector<result_type> intervals() const {return __b_;} + _LIBCPP_INLINE_VISIBILITY + vector<result_type> densities() const {return __densities_;} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const param_type& __x, const param_type& __y) + {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const param_type& __x, const param_type& __y) + {return !(__x == __y);} + + private: + void __init(); + + friend class piecewise_linear_distribution; + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_linear_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_linear_distribution<_RT>& __x); + }; + +private: + param_type __p_; + +public: + // constructor and reset functions + _LIBCPP_INLINE_VISIBILITY + piecewise_linear_distribution() {} + template<class _InputIteratorB, class _InputIteratorW> + _LIBCPP_INLINE_VISIBILITY + piecewise_linear_distribution(_InputIteratorB __fB, + _InputIteratorB __lB, + _InputIteratorW __fW) + : __p_(__fB, __lB, __fW) {} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template<class _UnaryOperation> + _LIBCPP_INLINE_VISIBILITY + piecewise_linear_distribution(initializer_list<result_type> __bl, + _UnaryOperation __fw) + : __p_(__bl, __fw) {} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + template<class _UnaryOperation> + _LIBCPP_INLINE_VISIBILITY + piecewise_linear_distribution(size_t __nw, result_type __xmin, + result_type __xmax, _UnaryOperation __fw) + : __p_(__nw, __xmin, __xmax, __fw) {} + + _LIBCPP_INLINE_VISIBILITY + explicit piecewise_linear_distribution(const param_type& __p) + : __p_(__p) {} + + _LIBCPP_INLINE_VISIBILITY + void reset() {} + + // generating functions + template<class _URNG> + _LIBCPP_INLINE_VISIBILITY + result_type operator()(_URNG& __g) + {return (*this)(__g, __p_);} + template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + + // property functions + _LIBCPP_INLINE_VISIBILITY + vector<result_type> intervals() const {return __p_.intervals();} + _LIBCPP_INLINE_VISIBILITY + vector<result_type> densities() const {return __p_.densities();} + + _LIBCPP_INLINE_VISIBILITY + param_type param() const {return __p_;} + _LIBCPP_INLINE_VISIBILITY + void param(const param_type& __p) {__p_ = __p;} + + _LIBCPP_INLINE_VISIBILITY + result_type min() const {return __p_.__b_.front();} + _LIBCPP_INLINE_VISIBILITY + result_type max() const {return __p_.__b_.back();} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const piecewise_linear_distribution& __x, + const piecewise_linear_distribution& __y) + {return __x.__p_ == __y.__p_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const piecewise_linear_distribution& __x, + const piecewise_linear_distribution& __y) + {return !(__x == __y);} + + template <class _CharT, class _Traits, class _RT> + friend + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_linear_distribution<_RT>& __x); + + template <class _CharT, class _Traits, class _RT> + friend + basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_linear_distribution<_RT>& __x); +}; + +template<class _RealType> +typename piecewise_linear_distribution<_RealType>::param_type & +piecewise_linear_distribution<_RealType>::param_type::operator= + (const param_type& __rhs) +{ +// These can throw + __b_.reserve (__rhs.__b_.size ()); + __densities_.reserve(__rhs.__densities_.size()); + __areas_.reserve (__rhs.__areas_.size()); + +// These can not throw + __b_ = __rhs.__b_; + __densities_ = __rhs.__densities_; + __areas_ = __rhs.__areas_; + return *this; +} + + +template<class _RealType> +void +piecewise_linear_distribution<_RealType>::param_type::__init() +{ + __areas_.assign(__densities_.size() - 1, result_type()); + result_type _Sp = 0; + for (size_t __i = 0; __i < __areas_.size(); ++__i) + { + __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) * + (__b_[__i+1] - __b_[__i]) * .5; + _Sp += __areas_[__i]; + } + for (size_t __i = __areas_.size(); __i > 1;) + { + --__i; + __areas_[__i] = __areas_[__i-1] / _Sp; + } + __areas_[0] = 0; + for (size_t __i = 1; __i < __areas_.size(); ++__i) + __areas_[__i] += __areas_[__i-1]; + for (size_t __i = 0; __i < __densities_.size(); ++__i) + __densities_[__i] /= _Sp; +} + +template<class _RealType> +piecewise_linear_distribution<_RealType>::param_type::param_type() + : __b_(2), + __densities_(2, 1.0), + __areas_(1, 0.0) +{ + __b_[1] = 1; +} + +template<class _RealType> +template<class _InputIteratorB, class _InputIteratorW> +piecewise_linear_distribution<_RealType>::param_type::param_type( + _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) + : __b_(__fB, __lB) +{ + if (__b_.size() < 2) + { + __b_.resize(2); + __b_[0] = 0; + __b_[1] = 1; + __densities_.assign(2, 1.0); + __areas_.assign(1, 0.0); + } + else + { + __densities_.reserve(__b_.size()); + for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW) + __densities_.push_back(*__fW); + __init(); + } +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _RealType> +template<class _UnaryOperation> +piecewise_linear_distribution<_RealType>::param_type::param_type( + initializer_list<result_type> __bl, _UnaryOperation __fw) + : __b_(__bl.begin(), __bl.end()) +{ + if (__b_.size() < 2) + { + __b_.resize(2); + __b_[0] = 0; + __b_[1] = 1; + __densities_.assign(2, 1.0); + __areas_.assign(1, 0.0); + } + else + { + __densities_.reserve(__b_.size()); + for (size_t __i = 0; __i < __b_.size(); ++__i) + __densities_.push_back(__fw(__b_[__i])); + __init(); + } +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template<class _RealType> +template<class _UnaryOperation> +piecewise_linear_distribution<_RealType>::param_type::param_type( + size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) + : __b_(__nw == 0 ? 2 : __nw + 1) +{ + size_t __n = __b_.size() - 1; + result_type __d = (__xmax - __xmin) / __n; + __densities_.reserve(__b_.size()); + for (size_t __i = 0; __i < __n; ++__i) + { + __b_[__i] = __xmin + __i * __d; + __densities_.push_back(__fw(__b_[__i])); + } + __b_[__n] = __xmax; + __densities_.push_back(__fw(__b_[__n])); + __init(); +} + +template<class _RealType> +template<class _URNG> +_RealType +piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ + typedef uniform_real_distribution<result_type> _Gen; + result_type __u = _Gen()(__g); + ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), + __u) - __p.__areas_.begin() - 1; + __u -= __p.__areas_[__k]; + const result_type __dk = __p.__densities_[__k]; + const result_type __dk1 = __p.__densities_[__k+1]; + const result_type __deltad = __dk1 - __dk; + const result_type __bk = __p.__b_[__k]; + if (__deltad == 0) + return __u / __dk + __bk; + const result_type __bk1 = __p.__b_[__k+1]; + const result_type __deltab = __bk1 - __bk; + return (__bk * __dk1 - __bk1 * __dk + + _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) / + __deltad; +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const piecewise_linear_distribution<_RT>& __x) +{ + __save_flags<_CharT, _Traits> _(__os); + __os.flags(ios_base::dec | ios_base::left | ios_base::fixed | + ios_base::scientific); + _CharT __sp = __os.widen(' '); + __os.fill(__sp); + size_t __n = __x.__p_.__b_.size(); + __os << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__b_[__i]; + __n = __x.__p_.__densities_.size(); + __os << __sp << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__densities_[__i]; + __n = __x.__p_.__areas_.size(); + __os << __sp << __n; + for (size_t __i = 0; __i < __n; ++__i) + __os << __sp << __x.__p_.__areas_[__i]; + return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + piecewise_linear_distribution<_RT>& __x) +{ + typedef piecewise_linear_distribution<_RT> _Eng; + typedef typename _Eng::result_type result_type; + typedef typename _Eng::param_type param_type; + __save_flags<_CharT, _Traits> _(__is); + __is.flags(ios_base::dec | ios_base::skipws); + size_t __n; + __is >> __n; + vector<result_type> __b(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __b[__i]; + __is >> __n; + vector<result_type> __densities(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __densities[__i]; + __is >> __n; + vector<result_type> __areas(__n); + for (size_t __i = 0; __i < __n; ++__i) + __is >> __areas[__i]; + if (!__is.fail()) + { + swap(__x.__p_.__b_, __b); + swap(__x.__p_.__densities_, __densities); + swap(__x.__p_.__areas_, __areas); + } + return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_RANDOM diff --git a/contrib/libc++/include/ratio b/contrib/libc++/include/ratio new file mode 100644 index 0000000..23f2267 --- /dev/null +++ b/contrib/libc++/include/ratio @@ -0,0 +1,487 @@ +// -*- C++ -*- +//===---------------------------- ratio -----------------------------------===// +// +// 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_RATIO +#define _LIBCPP_RATIO + +/* + ratio synopsis + +namespace std +{ + +template <intmax_t N, intmax_t D = 1> +class ratio +{ +public: + static const intmax_t num; + static const intmax_t den; + typedef ratio<num, den> type; +}; + +// ratio arithmetic +template <class R1, class R2> using ratio_add = ...; +template <class R1, class R2> using ratio_subtract = ...; +template <class R1, class R2> using ratio_multiply = ...; +template <class R1, class R2> using ratio_divide = ...; + +// ratio comparison +template <class R1, class R2> struct ratio_equal; +template <class R1, class R2> struct ratio_not_equal; +template <class R1, class R2> struct ratio_less; +template <class R1, class R2> struct ratio_less_equal; +template <class R1, class R2> struct ratio_greater; +template <class R1, class R2> struct ratio_greater_equal; + +// convenience SI typedefs +typedef ratio<1, 1000000000000000000000000> yocto; // not supported +typedef ratio<1, 1000000000000000000000> zepto; // not supported +typedef ratio<1, 1000000000000000000> atto; +typedef ratio<1, 1000000000000000> femto; +typedef ratio<1, 1000000000000> pico; +typedef ratio<1, 1000000000> nano; +typedef ratio<1, 1000000> micro; +typedef ratio<1, 1000> milli; +typedef ratio<1, 100> centi; +typedef ratio<1, 10> deci; +typedef ratio< 10, 1> deca; +typedef ratio< 100, 1> hecto; +typedef ratio< 1000, 1> kilo; +typedef ratio< 1000000, 1> mega; +typedef ratio< 1000000000, 1> giga; +typedef ratio< 1000000000000, 1> tera; +typedef ratio< 1000000000000000, 1> peta; +typedef ratio< 1000000000000000000, 1> exa; +typedef ratio< 1000000000000000000000, 1> zetta; // not supported +typedef ratio<1000000000000000000000000, 1> yotta; // not supported + +} +*/ + +#include <__config> +#include <cstdint> +#include <climits> +#include <type_traits> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// __static_gcd + +template <intmax_t _Xp, intmax_t _Yp> +struct __static_gcd +{ + static const intmax_t value = __static_gcd<_Yp, _Xp % _Yp>::value; +}; + +template <intmax_t _Xp> +struct __static_gcd<_Xp, 0> +{ + static const intmax_t value = _Xp; +}; + +template <> +struct __static_gcd<0, 0> +{ + static const intmax_t value = 1; +}; + +// __static_lcm + +template <intmax_t _Xp, intmax_t _Yp> +struct __static_lcm +{ + static const intmax_t value = _Xp / __static_gcd<_Xp, _Yp>::value * _Yp; +}; + +template <intmax_t _Xp> +struct __static_abs +{ + static const intmax_t value = _Xp < 0 ? -_Xp : _Xp; +}; + +template <intmax_t _Xp> +struct __static_sign +{ + static const intmax_t value = _Xp == 0 ? 0 : (_Xp < 0 ? -1 : 1); +}; + +template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value> +class __ll_add; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_add<_Xp, _Yp, 1> +{ + static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1; + static const intmax_t max = -min; + + static_assert(_Xp <= max - _Yp, "overflow in __ll_add"); +public: + static const intmax_t value = _Xp + _Yp; +}; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_add<_Xp, _Yp, 0> +{ +public: + static const intmax_t value = _Xp; +}; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_add<_Xp, _Yp, -1> +{ + static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1; + static const intmax_t max = -min; + + static_assert(min - _Yp <= _Xp, "overflow in __ll_add"); +public: + static const intmax_t value = _Xp + _Yp; +}; + +template <intmax_t _Xp, intmax_t _Yp, intmax_t = __static_sign<_Yp>::value> +class __ll_sub; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_sub<_Xp, _Yp, 1> +{ + static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1; + static const intmax_t max = -min; + + static_assert(min + _Yp <= _Xp, "overflow in __ll_sub"); +public: + static const intmax_t value = _Xp - _Yp; +}; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_sub<_Xp, _Yp, 0> +{ +public: + static const intmax_t value = _Xp; +}; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_sub<_Xp, _Yp, -1> +{ + static const intmax_t min = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1; + static const intmax_t max = -min; + + static_assert(_Xp <= max + _Yp, "overflow in __ll_sub"); +public: + static const intmax_t value = _Xp - _Yp; +}; + +template <intmax_t _Xp, intmax_t _Yp> +class __ll_mul +{ + static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)); + static const intmax_t min = nan + 1; + static const intmax_t max = -min; + static const intmax_t __a_x = __static_abs<_Xp>::value; + static const intmax_t __a_y = __static_abs<_Yp>::value; + + static_assert(_Xp != nan && _Yp != nan && __a_x <= max / __a_y, "overflow in __ll_mul"); +public: + static const intmax_t value = _Xp * _Yp; +}; + +template <intmax_t _Yp> +class __ll_mul<0, _Yp> +{ +public: + static const intmax_t value = 0; +}; + +template <intmax_t _Xp> +class __ll_mul<_Xp, 0> +{ +public: + static const intmax_t value = 0; +}; + +template <> +class __ll_mul<0, 0> +{ +public: + static const intmax_t value = 0; +}; + +// Not actually used but left here in case needed in future maintenance +template <intmax_t _Xp, intmax_t _Yp> +class __ll_div +{ + static const intmax_t nan = (1LL << (sizeof(intmax_t) * CHAR_BIT - 1)); + static const intmax_t min = nan + 1; + static const intmax_t max = -min; + + static_assert(_Xp != nan && _Yp != nan && _Yp != 0, "overflow in __ll_div"); +public: + static const intmax_t value = _Xp / _Yp; +}; + +template <intmax_t _Num, intmax_t _Den = 1> +class _LIBCPP_VISIBLE ratio +{ + static_assert(__static_abs<_Num>::value >= 0, "ratio numerator is out of range"); + static_assert(_Den != 0, "ratio divide by 0"); + static_assert(__static_abs<_Den>::value > 0, "ratio denominator is out of range"); + static const intmax_t __na = __static_abs<_Num>::value; + static const intmax_t __da = __static_abs<_Den>::value; + static const intmax_t __s = __static_sign<_Num>::value * __static_sign<_Den>::value; + static const intmax_t __gcd = __static_gcd<__na, __da>::value; +public: + static const intmax_t num = __s * __na / __gcd; + static const intmax_t den = __da / __gcd; + + typedef ratio<num, den> type; +}; + +template <intmax_t _Num, intmax_t _Den> const intmax_t ratio<_Num, _Den>::num; +template <intmax_t _Num, intmax_t _Den> const intmax_t ratio<_Num, _Den>::den; + +template <class _Tp> struct __is_ratio : false_type {}; +template <intmax_t _Num, intmax_t _Den> struct __is_ratio<ratio<_Num, _Den> > : true_type {}; + +typedef ratio<1LL, 1000000000000000000LL> atto; +typedef ratio<1LL, 1000000000000000LL> femto; +typedef ratio<1LL, 1000000000000LL> pico; +typedef ratio<1LL, 1000000000LL> nano; +typedef ratio<1LL, 1000000LL> micro; +typedef ratio<1LL, 1000LL> milli; +typedef ratio<1LL, 100LL> centi; +typedef ratio<1LL, 10LL> deci; +typedef ratio< 10LL, 1LL> deca; +typedef ratio< 100LL, 1LL> hecto; +typedef ratio< 1000LL, 1LL> kilo; +typedef ratio< 1000000LL, 1LL> mega; +typedef ratio< 1000000000LL, 1LL> giga; +typedef ratio< 1000000000000LL, 1LL> tera; +typedef ratio< 1000000000000000LL, 1LL> peta; +typedef ratio<1000000000000000000LL, 1LL> exa; + +template <class _R1, class _R2> +struct __ratio_multiply +{ +private: + static const intmax_t __gcd_n1_d2 = __static_gcd<_R1::num, _R2::den>::value; + static const intmax_t __gcd_d1_n2 = __static_gcd<_R1::den, _R2::num>::value; +public: + typedef typename ratio + < + __ll_mul<_R1::num / __gcd_n1_d2, _R2::num / __gcd_d1_n2>::value, + __ll_mul<_R2::den / __gcd_n1_d2, _R1::den / __gcd_d1_n2>::value + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> using ratio_multiply + = typename __ratio_multiply<_R1, _R2>::type; + +#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_multiply + : public __ratio_multiply<_R1, _R2>::type {}; + +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct __ratio_divide +{ +private: + static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; + static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; +public: + typedef typename ratio + < + __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value, + __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> using ratio_divide + = typename __ratio_divide<_R1, _R2>::type; + +#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_divide + : public __ratio_divide<_R1, _R2>::type {}; + +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct __ratio_add +{ +private: + static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; + static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; +public: + typedef typename ratio_multiply + < + ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>, + ratio + < + __ll_add + < + __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value, + __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value + >::value, + _R2::den + > + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> using ratio_add + = typename __ratio_add<_R1, _R2>::type; + +#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_add + : public __ratio_add<_R1, _R2>::type {}; + +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct __ratio_subtract +{ +private: + static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; + static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; +public: + typedef typename ratio_multiply + < + ratio<__gcd_n1_n2, _R1::den / __gcd_d1_d2>, + ratio + < + __ll_sub + < + __ll_mul<_R1::num / __gcd_n1_n2, _R2::den / __gcd_d1_d2>::value, + __ll_mul<_R2::num / __gcd_n1_n2, _R1::den / __gcd_d1_d2>::value + >::value, + _R2::den + > + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> using ratio_subtract + = typename __ratio_subtract<_R1, _R2>::type; + +#else // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_subtract + : public __ratio_subtract<_R1, _R2>::type {}; + +#endif // _LIBCPP_HAS_NO_TEMPLATE_ALIASES + +// ratio_equal + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_equal + : public integral_constant<bool, _R1::num == _R2::num && _R1::den == _R2::den> {}; + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_not_equal + : public integral_constant<bool, !ratio_equal<_R1, _R2>::value> {}; + +// ratio_less + +template <class _R1, class _R2, bool _Odd = false, + intmax_t _Q1 = _R1::num / _R1::den, intmax_t _M1 = _R1::num % _R1::den, + intmax_t _Q2 = _R2::num / _R2::den, intmax_t _M2 = _R2::num % _R2::den> +struct __ratio_less1 +{ + static const bool value = _Odd ? _Q2 < _Q1 : _Q1 < _Q2; +}; + +template <class _R1, class _R2, bool _Odd, intmax_t _Qp> +struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, 0> +{ + static const bool value = false; +}; + +template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M2> +struct __ratio_less1<_R1, _R2, _Odd, _Qp, 0, _Qp, _M2> +{ + static const bool value = !_Odd; +}; + +template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1> +struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, 0> +{ + static const bool value = _Odd; +}; + +template <class _R1, class _R2, bool _Odd, intmax_t _Qp, intmax_t _M1, + intmax_t _M2> +struct __ratio_less1<_R1, _R2, _Odd, _Qp, _M1, _Qp, _M2> +{ + static const bool value = __ratio_less1<ratio<_R1::den, _M1>, + ratio<_R2::den, _M2>, !_Odd>::value; +}; + +template <class _R1, class _R2, intmax_t _S1 = __static_sign<_R1::num>::value, + intmax_t _S2 = __static_sign<_R2::num>::value> +struct __ratio_less +{ + static const bool value = _S1 < _S2; +}; + +template <class _R1, class _R2> +struct __ratio_less<_R1, _R2, 1LL, 1LL> +{ + static const bool value = __ratio_less1<_R1, _R2>::value; +}; + +template <class _R1, class _R2> +struct __ratio_less<_R1, _R2, -1LL, -1LL> +{ + static const bool value = __ratio_less1<ratio<-_R2::num, _R2::den>, ratio<-_R1::num, _R1::den> >::value; +}; + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_less + : public integral_constant<bool, __ratio_less<_R1, _R2>::value> {}; + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_less_equal + : public integral_constant<bool, !ratio_less<_R2, _R1>::value> {}; + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_greater + : public integral_constant<bool, ratio_less<_R2, _R1>::value> {}; + +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_greater_equal + : public integral_constant<bool, !ratio_less<_R1, _R2>::value> {}; + +template <class _R1, class _R2> +struct __ratio_gcd +{ + typedef ratio<__static_gcd<_R1::num, _R2::num>::value, + __static_lcm<_R1::den, _R2::den>::value> type; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_RATIO diff --git a/contrib/libc++/include/regex b/contrib/libc++/include/regex new file mode 100644 index 0000000..2ebb0f1 --- /dev/null +++ b/contrib/libc++/include/regex @@ -0,0 +1,6414 @@ +// -*- C++ -*- +//===--------------------------- regex ------------------------------------===// +// +// 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_REGEX +#define _LIBCPP_REGEX + +/* + regex synopsis + +#include <initializer_list> + +namespace std +{ + +namespace regex_constants +{ + +emum syntax_option_type +{ + icase = unspecified, + nosubs = unspecified, + optimize = unspecified, + collate = unspecified, + ECMAScript = unspecified, + basic = unspecified, + extended = unspecified, + awk = unspecified, + grep = unspecified, + egrep = unspecified +}; + +constexpr syntax_option_type operator~(syntax_option_type f); +constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs); +constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs); + +enum match_flag_type +{ + match_default = 0, + match_not_bol = unspecified, + match_not_eol = unspecified, + match_not_bow = unspecified, + match_not_eow = unspecified, + match_any = unspecified, + match_not_null = unspecified, + match_continuous = unspecified, + match_prev_avail = unspecified, + format_default = 0, + format_sed = unspecified, + format_no_copy = unspecified, + format_first_only = unspecified +}; + +constexpr match_flag_type operator~(match_flag_type f); +constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs); +constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs); + +enum error_type +{ + error_collate = unspecified, + error_ctype = unspecified, + error_escape = unspecified, + error_backref = unspecified, + error_brack = unspecified, + error_paren = unspecified, + error_brace = unspecified, + error_badbrace = unspecified, + error_range = unspecified, + error_space = unspecified, + error_badrepeat = unspecified, + error_complexity = unspecified, + error_stack = unspecified +}; + +} // regex_constants + +class regex_error + : public runtime_error +{ +public: + explicit regex_error(regex_constants::error_type ecode); + regex_constants::error_type code() const; +}; + +template <class charT> +struct regex_traits +{ +public: + typedef charT char_type; + typedef basic_string<char_type> string_type; + typedef locale locale_type; + typedef /bitmask_type/ char_class_type; + + regex_traits(); + + static size_t length(const char_type* p); + charT translate(charT c) const; + charT translate_nocase(charT c) const; + template <class ForwardIterator> + string_type + transform(ForwardIterator first, ForwardIterator last) const; + template <class ForwardIterator> + string_type + transform_primary( ForwardIterator first, ForwardIterator last) const; + template <class ForwardIterator> + string_type + lookup_collatename(ForwardIterator first, ForwardIterator last) const; + template <class ForwardIterator> + char_class_type + lookup_classname(ForwardIterator first, ForwardIterator last, + bool icase = false) const; + bool isctype(charT c, char_class_type f) const; + int value(charT ch, int radix) const; + locale_type imbue(locale_type l); + locale_type getloc()const; +}; + +template <class charT, class traits = regex_traits<charT>> +class basic_regex +{ +public: + // types: + typedef charT value_type; + typedef regex_constants::syntax_option_type flag_type; + typedef typename traits::locale_type locale_type; + + // constants: + static constexpr regex_constants::syntax_option_type icase = regex_constants::icase; + static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs; + static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize; + static constexpr regex_constants::syntax_option_type collate = regex_constants::collate; + static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; + static constexpr regex_constants::syntax_option_type basic = regex_constants::basic; + static constexpr regex_constants::syntax_option_type extended = regex_constants::extended; + static constexpr regex_constants::syntax_option_type awk = regex_constants::awk; + static constexpr regex_constants::syntax_option_type grep = regex_constants::grep; + static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep; + + // construct/copy/destroy: + basic_regex(); + explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript); + basic_regex(const charT* p, size_t len, flag_type f); + basic_regex(const basic_regex&); + basic_regex(basic_regex&&); + template <class ST, class SA> + explicit basic_regex(const basic_string<charT, ST, SA>& p, + flag_type f = regex_constants::ECMAScript); + template <class ForwardIterator> + basic_regex(ForwardIterator first, ForwardIterator last, + flag_type f = regex_constants::ECMAScript); + basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript); + + ~basic_regex(); + + basic_regex& operator=(const basic_regex&); + basic_regex& operator=(basic_regex&&); + basic_regex& operator=(const charT* ptr); + basic_regex& operator=(initializer_list<charT> il); + template <class ST, class SA> + basic_regex& operator=(const basic_string<charT, ST, SA>& p); + + // assign: + basic_regex& assign(const basic_regex& that); + basic_regex& assign(basic_regex&& that); + basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript); + basic_regex& assign(const charT* p, size_t len, flag_type f); + template <class string_traits, class A> + basic_regex& assign(const basic_string<charT, string_traits, A>& s, + flag_type f = regex_constants::ECMAScript); + template <class InputIterator> + basic_regex& assign(InputIterator first, InputIterator last, + flag_type f = regex_constants::ECMAScript); + basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript); + + // const operations: + unsigned mark_count() const; + flag_type flags() const; + + // locale: + locale_type imbue(locale_type loc); + locale_type getloc() const; + + // swap: + void swap(basic_regex&); +}; + +typedef basic_regex<char> regex; +typedef basic_regex<wchar_t> wregex; + +template <class charT, class traits> + void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2); + +template <class BidirectionalIterator> +class sub_match + : public pair<BidirectionalIterator, BidirectionalIterator> +{ +public: + typedef typename iterator_traits<BidirectionalIterator>::value_type value_type; + typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; + typedef BidirectionalIterator iterator; + typedef basic_string<value_type> string_type; + + bool matched; + + constexpr sub_match(); + + difference_type length() const; + operator string_type() const; + string_type str() const; + + int compare(const sub_match& s) const; + int compare(const string_type& s) const; + int compare(const value_type* s) const; +}; + +typedef sub_match<const char*> csub_match; +typedef sub_match<const wchar_t*> wcsub_match; +typedef sub_match<string::const_iterator> ssub_match; +typedef sub_match<wstring::const_iterator> wssub_match; + +template <class BiIter> + bool + operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator==(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator!=(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator<(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter, class ST, class SA> + bool operator>(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator>=(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter, class ST, class SA> + bool + operator<=(const sub_match<BiIter>& lhs, + const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs); + +template <class BiIter> + bool + operator==(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator!=(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>=(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<=(typename iterator_traits<BiIter>::value_type const* lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator==(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator!=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator<(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator>(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator>=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator<=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const* rhs); + +template <class BiIter> + bool + operator==(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator!=(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator>=(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator<=(typename iterator_traits<BiIter>::value_type const& lhs, + const sub_match<BiIter>& rhs); + +template <class BiIter> + bool + operator==(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class BiIter> + bool + operator!=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class BiIter> + bool + operator<(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class BiIter> + bool + operator>(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class BiIter> + bool + operator>=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class BiIter> + bool + operator<=(const sub_match<BiIter>& lhs, + typename iterator_traits<BiIter>::value_type const& rhs); + +template <class charT, class ST, class BiIter> + basic_ostream<charT, ST>& + operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m); + +template <class BidirectionalIterator, + class Allocator = allocator<sub_match<BidirectionalIterator>>> +class match_results +{ +public: + typedef sub_match<BidirectionalIterator> value_type; + typedef const value_type& const_reference; + typedef const_reference reference; + typedef /implementation-defined/ const_iterator; + typedef const_iterator iterator; + typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type; + typedef typename allocator_traits<Allocator>::size_type size_type; + typedef Allocator allocator_type; + typedef typename iterator_traits<BidirectionalIterator>::value_type char_type; + typedef basic_string<char_type> string_type; + + // construct/copy/destroy: + explicit match_results(const Allocator& a = Allocator()); + match_results(const match_results& m); + match_results(match_results&& m); + match_results& operator=(const match_results& m); + match_results& operator=(match_results&& m); + ~match_results(); + + bool ready() const; + + // size: + size_type size() const; + size_type max_size() const; + bool empty() const; + + // element access: + difference_type length(size_type sub = 0) const; + difference_type position(size_type sub = 0) const; + string_type str(size_type sub = 0) const; + const_reference operator[](size_type n) const; + + const_reference prefix() const; + const_reference suffix() const; + + const_iterator begin() const; + const_iterator end() const; + const_iterator cbegin() const; + const_iterator cend() const; + + // format: + template <class OutputIter> + OutputIter + format(OutputIter out, const char_type* fmt_first, + const char_type* fmt_last, + regex_constants::match_flag_type flags = regex_constants::format_default) const; + template <class OutputIter, class ST, class SA> + OutputIter + format(OutputIter out, const basic_string<char_type, ST, SA>& fmt, + regex_constants::match_flag_type flags = regex_constants::format_default) const; + template <class ST, class SA> + basic_string<char_type, ST, SA> + format(const basic_string<char_type, ST, SA>& fmt, + regex_constants::match_flag_type flags = regex_constants::format_default) const; + string_type + format(const char_type* fmt, + regex_constants::match_flag_type flags = regex_constants::format_default) const; + + // allocator: + allocator_type get_allocator() const; + + // swap: + void swap(match_results& that); +}; + +typedef match_results<const char*> cmatch; +typedef match_results<const wchar_t*> wcmatch; +typedef match_results<string::const_iterator> smatch; +typedef match_results<wstring::const_iterator> wsmatch; + +template <class BidirectionalIterator, class Allocator> + bool + operator==(const match_results<BidirectionalIterator, Allocator>& m1, + const match_results<BidirectionalIterator, Allocator>& m2); + +template <class BidirectionalIterator, class Allocator> + bool + operator!=(const match_results<BidirectionalIterator, Allocator>& m1, + const match_results<BidirectionalIterator, Allocator>& m2); + +template <class BidirectionalIterator, class Allocator> + void + swap(match_results<BidirectionalIterator, Allocator>& m1, + match_results<BidirectionalIterator, Allocator>& m2); + +template <class BidirectionalIterator, class Allocator, class charT, class traits> + bool + regex_match(BidirectionalIterator first, BidirectionalIterator last, + match_results<BidirectionalIterator, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class BidirectionalIterator, class charT, class traits> + bool + regex_match(BidirectionalIterator first, BidirectionalIterator last, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class charT, class Allocator, class traits> + bool + regex_match(const charT* str, match_results<const charT*, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class ST, class SA, class Allocator, class charT, class traits> + bool + regex_match(const basic_string<charT, ST, SA>& s, + match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class charT, class traits> + bool + regex_match(const charT* str, const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class ST, class SA, class charT, class traits> + bool + regex_match(const basic_string<charT, ST, SA>& s, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class BidirectionalIterator, class Allocator, class charT, class traits> + bool + regex_search(BidirectionalIterator first, BidirectionalIterator last, + match_results<BidirectionalIterator, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class BidirectionalIterator, class charT, class traits> + bool + regex_search(BidirectionalIterator first, BidirectionalIterator last, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class charT, class Allocator, class traits> + bool + regex_search(const charT* str, match_results<const charT*, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class charT, class traits> + bool + regex_search(const charT* str, const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class ST, class SA, class charT, class traits> + bool + regex_search(const basic_string<charT, ST, SA>& s, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class ST, class SA, class Allocator, class charT, class traits> + bool + regex_search(const basic_string<charT, ST, SA>& s, + match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m, + const basic_regex<charT, traits>& e, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class OutputIterator, class BidirectionalIterator, + class traits, class charT, class ST, class SA> + OutputIterator + regex_replace(OutputIterator out, + BidirectionalIterator first, BidirectionalIterator last, + const basic_regex<charT, traits>& e, + const basic_string<charT, ST, SA>& fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class OutputIterator, class BidirectionalIterator, + class traits, class charT> + OutputIterator + regex_replace(OutputIterator out, + BidirectionalIterator first, BidirectionalIterator last, + const basic_regex<charT, traits>& e, const charT* fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class traits, class charT, class ST, class SA, class FST, class FSA>> + basic_string<charT, ST, SA> + regex_replace(const basic_string<charT, ST, SA>& s, + const basic_regex<charT, traits>& e, + const basic_string<charT, FST, FSA>& fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class traits, class charT, class ST, class SA> + basic_string<charT, ST, SA> + regex_replace(const basic_string<charT, ST, SA>& s, + const basic_regex<charT, traits>& e, const charT* fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class traits, class charT, class ST, class SA> + basic_string<charT> + regex_replace(const charT* s, + const basic_regex<charT, traits>& e, + const basic_string<charT, ST, SA>& fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class traits, class charT> + basic_string<charT> + regex_replace(const charT* s, + const basic_regex<charT, traits>& e, + const charT* fmt, + regex_constants::match_flag_type flags = regex_constants::match_default); + +template <class BidirectionalIterator, + class charT = typename iterator_traits< BidirectionalIterator>::value_type, + class traits = regex_traits<charT>> +class regex_iterator +{ +public: + typedef basic_regex<charT, traits> regex_type; + typedef match_results<BidirectionalIterator> value_type; + typedef ptrdiff_t difference_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef forward_iterator_tag iterator_category; + + regex_iterator(); + regex_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, + regex_constants::match_flag_type m = regex_constants::match_default); + regex_iterator(const regex_iterator&); + regex_iterator& operator=(const regex_iterator&); + + bool operator==(const regex_iterator&) const; + bool operator!=(const regex_iterator&) const; + + const value_type& operator*() const; + const value_type* operator->() const; + + regex_iterator& operator++(); + regex_iterator operator++(int); +}; + +typedef regex_iterator<const char*> cregex_iterator; +typedef regex_iterator<const wchar_t*> wcregex_iterator; +typedef regex_iterator<string::const_iterator> sregex_iterator; +typedef regex_iterator<wstring::const_iterator> wsregex_iterator; + +template <class BidirectionalIterator, + class charT = typename iterator_traits< BidirectionalIterator>::value_type, + class traits = regex_traits<charT>> +class regex_token_iterator +{ +public: + typedef basic_regex<charT, traits> regex_type; + typedef sub_match<BidirectionalIterator> value_type; + typedef ptrdiff_t difference_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef forward_iterator_tag iterator_category; + + regex_token_iterator(); + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, int submatch = 0, + regex_constants::match_flag_type m = regex_constants::match_default); + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, const vector<int>& submatches, + regex_constants::match_flag_type m = regex_constants::match_default); + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, initializer_list<int> submatches, + regex_constants::match_flag_type m = regex_constants::match_default); + template <size_t N> + regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, + const regex_type& re, const int (&submatches)[N], + regex_constants::match_flag_type m = regex_constants::match_default); + regex_token_iterator(const regex_token_iterator&); + regex_token_iterator& operator=(const regex_token_iterator&); + + bool operator==(const regex_token_iterator&) const; + bool operator!=(const regex_token_iterator&) const; + + const value_type& operator*() const; + const value_type* operator->() const; + + regex_token_iterator& operator++(); + regex_token_iterator operator++(int); +}; + +typedef regex_token_iterator<const char*> cregex_token_iterator; +typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; +typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; +typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; + +} // std +*/ + +#include <__config> +#include <stdexcept> +#include <__locale> +#include <initializer_list> +#include <utility> +#include <iterator> +#include <string> +#include <memory> +#include <vector> +#include <deque> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace regex_constants +{ + +// syntax_option_type + +enum syntax_option_type +{ + icase = 1 << 0, + nosubs = 1 << 1, + optimize = 1 << 2, + collate = 1 << 3, + ECMAScript = 0, + basic = 1 << 4, + extended = 1 << 5, + awk = 1 << 6, + grep = 1 << 7, + egrep = 1 << 8 +}; + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type +operator~(syntax_option_type __x) +{ + return syntax_option_type(~int(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type +operator&(syntax_option_type __x, syntax_option_type __y) +{ + return syntax_option_type(int(__x) & int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type +operator|(syntax_option_type __x, syntax_option_type __y) +{ + return syntax_option_type(int(__x) | int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type +operator^(syntax_option_type __x, syntax_option_type __y) +{ + return syntax_option_type(int(__x) ^ int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type& +operator&=(syntax_option_type& __x, syntax_option_type __y) +{ + __x = __x & __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type& +operator|=(syntax_option_type& __x, syntax_option_type __y) +{ + __x = __x | __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +syntax_option_type& +operator^=(syntax_option_type& __x, syntax_option_type __y) +{ + __x = __x ^ __y; + return __x; +} + +// match_flag_type + +enum match_flag_type +{ + match_default = 0, + match_not_bol = 1 << 0, + match_not_eol = 1 << 1, + match_not_bow = 1 << 2, + match_not_eow = 1 << 3, + match_any = 1 << 4, + match_not_null = 1 << 5, + match_continuous = 1 << 6, + match_prev_avail = 1 << 7, + format_default = 0, + format_sed = 1 << 8, + format_no_copy = 1 << 9, + format_first_only = 1 << 10, + __no_update_pos = 1 << 11 +}; + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type +operator~(match_flag_type __x) +{ + return match_flag_type(~int(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type +operator&(match_flag_type __x, match_flag_type __y) +{ + return match_flag_type(int(__x) & int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type +operator|(match_flag_type __x, match_flag_type __y) +{ + return match_flag_type(int(__x) | int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type +operator^(match_flag_type __x, match_flag_type __y) +{ + return match_flag_type(int(__x) ^ int(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type& +operator&=(match_flag_type& __x, match_flag_type __y) +{ + __x = __x & __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type& +operator|=(match_flag_type& __x, match_flag_type __y) +{ + __x = __x | __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY +/*constexpr*/ +match_flag_type& +operator^=(match_flag_type& __x, match_flag_type __y) +{ + __x = __x ^ __y; + return __x; +} + +enum error_type +{ + error_collate = 1, + error_ctype, + error_escape, + error_backref, + error_brack, + error_paren, + error_brace, + error_badbrace, + error_range, + error_space, + error_badrepeat, + error_complexity, + error_stack, + __re_err_grammar, + __re_err_empty, + __re_err_unknown +}; + +} // regex_constants + +class _LIBCPP_EXCEPTION_ABI regex_error + : public runtime_error +{ + regex_constants::error_type __code_; +public: + explicit regex_error(regex_constants::error_type __ecode); + virtual ~regex_error() throw(); + _LIBCPP_INLINE_VISIBILITY + regex_constants::error_type code() const {return __code_;} +}; + +template <class _CharT> +struct _LIBCPP_VISIBLE regex_traits +{ +public: + typedef _CharT char_type; + typedef basic_string<char_type> string_type; + typedef locale locale_type; + typedef ctype_base::mask char_class_type; + + static const char_class_type __regex_word = 0x80; +private: + locale __loc_; + const ctype<char_type>* __ct_; + const collate<char_type>* __col_; + +public: + regex_traits(); + + _LIBCPP_INLINE_VISIBILITY + static size_t length(const char_type* __p) + {return char_traits<char_type>::length(__p);} + _LIBCPP_INLINE_VISIBILITY + char_type translate(char_type __c) const {return __c;} + char_type translate_nocase(char_type __c) const; + template <class _ForwardIterator> + string_type + transform(_ForwardIterator __f, _ForwardIterator __l) const; + template <class _ForwardIterator> + _LIBCPP_INLINE_VISIBILITY + string_type + transform_primary( _ForwardIterator __f, _ForwardIterator __l) const + {return __transform_primary(__f, __l, char_type());} + template <class _ForwardIterator> + _LIBCPP_INLINE_VISIBILITY + string_type + lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const + {return __lookup_collatename(__f, __l, char_type());} + template <class _ForwardIterator> + _LIBCPP_INLINE_VISIBILITY + char_class_type + lookup_classname(_ForwardIterator __f, _ForwardIterator __l, + bool __icase = false) const + {return __lookup_classname(__f, __l, __icase, char_type());} + bool isctype(char_type __c, char_class_type __m) const; + _LIBCPP_INLINE_VISIBILITY + int value(char_type __ch, int __radix) const + {return __value(__ch, __radix);} + locale_type imbue(locale_type __l); + _LIBCPP_INLINE_VISIBILITY + locale_type getloc()const {return __loc_;} + +private: + void __init(); + + template <class _ForwardIterator> + string_type + __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const; + template <class _ForwardIterator> + string_type + __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; + + template <class _ForwardIterator> + string_type + __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const; + template <class _ForwardIterator> + string_type + __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const; + + template <class _ForwardIterator> + char_class_type + __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, + bool __icase, char) const; + template <class _ForwardIterator> + char_class_type + __lookup_classname(_ForwardIterator __f, _ForwardIterator __l, + bool __icase, wchar_t) const; + + static int __value(unsigned char __ch, int __radix); + _LIBCPP_INLINE_VISIBILITY + int __value(char __ch, int __radix) const + {return __value(static_cast<unsigned char>(__ch), __radix);} + int __value(wchar_t __ch, int __radix) const; +}; + +template <class _CharT> +regex_traits<_CharT>::regex_traits() +{ + __init(); +} + +template <class _CharT> +typename regex_traits<_CharT>::char_type +regex_traits<_CharT>::translate_nocase(char_type __c) const +{ + return __ct_->tolower(__c); +} + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::string_type +regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const +{ + string_type __s(__f, __l); + return __col_->transform(__s.data(), __s.data() + __s.size()); +} + +template <class _CharT> +void +regex_traits<_CharT>::__init() +{ + __ct_ = &use_facet<ctype<char_type> >(__loc_); + __col_ = &use_facet<collate<char_type> >(__loc_); +} + +template <class _CharT> +typename regex_traits<_CharT>::locale_type +regex_traits<_CharT>::imbue(locale_type __l) +{ + locale __r = __loc_; + __loc_ = __l; + __init(); + return __r; +} + +// transform_primary is very FreeBSD-specific + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::string_type +regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, + _ForwardIterator __l, char) const +{ + const string_type __s(__f, __l); + string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); + switch (__d.size()) + { + case 1: + break; + case 12: + __d[11] = __d[3]; + break; + default: + __d.clear(); + break; + } + return __d; +} + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::string_type +regex_traits<_CharT>::__transform_primary(_ForwardIterator __f, + _ForwardIterator __l, wchar_t) const +{ + const string_type __s(__f, __l); + string_type __d = __col_->transform(__s.data(), __s.data() + __s.size()); + switch (__d.size()) + { + case 1: + break; + case 3: + __d[2] = __d[0]; + break; + default: + __d.clear(); + break; + } + return __d; +} + +// lookup_collatename is very FreeBSD-specific + +string __get_collation_name(const char* __s); + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::string_type +regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, + _ForwardIterator __l, char) const +{ + string_type __s(__f, __l); + string_type __r; + if (!__s.empty()) + { + __r = __get_collation_name(__s.c_str()); + if (__r.empty() && __s.size() <= 2) + { + __r = __col_->transform(__s.data(), __s.data() + __s.size()); + if (__r.size() == 1 || __r.size() == 12) + __r = __s; + else + __r.clear(); + } + } + return __r; +} + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::string_type +regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f, + _ForwardIterator __l, wchar_t) const +{ + string_type __s(__f, __l); + string __n; + __n.reserve(__s.size()); + for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); + __i != __e; ++__i) + { + if (static_cast<unsigned>(*__i) >= 127) + return string_type(); + __n.push_back(char(*__i)); + } + string_type __r; + if (!__s.empty()) + { + __n = __get_collation_name(__n.c_str()); + if (!__n.empty()) + __r.assign(__n.begin(), __n.end()); + else if (__s.size() <= 2) + { + __r = __col_->transform(__s.data(), __s.data() + __s.size()); + if (__r.size() == 1 || __r.size() == 3) + __r = __s; + else + __r.clear(); + } + } + return __r; +} + +// lookup_classname + +ctype_base::mask __get_classname(const char* __s, bool __icase); + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::char_class_type +regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, + _ForwardIterator __l, + bool __icase, char) const +{ + string_type __s(__f, __l); + __ct_->tolower(&__s[0], &__s[0] + __s.size()); + return __get_classname(__s.c_str(), __icase); +} + +template <class _CharT> +template <class _ForwardIterator> +typename regex_traits<_CharT>::char_class_type +regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f, + _ForwardIterator __l, + bool __icase, wchar_t) const +{ + string_type __s(__f, __l); + __ct_->tolower(&__s[0], &__s[0] + __s.size()); + string __n; + __n.reserve(__s.size()); + for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end(); + __i != __e; ++__i) + { + if (static_cast<unsigned>(*__i) >= 127) + return char_class_type(); + __n.push_back(char(*__i)); + } + return __get_classname(__n.c_str(), __icase); +} + +template <class _CharT> +bool +regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const +{ + if (__ct_->is(__m, __c)) + return true; + return (__c == '_' && (__m & __regex_word)); +} + +template <class _CharT> +int +regex_traits<_CharT>::__value(unsigned char __ch, int __radix) +{ + if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7' + return __ch - '0'; + if (__radix != 8) + { + if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9' + return __ch - '0'; + if (__radix == 16) + { + __ch |= 0x20; // tolower + if ('a' <= __ch && __ch <= 'f') + return __ch - ('a' - 10); + } + } + return -1; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +int +regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const +{ + return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix); +} + +template <class _CharT> class __node; + +template <class _BidirectionalIterator> class sub_match; + +template <class _BidirectionalIterator, + class _Allocator = allocator<sub_match<_BidirectionalIterator> > > +class match_results; + +template <class _CharT> +struct __state +{ + enum + { + __end_state = -1000, + __consume_input, // -999 + __begin_marked_expr, // -998 + __end_marked_expr, // -997 + __pop_state, // -996 + __accept_and_consume, // -995 + __accept_but_not_consume, // -994 + __reject, // -993 + __split, + __repeat + }; + + int __do_; + const _CharT* __first_; + const _CharT* __current_; + const _CharT* __last_; + vector<sub_match<const _CharT*> > __sub_matches_; + vector<pair<size_t, const _CharT*> > __loop_data_; + const __node<_CharT>* __node_; + regex_constants::match_flag_type __flags_; + bool __at_first_; + + _LIBCPP_INLINE_VISIBILITY + __state() + : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr), + __node_(nullptr), __flags_() {} +}; + +// __node + +template <class _CharT> +class __node +{ + __node(const __node&); + __node& operator=(const __node&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __node() {} + _LIBCPP_INLINE_VISIBILITY + virtual ~__node() {} + + _LIBCPP_INLINE_VISIBILITY + virtual void __exec(__state&) const {}; + _LIBCPP_INLINE_VISIBILITY + virtual void __exec_split(bool, __state&) const {}; +}; + +// __end_state + +template <class _CharT> +class __end_state + : public __node<_CharT> +{ +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __end_state() {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__end_state<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__end_state; +} + +// __has_one_state + +template <class _CharT> +class __has_one_state + : public __node<_CharT> +{ + __node<_CharT>* __first_; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __has_one_state(__node<_CharT>* __s) + : __first_(__s) {} + + _LIBCPP_INLINE_VISIBILITY + __node<_CharT>* first() const {return __first_;} + _LIBCPP_INLINE_VISIBILITY + __node<_CharT>*& first() {return __first_;} +}; + +// __owns_one_state + +template <class _CharT> +class __owns_one_state + : public __has_one_state<_CharT> +{ + typedef __has_one_state<_CharT> base; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __owns_one_state(__node<_CharT>* __s) + : base(__s) {} + + virtual ~__owns_one_state(); +}; + +template <class _CharT> +__owns_one_state<_CharT>::~__owns_one_state() +{ + delete this->first(); +} + +// __empty_state + +template <class _CharT> +class __empty_state + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __empty_state(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__empty_state<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); +} + +// __empty_non_own_state + +template <class _CharT> +class __empty_non_own_state + : public __has_one_state<_CharT> +{ + typedef __has_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __empty_non_own_state(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__empty_non_own_state<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); +} + +// __repeat_one_loop + +template <class _CharT> +class __repeat_one_loop + : public __has_one_state<_CharT> +{ + typedef __has_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __repeat_one_loop(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__repeat_one_loop<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__repeat; + __s.__node_ = this->first(); +} + +// __owns_two_states + +template <class _CharT> +class __owns_two_states + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + base* __second_; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __owns_two_states(__node<_CharT>* __s1, base* __s2) + : base(__s1), __second_(__s2) {} + + virtual ~__owns_two_states(); + + _LIBCPP_INLINE_VISIBILITY + base* second() const {return __second_;} + _LIBCPP_INLINE_VISIBILITY + base*& second() {return __second_;} +}; + +template <class _CharT> +__owns_two_states<_CharT>::~__owns_two_states() +{ + delete __second_; +} + +// __loop + +template <class _CharT> +class __loop + : public __owns_two_states<_CharT> +{ + typedef __owns_two_states<_CharT> base; + + size_t __min_; + size_t __max_; + unsigned __loop_id_; + unsigned __mexp_begin_; + unsigned __mexp_end_; + bool __greedy_; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __loop(unsigned __loop_id, + __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2, + unsigned __mexp_begin, unsigned __mexp_end, + bool __greedy = true, + size_t __min = 0, + size_t __max = numeric_limits<size_t>::max()) + : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id), + __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end), + __greedy_(__greedy) {} + + virtual void __exec(__state& __s) const; + virtual void __exec_split(bool __second, __state& __s) const; + +private: + _LIBCPP_INLINE_VISIBILITY + void __init_repeat(__state& __s) const + { + __s.__loop_data_[__loop_id_].second = __s.__current_; + for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i) + { + __s.__sub_matches_[__i].first = __s.__last_; + __s.__sub_matches_[__i].second = __s.__last_; + __s.__sub_matches_[__i].matched = false; + } + } +}; + +template <class _CharT> +void +__loop<_CharT>::__exec(__state& __s) const +{ + if (__s.__do_ == __state::__repeat) + { + bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_; + bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_; + if (__do_repeat && __do_alt && + __s.__loop_data_[__loop_id_].second == __s.__current_) + __do_repeat = false; + if (__do_repeat && __do_alt) + __s.__do_ = __state::__split; + else if (__do_repeat) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + __init_repeat(__s); + } + else + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->second(); + } + } + else + { + __s.__loop_data_[__loop_id_].first = 0; + bool __do_repeat = 0 < __max_; + bool __do_alt = 0 >= __min_; + if (__do_repeat && __do_alt) + __s.__do_ = __state::__split; + else if (__do_repeat) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + __init_repeat(__s); + } + else + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->second(); + } + } +} + +template <class _CharT> +void +__loop<_CharT>::__exec_split(bool __second, __state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + if (__greedy_ != __second) + { + __s.__node_ = this->first(); + __init_repeat(__s); + } + else + __s.__node_ = this->second(); +} + +// __alternate + +template <class _CharT> +class __alternate + : public __owns_two_states<_CharT> +{ + typedef __owns_two_states<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __alternate(__owns_one_state<_CharT>* __s1, + __owns_one_state<_CharT>* __s2) + : base(__s1, __s2) {} + + virtual void __exec(__state& __s) const; + virtual void __exec_split(bool __second, __state& __s) const; +}; + +template <class _CharT> +void +__alternate<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__split; +} + +template <class _CharT> +void +__alternate<_CharT>::__exec_split(bool __second, __state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + if (__second) + __s.__node_ = this->second(); + else + __s.__node_ = this->first(); +} + +// __begin_marked_subexpression + +template <class _CharT> +class __begin_marked_subexpression + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + unsigned __mexp_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) + : base(__s), __mexp_(__mexp) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__begin_marked_subexpression<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + __s.__sub_matches_[__mexp_-1].first = __s.__current_; + __s.__node_ = this->first(); +} + +// __end_marked_subexpression + +template <class _CharT> +class __end_marked_subexpression + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + unsigned __mexp_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s) + : base(__s), __mexp_(__mexp) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__end_marked_subexpression<_CharT>::__exec(__state& __s) const +{ + __s.__do_ = __state::__accept_but_not_consume; + __s.__sub_matches_[__mexp_-1].second = __s.__current_; + __s.__sub_matches_[__mexp_-1].matched = true; + __s.__node_ = this->first(); +} + +// __back_ref + +template <class _CharT> +class __back_ref + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + unsigned __mexp_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __back_ref(unsigned __mexp, __node<_CharT>* __s) + : base(__s), __mexp_(__mexp) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__back_ref<_CharT>::__exec(__state& __s) const +{ + sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; + if (__sm.matched) + { + ptrdiff_t __len = __sm.second - __sm.first; + if (__s.__last_ - __s.__current_ >= __len && + _VSTD::equal(__sm.first, __sm.second, __s.__current_)) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__current_ += __len; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __back_ref_icase + +template <class _CharT, class _Traits> +class __back_ref_icase + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _Traits __traits_; + unsigned __mexp_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp, + __node<_CharT>* __s) + : base(__s), __traits_(__traits), __mexp_(__mexp) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const +{ + sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; + if (__sm.matched) + { + ptrdiff_t __len = __sm.second - __sm.first; + if (__s.__last_ - __s.__current_ >= __len) + { + for (ptrdiff_t __i = 0; __i < __len; ++__i) + { + if (__traits_.translate_nocase(__sm.first[__i]) != + __traits_.translate_nocase(__s.__current_[__i])) + goto __not_equal; + } + __s.__do_ = __state::__accept_but_not_consume; + __s.__current_ += __len; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } + } + else + { +__not_equal: + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __back_ref_collate + +template <class _CharT, class _Traits> +class __back_ref_collate + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _Traits __traits_; + unsigned __mexp_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp, + __node<_CharT>* __s) + : base(__s), __traits_(__traits), __mexp_(__mexp) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const +{ + sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1]; + if (__sm.matched) + { + ptrdiff_t __len = __sm.second - __sm.first; + if (__s.__last_ - __s.__current_ >= __len) + { + for (ptrdiff_t __i = 0; __i < __len; ++__i) + { + if (__traits_.translate(__sm.first[__i]) != + __traits_.translate(__s.__current_[__i])) + goto __not_equal; + } + __s.__do_ = __state::__accept_but_not_consume; + __s.__current_ += __len; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } + } + else + { +__not_equal: + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __word_boundary + +template <class _CharT, class _Traits> +class __word_boundary + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _Traits __traits_; + bool __invert_; +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + explicit __word_boundary(const _Traits& __traits, bool __invert, + __node<_CharT>* __s) + : base(__s), __traits_(__traits), __invert_(__invert) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__word_boundary<_CharT, _Traits>::__exec(__state& __s) const +{ + bool __is_word_b = false; + if (__s.__first_ != __s.__last_) + { + if (__s.__current_ == __s.__last_) + { + if (!(__s.__flags_ & regex_constants::match_not_eow)) + { + _CharT __c = __s.__current_[-1]; + __is_word_b = __c == '_' || + __traits_.isctype(__c, ctype_base::alnum); + } + } + else if (__s.__current_ == __s.__first_ && + !(__s.__flags_ & regex_constants::match_prev_avail)) + { + if (!(__s.__flags_ & regex_constants::match_not_bow)) + { + _CharT __c = *__s.__current_; + __is_word_b = __c == '_' || + __traits_.isctype(__c, ctype_base::alnum); + } + } + else + { + _CharT __c1 = __s.__current_[-1]; + _CharT __c2 = *__s.__current_; + bool __is_c1_b = __c1 == '_' || + __traits_.isctype(__c1, ctype_base::alnum); + bool __is_c2_b = __c2 == '_' || + __traits_.isctype(__c2, ctype_base::alnum); + __is_word_b = __is_c1_b != __is_c2_b; + } + } + if (__is_word_b != __invert_) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __l_anchor + +template <class _CharT> +class __l_anchor + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __l_anchor(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__l_anchor<_CharT>::__exec(__state& __s) const +{ + if (__s.__at_first_ && __s.__current_ == __s.__first_) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __r_anchor + +template <class _CharT> +class __r_anchor + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __r_anchor(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__r_anchor<_CharT>::__exec(__state& __s) const +{ + if (__s.__current_ == __s.__last_) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __match_any + +template <class _CharT> +class __match_any + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __match_any(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__match_any<_CharT>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_ && *__s.__current_ != 0) + { + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __match_any_but_newline + +template <class _CharT> +class __match_any_but_newline + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __match_any_but_newline(__node<_CharT>* __s) + : base(__s) {} + + virtual void __exec(__state&) const; +}; + +// __match_char + +template <class _CharT> +class __match_char + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _CharT __c_; + + __match_char(const __match_char&); + __match_char& operator=(const __match_char&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __match_char(_CharT __c, __node<_CharT>* __s) + : base(__s), __c_(__c) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT> +void +__match_char<_CharT>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_) + { + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __match_char_icase + +template <class _CharT, class _Traits> +class __match_char_icase + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _Traits __traits_; + _CharT __c_; + + __match_char_icase(const __match_char_icase&); + __match_char_icase& operator=(const __match_char_icase&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) + : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_ && + __traits_.translate_nocase(*__s.__current_) == __c_) + { + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __match_char_collate + +template <class _CharT, class _Traits> +class __match_char_collate + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + _Traits __traits_; + _CharT __c_; + + __match_char_collate(const __match_char_collate&); + __match_char_collate& operator=(const __match_char_collate&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s) + : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_ && + __traits_.translate(*__s.__current_) == __c_) + { + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +// __bracket_expression + +template <class _CharT, class _Traits> +class __bracket_expression + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + typedef typename _Traits::string_type string_type; + + _Traits __traits_; + vector<_CharT> __chars_; + vector<_CharT> __neg_chars_; + vector<pair<string_type, string_type> > __ranges_; + vector<pair<_CharT, _CharT> > __digraphs_; + vector<string_type> __equivalences_; + ctype_base::mask __mask_; + ctype_base::mask __neg_mask_; + bool __negate_; + bool __icase_; + bool __collate_; + bool __might_have_digraph_; + + __bracket_expression(const __bracket_expression&); + __bracket_expression& operator=(const __bracket_expression&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __bracket_expression(const _Traits& __traits, __node<_CharT>* __s, + bool __negate, bool __icase, bool __collate) + : base(__s), __traits_(__traits), __mask_(), __neg_mask_(), + __negate_(__negate), __icase_(__icase), __collate_(__collate), + __might_have_digraph_(__traits_.getloc().name() != "C") {} + + virtual void __exec(__state&) const; + + _LIBCPP_INLINE_VISIBILITY + bool __negated() const {return __negate_;} + + _LIBCPP_INLINE_VISIBILITY + void __add_char(_CharT __c) + { + if (__icase_) + __chars_.push_back(__traits_.translate_nocase(__c)); + else if (__collate_) + __chars_.push_back(__traits_.translate(__c)); + else + __chars_.push_back(__c); + } + _LIBCPP_INLINE_VISIBILITY + void __add_neg_char(_CharT __c) + { + if (__icase_) + __neg_chars_.push_back(__traits_.translate_nocase(__c)); + else if (__collate_) + __neg_chars_.push_back(__traits_.translate(__c)); + else + __neg_chars_.push_back(__c); + } + _LIBCPP_INLINE_VISIBILITY + void __add_range(string_type __b, string_type __e) + { + if (__collate_) + { + if (__icase_) + { + for (size_t __i = 0; __i < __b.size(); ++__i) + __b[__i] = __traits_.translate_nocase(__b[__i]); + for (size_t __i = 0; __i < __e.size(); ++__i) + __e[__i] = __traits_.translate_nocase(__e[__i]); + } + else + { + for (size_t __i = 0; __i < __b.size(); ++__i) + __b[__i] = __traits_.translate(__b[__i]); + for (size_t __i = 0; __i < __e.size(); ++__i) + __e[__i] = __traits_.translate(__e[__i]); + } + __ranges_.push_back(make_pair( + __traits_.transform(__b.begin(), __b.end()), + __traits_.transform(__e.begin(), __e.end()))); + } + else + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__b.size() != 1 || __e.size() != 1) + throw regex_error(regex_constants::error_collate); +#endif // _LIBCPP_NO_EXCEPTIONS + if (__icase_) + { + __b[0] = __traits_.translate_nocase(__b[0]); + __e[0] = __traits_.translate_nocase(__e[0]); + } + __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e))); + } + } + _LIBCPP_INLINE_VISIBILITY + void __add_digraph(_CharT __c1, _CharT __c2) + { + if (__icase_) + __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1), + __traits_.translate_nocase(__c2))); + else if (__collate_) + __digraphs_.push_back(make_pair(__traits_.translate(__c1), + __traits_.translate(__c2))); + else + __digraphs_.push_back(make_pair(__c1, __c2)); + } + _LIBCPP_INLINE_VISIBILITY + void __add_equivalence(const string_type& __s) + {__equivalences_.push_back(__s);} + _LIBCPP_INLINE_VISIBILITY + void __add_class(ctype_base::mask __mask) + {__mask_ |= __mask;} + _LIBCPP_INLINE_VISIBILITY + void __add_neg_class(ctype_base::mask __mask) + {__neg_mask_ |= __mask;} +}; + +template <class _CharT, class _Traits> +void +__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const +{ + bool __found = false; + unsigned __consumed = 0; + if (__s.__current_ != __s.__last_) + { + ++__consumed; + if (__might_have_digraph_) + { + const _CharT* __next = _VSTD::next(__s.__current_); + if (__next != __s.__last_) + { + pair<_CharT, _CharT> __ch2(*__s.__current_, *__next); + if (__icase_) + { + __ch2.first = __traits_.translate_nocase(__ch2.first); + __ch2.second = __traits_.translate_nocase(__ch2.second); + } + else if (__collate_) + { + __ch2.first = __traits_.translate(__ch2.first); + __ch2.second = __traits_.translate(__ch2.second); + } + if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty()) + { + // __ch2 is a digraph in this locale + ++__consumed; + for (size_t __i = 0; __i < __digraphs_.size(); ++__i) + { + if (__ch2 == __digraphs_[__i]) + { + __found = true; + goto __exit; + } + } + if (__collate_ && !__ranges_.empty()) + { + string_type __s2 = __traits_.transform(&__ch2.first, + &__ch2.first + 2); + for (size_t __i = 0; __i < __ranges_.size(); ++__i) + { + if (__ranges_[__i].first <= __s2 && + __s2 <= __ranges_[__i].second) + { + __found = true; + goto __exit; + } + } + } + if (!__equivalences_.empty()) + { + string_type __s2 = __traits_.transform_primary(&__ch2.first, + &__ch2.first + 2); + for (size_t __i = 0; __i < __equivalences_.size(); ++__i) + { + if (__s2 == __equivalences_[__i]) + { + __found = true; + goto __exit; + } + } + } + if (__traits_.isctype(__ch2.first, __mask_) && + __traits_.isctype(__ch2.second, __mask_)) + { + __found = true; + goto __exit; + } + if (!__traits_.isctype(__ch2.first, __neg_mask_) && + !__traits_.isctype(__ch2.second, __neg_mask_)) + { + __found = true; + goto __exit; + } + goto __exit; + } + } + } + // test *__s.__current_ as not a digraph + _CharT __ch = *__s.__current_; + if (__icase_) + __ch = __traits_.translate_nocase(__ch); + else if (__collate_) + __ch = __traits_.translate(__ch); + for (size_t __i = 0; __i < __chars_.size(); ++__i) + { + if (__ch == __chars_[__i]) + { + __found = true; + goto __exit; + } + } + if (!__neg_chars_.empty()) + { + for (size_t __i = 0; __i < __neg_chars_.size(); ++__i) + { + if (__ch == __neg_chars_[__i]) + goto __is_neg_char; + } + __found = true; + goto __exit; + } +__is_neg_char: + if (!__ranges_.empty()) + { + string_type __s2 = __collate_ ? + __traits_.transform(&__ch, &__ch + 1) : + string_type(1, __ch); + for (size_t __i = 0; __i < __ranges_.size(); ++__i) + { + if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second) + { + __found = true; + goto __exit; + } + } + } + if (!__equivalences_.empty()) + { + string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1); + for (size_t __i = 0; __i < __equivalences_.size(); ++__i) + { + if (__s2 == __equivalences_[__i]) + { + __found = true; + goto __exit; + } + } + } + if (__traits_.isctype(__ch, __mask_)) + { + __found = true; + goto __exit; + } + if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_)) + { + __found = true; + goto __exit; + } + } + else + __found = __negate_; // force reject +__exit: + if (__found != __negate_) + { + __s.__do_ = __state::__accept_and_consume; + __s.__current_ += __consumed; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +template <class _CharT, class _Traits> class __lookahead; + +template <class _CharT, class _Traits = regex_traits<_CharT> > +class _LIBCPP_VISIBLE basic_regex +{ +public: + // types: + typedef _CharT value_type; + typedef regex_constants::syntax_option_type flag_type; + typedef typename _Traits::locale_type locale_type; + +private: + _Traits __traits_; + flag_type __flags_; + unsigned __marked_count_; + unsigned __loop_count_; + int __open_count_; + shared_ptr<__empty_state<_CharT> > __start_; + __owns_one_state<_CharT>* __end_; + + typedef _VSTD::__state<_CharT> __state; + typedef _VSTD::__node<_CharT> __node; + +public: + // constants: + static const/*expr*/ regex_constants::syntax_option_type icase = regex_constants::icase; + static const/*expr*/ regex_constants::syntax_option_type nosubs = regex_constants::nosubs; + static const/*expr*/ regex_constants::syntax_option_type optimize = regex_constants::optimize; + static const/*expr*/ regex_constants::syntax_option_type collate = regex_constants::collate; + static const/*expr*/ regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript; + static const/*expr*/ regex_constants::syntax_option_type basic = regex_constants::basic; + static const/*expr*/ regex_constants::syntax_option_type extended = regex_constants::extended; + static const/*expr*/ regex_constants::syntax_option_type awk = regex_constants::awk; + static const/*expr*/ regex_constants::syntax_option_type grep = regex_constants::grep; + static const/*expr*/ regex_constants::syntax_option_type egrep = regex_constants::egrep; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + basic_regex() + : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {} + _LIBCPP_INLINE_VISIBILITY + explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript) + : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {__parse(__p, __p + __traits_.length(__p));} + _LIBCPP_INLINE_VISIBILITY + basic_regex(const value_type* __p, size_t __len, flag_type __f) + : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {__parse(__p, __p + __len);} +// basic_regex(const basic_regex&) = default; +// basic_regex(basic_regex&&) = default; + template <class _ST, class _SA> + _LIBCPP_INLINE_VISIBILITY + explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p, + flag_type __f = regex_constants::ECMAScript) + : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {__parse(__p.begin(), __p.end());} + template <class _ForwardIterator> + _LIBCPP_INLINE_VISIBILITY + basic_regex(_ForwardIterator __first, _ForwardIterator __last, + flag_type __f = regex_constants::ECMAScript) + : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {__parse(__first, __last);} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_regex(initializer_list<value_type> __il, + flag_type __f = regex_constants::ECMAScript) + : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0), + __end_(0) + {__parse(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +// ~basic_regex() = default; + +// basic_regex& operator=(const basic_regex&) = default; +// basic_regex& operator=(basic_regex&&) = default; + _LIBCPP_INLINE_VISIBILITY + basic_regex& operator=(const value_type* __p) + {return assign(__p);} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_regex& operator=(initializer_list<value_type> __il) + {return assign(__il);} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template <class _ST, class _SA> + _LIBCPP_INLINE_VISIBILITY + basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p) + {return assign(__p);} + + // assign: + _LIBCPP_INLINE_VISIBILITY + basic_regex& assign(const basic_regex& __that) + {return *this = __that;} + _LIBCPP_INLINE_VISIBILITY + basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript) + {return assign(__p, __p + __traits_.length(__p), __f);} + _LIBCPP_INLINE_VISIBILITY + basic_regex& assign(const value_type* __p, size_t __len, flag_type __f) + {return assign(__p, __p + __len, __f);} + template <class _ST, class _SA> + _LIBCPP_INLINE_VISIBILITY + basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s, + flag_type __f = regex_constants::ECMAScript) + {return assign(__s.begin(), __s.end(), __f);} + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + basic_regex& + >::type + assign(_InputIterator __first, _InputIterator __last, + flag_type __f = regex_constants::ECMAScript) + { + basic_string<_CharT> __t(__first, __last); + return assign(__t.begin(), __t.end(), __f); + } + +private: + _LIBCPP_INLINE_VISIBILITY + void __member_init(flag_type __f) + { + __flags_ = __f; + __marked_count_ = 0; + __loop_count_ = 0; + __open_count_ = 0; + __end_ = nullptr; + } +public: + + template <class _ForwardIterator> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + basic_regex& + >::type + assign(_ForwardIterator __first, _ForwardIterator __last, + flag_type __f = regex_constants::ECMAScript) + { + __member_init(__f); + __parse(__first, __last); + } + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + basic_regex& assign(initializer_list<value_type> __il, + flag_type __f = regex_constants::ECMAScript) + {return assign(__il.begin(), __il.end(), __f);} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + // const operations: + _LIBCPP_INLINE_VISIBILITY + unsigned mark_count() const {return __marked_count_;} + _LIBCPP_INLINE_VISIBILITY + flag_type flags() const {return __flags_;} + + // locale: + _LIBCPP_INLINE_VISIBILITY + locale_type imbue(locale_type __loc) + { + __member_init(ECMAScript); + __start_.reset(); + return __traits_.imbue(__loc); + } + _LIBCPP_INLINE_VISIBILITY + locale_type getloc() const {return __traits_.getloc();} + + // swap: + void swap(basic_regex& __r); + +private: + _LIBCPP_INLINE_VISIBILITY + unsigned __loop_count() const {return __loop_count_;} + + template <class _ForwardIterator> + _ForwardIterator + __parse(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last, + __owns_one_state<_CharT>* __s, + unsigned __mexp_begin, unsigned __mexp_end); + template <class _ForwardIterator> + _ForwardIterator + __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last, + __owns_one_state<_CharT>* __s, + unsigned __mexp_begin, unsigned __mexp_end); + template <class _ForwardIterator> + _ForwardIterator + __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml); + template <class _ForwardIterator> + _ForwardIterator + __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml); + template <class _ForwardIterator> + _ForwardIterator + __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml); + template <class _ForwardIterator> + _ForwardIterator + __parse_character_class(_ForwardIterator __first, _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml); + template <class _ForwardIterator> + _ForwardIterator + __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last, + basic_string<_CharT>& __col_sym); + template <class _ForwardIterator> + _ForwardIterator + __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c); + template <class _ForwardIterator> + _ForwardIterator + __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_alternative(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_term(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_assertion(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_atom(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last, + basic_string<_CharT>* __str = nullptr); + template <class _ForwardIterator> + _ForwardIterator + __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_grep(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_egrep(_ForwardIterator __first, _ForwardIterator __last); + template <class _ForwardIterator> + _ForwardIterator + __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last, + basic_string<_CharT>& __str, + __bracket_expression<_CharT, _Traits>* __ml); + template <class _ForwardIterator> + _ForwardIterator + __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last, + basic_string<_CharT>* __str = nullptr); + + _LIBCPP_INLINE_VISIBILITY + void __push_l_anchor(); + void __push_r_anchor(); + void __push_match_any(); + void __push_match_any_but_newline(); + _LIBCPP_INLINE_VISIBILITY + void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s, + unsigned __mexp_begin = 0, unsigned __mexp_end = 0) + {__push_loop(__min, numeric_limits<size_t>::max(), __s, + __mexp_begin, __mexp_end);} + _LIBCPP_INLINE_VISIBILITY + void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s, + unsigned __mexp_begin = 0, unsigned __mexp_end = 0) + {__push_loop(__min, numeric_limits<size_t>::max(), __s, + __mexp_begin, __mexp_end, false);} + void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s, + size_t __mexp_begin = 0, size_t __mexp_end = 0, + bool __greedy = true); + __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate); + void __push_char(value_type __c); + void __push_back_ref(int __i); + void __push_alternation(__owns_one_state<_CharT>* __sa, + __owns_one_state<_CharT>* __sb); + void __push_begin_marked_subexpression(); + void __push_end_marked_subexpression(unsigned); + void __push_empty(); + void __push_word_boundary(bool); + void __push_lookahead(const basic_regex&, bool); + + template <class _Allocator> + bool + __search(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags) const; + + template <class _Allocator> + bool + __match_at_start(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool) const; + template <class _Allocator> + bool + __match_at_start_ecma(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool) const; + template <class _Allocator> + bool + __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool) const; + template <class _Allocator> + bool + __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool) const; + + template <class _Bp, class _Ap, class _Cp, class _Tp> + friend + bool + regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, + regex_constants::match_flag_type); + + template <class _Ap, class _Cp, class _Tp> + friend + bool + regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&, + const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); + + template <class _Bp, class _Cp, class _Tp> + friend + bool + regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&, + regex_constants::match_flag_type); + + template <class _Cp, class _Tp> + friend + bool + regex_search(const _Cp*, const _Cp*, + const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type); + + template <class _Cp, class _Ap, class _Tp> + friend + bool + regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&, + regex_constants::match_flag_type); + + template <class _ST, class _SA, class _Cp, class _Tp> + friend + bool + regex_search(const basic_string<_Cp, _ST, _SA>& __s, + const basic_regex<_Cp, _Tp>& __e, + regex_constants::match_flag_type __flags); + + template <class _ST, class _SA, class _Ap, class _Cp, class _Tp> + friend + bool + regex_search(const basic_string<_Cp, _ST, _SA>& __s, + match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&, + const basic_regex<_Cp, _Tp>& __e, + regex_constants::match_flag_type __flags); + + template <class, class> friend class __lookahead; +}; + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::swap(basic_regex& __r) +{ + using _VSTD::swap; + swap(__traits_, __r.__traits_); + swap(__flags_, __r.__flags_); + swap(__marked_count_, __r.__marked_count_); + swap(__loop_count_, __r.__loop_count_); + swap(__open_count_, __r.__open_count_); + swap(__start_, __r.__start_); + swap(__end_, __r.__end_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y) +{ + return __x.swap(__y); +} + +// __lookahead + +template <class _CharT, class _Traits> +class __lookahead + : public __owns_one_state<_CharT> +{ + typedef __owns_one_state<_CharT> base; + + basic_regex<_CharT, _Traits> __exp_; + bool __invert_; + + __lookahead(const __lookahead&); + __lookahead& operator=(const __lookahead&); +public: + typedef _VSTD::__state<_CharT> __state; + + _LIBCPP_INLINE_VISIBILITY + __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s) + : base(__s), __exp_(__exp), __invert_(__invert) {} + + virtual void __exec(__state&) const; +}; + +template <class _CharT, class _Traits> +void +__lookahead<_CharT, _Traits>::__exec(__state& __s) const +{ + match_results<const _CharT*> __m; + __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_); + bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_, + __m, + __s.__flags_ | regex_constants::match_continuous, + true); + if (__matched != __invert_) + { + __s.__do_ = __state::__accept_but_not_consume; + __s.__node_ = this->first(); + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first, + _ForwardIterator __last) +{ + { + unique_ptr<__node> __h(new __end_state<_CharT>); + __start_.reset(new __empty_state<_CharT>(__h.get())); + __h.release(); + __end_ = __start_.get(); + } + switch (__flags_ & 0x1F0) + { + case ECMAScript: + __first = __parse_ecma_exp(__first, __last); + break; + case basic: + __first = __parse_basic_reg_exp(__first, __last); + break; + case extended: + case awk: + __first = __parse_extended_reg_exp(__first, __last); + break; + case grep: + __first = __parse_grep(__first, __last); + break; + case egrep: + __first = __parse_egrep(__first, __last); + break; +#ifndef _LIBCPP_NO_EXCEPTIONS + default: + throw regex_error(regex_constants::__re_err_grammar); +#endif // _LIBCPP_NO_EXCEPTIONS + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + if (*__first == '^') + { + __push_l_anchor(); + ++__first; + } + if (__first != __last) + { + __first = __parse_RE_expression(__first, __last); + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp == __last && *__first == '$') + { + __push_r_anchor(); + ++__first; + } + } + } +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first != __last) + throw regex_error(regex_constants::__re_err_empty); +#endif // _LIBCPP_NO_EXCEPTIONS + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first, + _ForwardIterator __last) +{ + __owns_one_state<_CharT>* __sa = __end_; + _ForwardIterator __temp = __parse_ERE_branch(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::__re_err_empty); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = __temp; + while (__first != __last && *__first == '|') + { + __owns_one_state<_CharT>* __sb = __end_; + __temp = __parse_ERE_branch(++__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::__re_err_empty); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_alternation(__sa, __sb); + __first = __temp; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first, + _ForwardIterator __last) +{ + _ForwardIterator __temp = __parse_ERE_expression(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::__re_err_empty); +#endif // _LIBCPP_NO_EXCEPTIONS + do + { + __first = __temp; + __temp = __parse_ERE_expression(__first, __last); + } while (__temp != __first); + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first, + _ForwardIterator __last) +{ + __owns_one_state<_CharT>* __e = __end_; + unsigned __mexp_begin = __marked_count_; + _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last); + if (__temp == __first && __temp != __last) + { + switch (*__temp) + { + case '^': + __push_l_anchor(); + ++__temp; + break; + case '$': + __push_r_anchor(); + ++__temp; + break; + case '(': + __push_begin_marked_subexpression(); + unsigned __temp_count = __marked_count_; + ++__open_count_; + __temp = __parse_extended_reg_exp(++__temp, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last || *__temp != ')') + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_end_marked_subexpression(__temp_count); + --__open_count_; + ++__temp; + break; + } + } + if (__temp != __first) + __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1, + __marked_count_+1); + __first = __temp; + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first, + _ForwardIterator __last) +{ + while (true) + { + _ForwardIterator __temp = __parse_simple_RE(__first, __last); + if (__temp == __first) + break; + __first = __temp; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + __owns_one_state<_CharT>* __e = __end_; + unsigned __mexp_begin = __marked_count_; + _ForwardIterator __temp = __parse_nondupl_RE(__first, __last); + if (__temp != __first) + __first = __parse_RE_dupl_symbol(__temp, __last, __e, + __mexp_begin+1, __marked_count_+1); + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first, + _ForwardIterator __last) +{ + _ForwardIterator __temp = __first; + __first = __parse_one_char_or_coll_elem_RE(__first, __last); + if (__temp == __first) + { + __temp = __parse_Back_open_paren(__first, __last); + if (__temp != __first) + { + __push_begin_marked_subexpression(); + unsigned __temp_count = __marked_count_; + __first = __parse_RE_expression(__temp, __last); + __temp = __parse_Back_close_paren(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_end_marked_subexpression(__temp_count); + __first = __temp; + } + else + __first = __parse_BACKREF(__first, __last); + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE( + _ForwardIterator __first, + _ForwardIterator __last) +{ + _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last); + if (__temp == __first) + { + __temp = __parse_QUOTED_CHAR(__first, __last); + if (__temp == __first) + { + if (__temp != __last && *__temp == '.') + { + __push_match_any(); + ++__temp; + } + else + __temp = __parse_bracket_expression(__first, __last); + } + } + __first = __temp; + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE( + _ForwardIterator __first, + _ForwardIterator __last) +{ + _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last); + if (__temp == __first) + { + __temp = __parse_QUOTED_CHAR_ERE(__first, __last); + if (__temp == __first) + { + if (__temp != __last && *__temp == '.') + { + __push_match_any(); + ++__temp; + } + else + __temp = __parse_bracket_expression(__first, __last); + } + } + __first = __temp; + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\' && *__temp == '(') + __first = ++__temp; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\' && *__temp == ')') + __first = ++__temp; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\' && *__temp == '{') + __first = ++__temp; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\' && *__temp == '}') + __first = ++__temp; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\' && '1' <= *__temp && *__temp <= '9') + { + __push_back_ref(*__temp - '0'); + __first = ++__temp; + } + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp == __last && *__first == '$') + return __first; + // Not called inside a bracket + if (*__first == '.' || *__first == '\\' || *__first == '[') + return __first; + __push_char(*__first); + ++__first; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + switch (*__first) + { + case '^': + case '.': + case '[': + case '$': + case '(': + case '|': + case '*': + case '+': + case '?': + case '{': + case '\\': + break; + case ')': + if (__open_count_ == 0) + { + __push_char(*__first); + ++__first; + } + break; + default: + __push_char(*__first); + ++__first; + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\') + { + switch (*__temp) + { + case '^': + case '.': + case '*': + case '[': + case '$': + case '\\': + __push_char(*__temp); + __first = ++__temp; + break; + } + } + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__first == '\\') + { + switch (*__temp) + { + case '^': + case '.': + case '*': + case '[': + case '$': + case '\\': + case '(': + case ')': + case '|': + case '+': + case '?': + case '{': + __push_char(*__temp); + __first = ++__temp; + break; + default: + if ((__flags_ & 0x1F0) == awk) + __first = __parse_awk_escape(++__first, __last); + break; + } + } + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first, + _ForwardIterator __last, + __owns_one_state<_CharT>* __s, + unsigned __mexp_begin, + unsigned __mexp_end) +{ + if (__first != __last) + { + if (*__first == '*') + { + __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); + ++__first; + } + else + { + _ForwardIterator __temp = __parse_Back_open_brace(__first, __last); + if (__temp != __first) + { + int __min = 0; + __first = __temp; + __temp = __parse_DUP_COUNT(__first, __last, __min); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = __temp; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + if (*__first != ',') + { + __temp = __parse_Back_close_brace(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, + true); + __first = __temp; + } + else + { + ++__first; // consume ',' + int __max = -1; + __first = __parse_DUP_COUNT(__first, __last, __max); + __temp = __parse_Back_close_brace(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + if (__max == -1) + __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); + else + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__max < __min) + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, + true); + } + __first = __temp; + } + } + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first, + _ForwardIterator __last, + __owns_one_state<_CharT>* __s, + unsigned __mexp_begin, + unsigned __mexp_end) +{ + if (__first != __last) + { + unsigned __grammar = __flags_ & 0x1F0; + switch (*__first) + { + case '*': + ++__first; + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); + } + else + __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end); + break; + case '+': + ++__first; + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); + } + else + __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end); + break; + case '?': + ++__first; + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false); + } + else + __push_loop(0, 1, __s, __mexp_begin, __mexp_end); + break; + case '{': + { + int __min; + _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = __temp; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + switch (*__first) + { + case '}': + ++__first; + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false); + } + else + __push_loop(__min, __min, __s, __mexp_begin, __mexp_end); + break; + case ',': + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + if (*__first == '}') + { + ++__first; + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); + } + else + __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end); + } + else + { + int __max = -1; + __temp = __parse_DUP_COUNT(__first, __last, __max); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __first) + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = __temp; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last || *__first != '}') + throw regex_error(regex_constants::error_brace); +#endif // _LIBCPP_NO_EXCEPTIONS + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__max < __min) + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + if (__grammar == ECMAScript && __first != __last && *__first == '?') + { + ++__first; + __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false); + } + else + __push_loop(__min, __max, __s, __mexp_begin, __mexp_end); + } + break; +#ifndef _LIBCPP_NO_EXCEPTIONS + default: + throw regex_error(regex_constants::error_badbrace); +#endif // _LIBCPP_NO_EXCEPTIONS + } + } + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last && *__first == '[') + { + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + bool __negate = false; + if (*__first == '^') + { + ++__first; + __negate = true; + } + __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate); + // __ml owned by *this +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']') + { + __ml->__add_char(']'); + ++__first; + } + __first = __parse_follow_list(__first, __last, __ml); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + if (*__first == '-') + { + __ml->__add_char('-'); + ++__first; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last || *__first != ']') + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + ++__first; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first, + _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml) +{ + if (__first != __last) + { + while (true) + { + _ForwardIterator __temp = __parse_expression_term(__first, __last, + __ml); + if (__temp == __first) + break; + __first = __temp; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first, + _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml) +{ + if (__first != __last && *__first != ']') + { + _ForwardIterator __temp = _VSTD::next(__first); + basic_string<_CharT> __start_range; + if (__temp != __last && *__first == '[') + { + if (*__temp == '=') + return __parse_equivalence_class(++__temp, __last, __ml); + else if (*__temp == ':') + return __parse_character_class(++__temp, __last, __ml); + else if (*__temp == '.') + __first = __parse_collating_symbol(++__temp, __last, __start_range); + } + unsigned __grammar = __flags_ & 0x1F0; + if (__start_range.empty()) + { + if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') + { + if (__grammar == ECMAScript) + __first = __parse_class_escape(++__first, __last, __start_range, __ml); + else + __first = __parse_awk_escape(++__first, __last, &__start_range); + } + else + { + __start_range = *__first; + ++__first; + } + } + if (__first != __last && *__first != ']') + { + __temp = _VSTD::next(__first); + if (__temp != __last && *__first == '-' && *__temp != ']') + { + // parse a range + basic_string<_CharT> __end_range; + __first = __temp; + ++__temp; + if (__temp != __last && *__first == '[' && *__temp == '.') + __first = __parse_collating_symbol(++__temp, __last, __end_range); + else + { + if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\') + { + if (__grammar == ECMAScript) + __first = __parse_class_escape(++__first, __last, + __end_range, __ml); + else + __first = __parse_awk_escape(++__first, __last, + &__end_range); + } + else + { + __end_range = *__first; + ++__first; + } + } + __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range)); + } + else + { + if (__start_range.size() == 1) + __ml->__add_char(__start_range[0]); + else + __ml->__add_digraph(__start_range[0], __start_range[1]); + } + } + else + { + if (__start_range.size() == 1) + __ml->__add_char(__start_range[0]); + else + __ml->__add_digraph(__start_range[0], __start_range[1]); + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first, + _ForwardIterator __last, + basic_string<_CharT>& __str, + __bracket_expression<_CharT, _Traits>* __ml) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + switch (*__first) + { + case 0: + __str = *__first; + return ++__first; + case 'b': + __str = _CharT(8); + return ++__first; + case 'd': + __ml->__add_class(ctype_base::digit); + return ++__first; + case 'D': + __ml->__add_neg_class(ctype_base::digit); + return ++__first; + case 's': + __ml->__add_class(ctype_base::space); + return ++__first; + case 'S': + __ml->__add_neg_class(ctype_base::space); + return ++__first; + case 'w': + __ml->__add_class(ctype_base::alnum); + __ml->__add_char('_'); + return ++__first; + case 'W': + __ml->__add_neg_class(ctype_base::alnum); + __ml->__add_neg_char('_'); + return ++__first; + } + __first = __parse_character_escape(__first, __last, &__str); + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first, + _ForwardIterator __last, + basic_string<_CharT>* __str) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + switch (*__first) + { + case '\\': + case '"': + case '/': + if (__str) + *__str = *__first; + else + __push_char(*__first); + return ++__first; + case 'a': + if (__str) + *__str = _CharT(7); + else + __push_char(_CharT(7)); + return ++__first; + case 'b': + if (__str) + *__str = _CharT(8); + else + __push_char(_CharT(8)); + return ++__first; + case 'f': + if (__str) + *__str = _CharT(0xC); + else + __push_char(_CharT(0xC)); + return ++__first; + case 'n': + if (__str) + *__str = _CharT(0xA); + else + __push_char(_CharT(0xA)); + return ++__first; + case 'r': + if (__str) + *__str = _CharT(0xD); + else + __push_char(_CharT(0xD)); + return ++__first; + case 't': + if (__str) + *__str = _CharT(0x9); + else + __push_char(_CharT(0x9)); + return ++__first; + case 'v': + if (__str) + *__str = _CharT(0xB); + else + __push_char(_CharT(0xB)); + return ++__first; + } + if ('0' <= *__first && *__first <= '7') + { + unsigned __val = *__first - '0'; + if (++__first != __last && ('0' <= *__first && *__first <= '7')) + { + __val = 8 * __val + *__first - '0'; + if (++__first != __last && ('0' <= *__first && *__first <= '7')) + __val = 8 * __val + *__first - '0'; + } + if (__str) + *__str = _CharT(__val); + else + __push_char(_CharT(__val)); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + else + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first, + _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml) +{ + // Found [= + // This means =] must exist + value_type _Equal_close[2] = {'=', ']'}; + _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close, + _Equal_close+2); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + // [__first, __temp) contains all text in [= ... =] + typedef typename _Traits::string_type string_type; + string_type __collate_name = + __traits_.lookup_collatename(__first, __temp); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__collate_name.empty()) + throw regex_error(regex_constants::error_collate); +#endif // _LIBCPP_NO_EXCEPTIONS + string_type __equiv_name = + __traits_.transform_primary(__collate_name.begin(), + __collate_name.end()); + if (!__equiv_name.empty()) + __ml->__add_equivalence(__equiv_name); + else + { + switch (__collate_name.size()) + { + case 1: + __ml->__add_char(__collate_name[0]); + break; + case 2: + __ml->__add_digraph(__collate_name[0], __collate_name[1]); + break; +#ifndef _LIBCPP_NO_EXCEPTIONS + default: + throw regex_error(regex_constants::error_collate); +#endif // _LIBCPP_NO_EXCEPTIONS + } + } + __first = _VSTD::next(__temp, 2); + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first, + _ForwardIterator __last, + __bracket_expression<_CharT, _Traits>* __ml) +{ + // Found [: + // This means :] must exist + value_type _Colon_close[2] = {':', ']'}; + _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close, + _Colon_close+2); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + // [__first, __temp) contains all text in [: ... :] + typedef typename _Traits::char_class_type char_class_type; + char_class_type __class_type = + __traits_.lookup_classname(__first, __temp, __flags_ & icase); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__class_type == 0) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + __ml->__add_class(__class_type); + __first = _VSTD::next(__temp, 2); + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first, + _ForwardIterator __last, + basic_string<_CharT>& __col_sym) +{ + // Found [. + // This means .] must exist + value_type _Dot_close[2] = {'.', ']'}; + _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close, + _Dot_close+2); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last) + throw regex_error(regex_constants::error_brack); +#endif // _LIBCPP_NO_EXCEPTIONS + // [__first, __temp) contains all text in [. ... .] + typedef typename _Traits::string_type string_type; + __col_sym = __traits_.lookup_collatename(__first, __temp); + switch (__col_sym.size()) + { + case 1: + case 2: + break; +#ifndef _LIBCPP_NO_EXCEPTIONS + default: + throw regex_error(regex_constants::error_collate); +#endif // _LIBCPP_NO_EXCEPTIONS + } + __first = _VSTD::next(__temp, 2); + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first, + _ForwardIterator __last, + int& __c) +{ + if (__first != __last && '0' <= *__first && *__first <= '9') + { + __c = *__first - '0'; + for (++__first; __first != __last && '0' <= *__first && *__first <= '9'; + ++__first) + { + __c *= 10; + __c += *__first - '0'; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first, + _ForwardIterator __last) +{ + __owns_one_state<_CharT>* __sa = __end_; + _ForwardIterator __temp = __parse_alternative(__first, __last); + if (__temp == __first) + __push_empty(); + __first = __temp; + while (__first != __last && *__first == '|') + { + __owns_one_state<_CharT>* __sb = __end_; + __temp = __parse_alternative(++__first, __last); + if (__temp == __first) + __push_empty(); + __push_alternation(__sa, __sb); + __first = __temp; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first, + _ForwardIterator __last) +{ + while (true) + { + _ForwardIterator __temp = __parse_term(__first, __last); + if (__temp == __first) + break; + __first = __temp; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first, + _ForwardIterator __last) +{ + _ForwardIterator __temp = __parse_assertion(__first, __last); + if (__temp == __first) + { + __owns_one_state<_CharT>* __e = __end_; + unsigned __mexp_begin = __marked_count_; + __temp = __parse_atom(__first, __last); + if (__temp != __first) + __first = __parse_ERE_dupl_symbol(__temp, __last, __e, + __mexp_begin+1, __marked_count_+1); + } + else + __first = __temp; + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + switch (*__first) + { + case '^': + __push_l_anchor(); + ++__first; + break; + case '$': + __push_r_anchor(); + ++__first; + break; + case '\\': + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last) + { + if (*__temp == 'b') + { + __push_word_boundary(false); + __first = ++__temp; + } + else if (*__temp == 'B') + { + __push_word_boundary(true); + __first = ++__temp; + } + } + } + break; + case '(': + { + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last && *__temp == '?') + { + if (++__temp != __last) + { + switch (*__temp) + { + case '=': + { + basic_regex __exp; + __exp.__flags_ = __flags_; + __temp = __exp.__parse(++__temp, __last); + __push_lookahead(_VSTD::move(__exp), false); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last || *__temp != ')') + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = ++__temp; + } + break; + case '!': + { + basic_regex __exp; + __exp.__flags_ = __flags_; + __temp = __exp.__parse(++__temp, __last); + __push_lookahead(_VSTD::move(__exp), true); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__temp == __last || *__temp != ')') + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + __first = ++__temp; + } + break; + } + } + } + } + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + switch (*__first) + { + case '.': + __push_match_any_but_newline(); + ++__first; + break; + case '\\': + __first = __parse_atom_escape(__first, __last); + break; + case '[': + __first = __parse_bracket_expression(__first, __last); + break; + case '(': + { + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + _ForwardIterator __temp = _VSTD::next(__first); + if (__temp != __last && *__first == '?' && *__temp == ':') + { + ++__open_count_; + __first = __parse_ecma_exp(++__temp, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last || *__first != ')') + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + --__open_count_; + ++__first; + } + else + { + __push_begin_marked_subexpression(); + unsigned __temp_count = __marked_count_; + ++__open_count_; + __first = __parse_ecma_exp(__first, __last); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last || *__first != ')') + throw regex_error(regex_constants::error_paren); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_end_marked_subexpression(__temp_count); + --__open_count_; + ++__first; + } + } + break; + default: + __first = __parse_pattern_character(__first, __last); + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last && *__first == '\\') + { + _ForwardIterator __t1 = _VSTD::next(__first); + _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last); + if (__t2 != __t1) + __first = __t2; + else + { + __t2 = __parse_character_class_escape(__t1, __last); + if (__t2 != __t1) + __first = __t2; + else + { + __t2 = __parse_character_escape(__t1, __last); + if (__t2 != __t1) + __first = __t2; + } + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + if (*__first == '0') + { + __push_char(_CharT()); + ++__first; + } + else if ('1' <= *__first && *__first <= '9') + { + unsigned __v = *__first - '0'; + for (++__first; '0' <= *__first && *__first <= '9'; ++__first) + __v = 10 * __v + *__first - '0'; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__v > mark_count()) + throw regex_error(regex_constants::error_backref); +#endif // _LIBCPP_NO_EXCEPTIONS + __push_back_ref(__v); + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + __bracket_expression<_CharT, _Traits>* __ml; + switch (*__first) + { + case 'd': + __ml = __start_matching_list(false); + __ml->__add_class(ctype_base::digit); + ++__first; + break; + case 'D': + __ml = __start_matching_list(true); + __ml->__add_class(ctype_base::digit); + ++__first; + break; + case 's': + __ml = __start_matching_list(false); + __ml->__add_class(ctype_base::space); + ++__first; + break; + case 'S': + __ml = __start_matching_list(true); + __ml->__add_class(ctype_base::space); + ++__first; + break; + case 'w': + __ml = __start_matching_list(false); + __ml->__add_class(ctype_base::alnum); + __ml->__add_char('_'); + ++__first; + break; + case 'W': + __ml = __start_matching_list(true); + __ml->__add_class(ctype_base::alnum); + __ml->__add_char('_'); + ++__first; + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first, + _ForwardIterator __last, + basic_string<_CharT>* __str) +{ + if (__first != __last) + { + _ForwardIterator __t; + unsigned __sum = 0; + int __hd; + switch (*__first) + { + case 'f': + if (__str) + *__str = _CharT(0xC); + else + __push_char(_CharT(0xC)); + ++__first; + break; + case 'n': + if (__str) + *__str = _CharT(0xA); + else + __push_char(_CharT(0xA)); + ++__first; + break; + case 'r': + if (__str) + *__str = _CharT(0xD); + else + __push_char(_CharT(0xD)); + ++__first; + break; + case 't': + if (__str) + *__str = _CharT(0x9); + else + __push_char(_CharT(0x9)); + ++__first; + break; + case 'v': + if (__str) + *__str = _CharT(0xB); + else + __push_char(_CharT(0xB)); + ++__first; + break; + case 'c': + if ((__t = _VSTD::next(__first)) != __last) + { + if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z') + { + if (__str) + *__str = _CharT(*__t % 32); + else + __push_char(_CharT(*__t % 32)); + __first = ++__t; + } + } + break; + case 'u': + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __hd = __traits_.value(*__first, 16); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__hd == -1) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __sum = 16 * __sum + static_cast<unsigned>(__hd); + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __hd = __traits_.value(*__first, 16); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__hd == -1) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __sum = 16 * __sum + static_cast<unsigned>(__hd); + // drop through + case 'x': + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __hd = __traits_.value(*__first, 16); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__hd == -1) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __sum = 16 * __sum + static_cast<unsigned>(__hd); + ++__first; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__first == __last) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __hd = __traits_.value(*__first, 16); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__hd == -1) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + __sum = 16 * __sum + static_cast<unsigned>(__hd); + if (__str) + *__str = _CharT(__sum); + else + __push_char(_CharT(__sum)); + ++__first; + break; + default: + if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum)) + { + if (__str) + *__str = *__first; + else + __push_char(*__first); + ++__first; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + else if (__str) + throw regex_error(regex_constants::error_escape); +#endif // _LIBCPP_NO_EXCEPTIONS + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first, + _ForwardIterator __last) +{ + if (__first != __last) + { + switch (*__first) + { + case '^': + case '$': + case '\\': + case '.': + case '*': + case '+': + case '?': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '|': + break; + default: + __push_char(*__first); + ++__first; + break; + } + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first, + _ForwardIterator __last) +{ + __owns_one_state<_CharT>* __sa = __end_; + _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n')); + if (__t1 != __first) + __parse_basic_reg_exp(__first, __t1); + else + __push_empty(); + __first = __t1; + if (__first != __last) + ++__first; + while (__first != __last) + { + __t1 = _VSTD::find(__first, __last, _CharT('\n')); + __owns_one_state<_CharT>* __sb = __end_; + if (__t1 != __first) + __parse_basic_reg_exp(__first, __t1); + else + __push_empty(); + __push_alternation(__sa, __sb); + __first = __t1; + if (__first != __last) + ++__first; + } + return __first; +} + +template <class _CharT, class _Traits> +template <class _ForwardIterator> +_ForwardIterator +basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first, + _ForwardIterator __last) +{ + __owns_one_state<_CharT>* __sa = __end_; + _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n')); + if (__t1 != __first) + __parse_extended_reg_exp(__first, __t1); + else + __push_empty(); + __first = __t1; + if (__first != __last) + ++__first; + while (__first != __last) + { + __t1 = _VSTD::find(__first, __last, _CharT('\n')); + __owns_one_state<_CharT>* __sb = __end_; + if (__t1 != __first) + __parse_extended_reg_exp(__first, __t1); + else + __push_empty(); + __push_alternation(__sa, __sb); + __first = __t1; + if (__first != __last) + ++__first; + } + return __first; +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max, + __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end, + bool __greedy) +{ + unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first())); + __end_->first() = nullptr; + unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_, + __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy, + __min, __max)); + __s->first() = nullptr; + __e1.release(); + __end_->first() = new __repeat_one_loop<_CharT>(__e2.get()); + __end_ = __e2->second(); + __s->first() = __e2.release(); + ++__loop_count_; +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_char(value_type __c) +{ + if (flags() & icase) + __end_->first() = new __match_char_icase<_CharT, _Traits> + (__traits_, __c, __end_->first()); + else if (flags() & collate) + __end_->first() = new __match_char_collate<_CharT, _Traits> + (__traits_, __c, __end_->first()); + else + __end_->first() = new __match_char<_CharT>(__c, __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression() +{ + if (!(__flags_ & nosubs)) + { + __end_->first() = + new __begin_marked_subexpression<_CharT>(++__marked_count_, + __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); + } +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub) +{ + if (!(__flags_ & nosubs)) + { + __end_->first() = + new __end_marked_subexpression<_CharT>(__sub, __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); + } +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_l_anchor() +{ + __end_->first() = new __l_anchor<_CharT>(__end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_r_anchor() +{ + __end_->first() = new __r_anchor<_CharT>(__end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_match_any() +{ + __end_->first() = new __match_any<_CharT>(__end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_match_any_but_newline() +{ + __end_->first() = new __match_any_but_newline<_CharT>(__end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_empty() +{ + __end_->first() = new __empty_state<_CharT>(__end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert) +{ + __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert, + __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_back_ref(int __i) +{ + if (flags() & icase) + __end_->first() = new __back_ref_icase<_CharT, _Traits> + (__traits_, __i, __end_->first()); + else if (flags() & collate) + __end_->first() = new __back_ref_collate<_CharT, _Traits> + (__traits_, __i, __end_->first()); + else + __end_->first() = new __back_ref<_CharT>(__i, __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa, + __owns_one_state<_CharT>* __ea) +{ + __sa->first() = new __alternate<_CharT>( + static_cast<__owns_one_state<_CharT>*>(__sa->first()), + static_cast<__owns_one_state<_CharT>*>(__ea->first())); + __ea->first() = nullptr; + __ea->first() = new __empty_state<_CharT>(__end_->first()); + __end_->first() = nullptr; + __end_->first() = new __empty_non_own_state<_CharT>(__ea->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first()); +} + +template <class _CharT, class _Traits> +__bracket_expression<_CharT, _Traits>* +basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate) +{ + __bracket_expression<_CharT, _Traits>* __r = + new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(), + __negate, __flags_ & icase, + __flags_ & collate); + __end_->first() = __r; + __end_ = __r; + return __r; +} + +template <class _CharT, class _Traits> +void +basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp, + bool __invert) +{ + __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert, + __end_->first()); + __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first()); +} + +typedef basic_regex<char> regex; +typedef basic_regex<wchar_t> wregex; + +// sub_match + +template <class _BidirectionalIterator> +class _LIBCPP_VISIBLE sub_match + : public pair<_BidirectionalIterator, _BidirectionalIterator> +{ +public: + typedef _BidirectionalIterator iterator; + typedef typename iterator_traits<iterator>::value_type value_type; + typedef typename iterator_traits<iterator>::difference_type difference_type; + typedef basic_string<value_type> string_type; + + bool matched; + + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ sub_match() : matched() {} + + _LIBCPP_INLINE_VISIBILITY + difference_type length() const + {return matched ? _VSTD::distance(this->first, this->second) : 0;} + _LIBCPP_INLINE_VISIBILITY + string_type str() const + {return matched ? string_type(this->first, this->second) : string_type();} + _LIBCPP_INLINE_VISIBILITY + operator string_type() const + {return str();} + + _LIBCPP_INLINE_VISIBILITY + int compare(const sub_match& __s) const + {return str().compare(__s.str());} + _LIBCPP_INLINE_VISIBILITY + int compare(const string_type& __s) const + {return str().compare(__s);} + _LIBCPP_INLINE_VISIBILITY + int compare(const value_type* __s) const + {return str().compare(__s);} +}; + +typedef sub_match<const char*> csub_match; +typedef sub_match<const wchar_t*> wcsub_match; +typedef sub_match<string::const_iterator> ssub_match; +typedef sub_match<wstring::const_iterator> wssub_match; + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return __x.compare(__y) == 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return !(__x == __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return __x.compare(__y) < 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return !(__y < __x); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return !(__x < __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) +{ + return __y < __x; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return __y.compare(__x.c_str()) == 0; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return !(__x == __y); +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return __y.compare(__x.c_str()) > 0; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return __y < __x; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return !(__x < __y); +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x, + const sub_match<_BiIter>& __y) +{ + return !(__y < __x); +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return __x.compare(__y.c_str()) == 0; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return !(__x == __y); +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return __x.compare(__y.c_str()) < 0; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool operator>(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return __y < __x; +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return !(__x < __y); +} + +template <class _BiIter, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const sub_match<_BiIter>& __x, + const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) +{ + return !(__y < __x); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return __y.compare(__x) == 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return !(__x == __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return __y.compare(__x) > 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return __y < __x; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return !(__x < __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(typename iterator_traits<_BiIter>::value_type const* __x, + const sub_match<_BiIter>& __y) +{ + return !(__y < __x); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return __x.compare(__y) == 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return !(__x == __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return __x.compare(__y) < 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return __y < __x; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return !(__x < __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const* __y) +{ + return !(__y < __x); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; + return __y.compare(string_type(1, __x)) == 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + return !(__x == __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; + return __y.compare(string_type(1, __x)) > 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + return __y < __x; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + return !(__x < __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(typename iterator_traits<_BiIter>::value_type const& __x, + const sub_match<_BiIter>& __y) +{ + return !(__y < __x); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; + return __x.compare(string_type(1, __y)) == 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + return !(__x == __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type; + return __x.compare(string_type(1, __y)) < 0; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + return __y < __x; +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + return !(__x < __y); +} + +template <class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const sub_match<_BiIter>& __x, + typename iterator_traits<_BiIter>::value_type const& __y) +{ + return !(__y < __x); +} + +template <class _CharT, class _ST, class _BiIter> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _ST>& +operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m) +{ + return __os << __m.str(); +} + +template <class _BidirectionalIterator, class _Allocator> +class _LIBCPP_VISIBLE match_results +{ +public: + typedef _Allocator allocator_type; + typedef sub_match<_BidirectionalIterator> value_type; +private: + typedef vector<value_type, allocator_type> __container_type; + + __container_type __matches_; + value_type __unmatched_; + value_type __prefix_; + value_type __suffix_; + bool __ready_; +public: + _BidirectionalIterator __position_start_; + typedef const value_type& const_reference; + typedef const_reference reference; + typedef typename __container_type::const_iterator const_iterator; + typedef const_iterator iterator; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type; + typedef basic_string<char_type> string_type; + + // construct/copy/destroy: + explicit match_results(const allocator_type& __a = allocator_type()); +// match_results(const match_results&) = default; +// match_results& operator=(const match_results&) = default; +// match_results(match_results&& __m) = default; +// match_results& operator=(match_results&& __m) = default; +// ~match_results() = default; + + _LIBCPP_INLINE_VISIBILITY + bool ready() const {return __ready_;} + + // size: + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return __matches_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const {return __matches_.max_size();} + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return size() == 0;} + + // element access: + _LIBCPP_INLINE_VISIBILITY + difference_type length(size_type __sub = 0) const + {return (*this)[__sub].length();} + _LIBCPP_INLINE_VISIBILITY + difference_type position(size_type __sub = 0) const + {return _VSTD::distance(__position_start_, (*this)[__sub].first);} + _LIBCPP_INLINE_VISIBILITY + string_type str(size_type __sub = 0) const + {return (*this)[__sub].str();} + _LIBCPP_INLINE_VISIBILITY + const_reference operator[](size_type __n) const + {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;} + + _LIBCPP_INLINE_VISIBILITY + const_reference prefix() const {return __prefix_;} + _LIBCPP_INLINE_VISIBILITY + const_reference suffix() const {return __suffix_;} + + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const {return __matches_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const {return __matches_.end();} + + // format: + template <class _OutputIter> + _OutputIter + format(_OutputIter __out, const char_type* __fmt_first, + const char_type* __fmt_last, + regex_constants::match_flag_type __flags = regex_constants::format_default) const; + template <class _OutputIter, class _ST, class _SA> + _LIBCPP_INLINE_VISIBILITY + _OutputIter + format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::format_default) const + {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);} + template <class _ST, class _SA> + _LIBCPP_INLINE_VISIBILITY + basic_string<char_type, _ST, _SA> + format(const basic_string<char_type, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::format_default) const + { + basic_string<char_type, _ST, _SA> __r; + format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(), + __flags); + return __r; + } + _LIBCPP_INLINE_VISIBILITY + string_type + format(const char_type* __fmt, + regex_constants::match_flag_type __flags = regex_constants::format_default) const + { + string_type __r; + format(back_inserter(__r), __fmt, + __fmt + char_traits<char_type>::length(__fmt), __flags); + return __r; + } + + // allocator: + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const {return __matches_.get_allocator();} + + // swap: + void swap(match_results& __m); + + template <class _Bp, class _Ap> + _LIBCPP_INLINE_VISIBILITY + void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l, + const match_results<_Bp, _Ap>& __m, bool __no_update_pos) + { + _Bp __mf = __m.prefix().first; + __matches_.resize(__m.size()); + for (size_type __i = 0; __i < __matches_.size(); ++__i) + { + __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first)); + __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second)); + __matches_[__i].matched = __m[__i].matched; + } + __unmatched_.first = __l; + __unmatched_.second = __l; + __unmatched_.matched = false; + __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first)); + __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second)); + __prefix_.matched = __m.prefix().matched; + __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first)); + __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second)); + __suffix_.matched = __m.suffix().matched; + if (!__no_update_pos) + __position_start_ = __prefix_.first; + __ready_ = __m.ready(); + } + +private: + void __init(unsigned __s, + _BidirectionalIterator __f, _BidirectionalIterator __l, + bool __no_update_pos = false); + + template <class, class> friend class basic_regex; + + template <class _Bp, class _Ap, class _Cp, class _Tp> + friend + bool + regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&, + regex_constants::match_flag_type); + + template <class _Bp, class _Ap> + friend + bool + operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&); + + template <class, class> friend class __lookahead; +}; + +template <class _BidirectionalIterator, class _Allocator> +match_results<_BidirectionalIterator, _Allocator>::match_results( + const allocator_type& __a) + : __matches_(__a), + __unmatched_(), + __prefix_(), + __suffix_(), + __position_start_(), + __ready_(false) +{ +} + +template <class _BidirectionalIterator, class _Allocator> +void +match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s, + _BidirectionalIterator __f, _BidirectionalIterator __l, + bool __no_update_pos) +{ + __unmatched_.first = __l; + __unmatched_.second = __l; + __unmatched_.matched = false; + __matches_.assign(__s, __unmatched_); + __prefix_.first = __f; + __prefix_.second = __f; + __prefix_.matched = false; + __suffix_ = __unmatched_; + if (!__no_update_pos) + __position_start_ = __prefix_.first; + __ready_ = true; +} + +template <class _BidirectionalIterator, class _Allocator> +template <class _OutputIter> +_OutputIter +match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out, + const char_type* __fmt_first, const char_type* __fmt_last, + regex_constants::match_flag_type __flags) const +{ + if (__flags & regex_constants::format_sed) + { + for (; __fmt_first != __fmt_last; ++__fmt_first) + { + if (*__fmt_first == '&') + __out = _VSTD::copy(__matches_[0].first, __matches_[0].second, + __out); + else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last) + { + ++__fmt_first; + if ('0' <= *__fmt_first && *__fmt_first <= '9') + { + size_t __i = *__fmt_first - '0'; + __out = _VSTD::copy(__matches_[__i].first, + __matches_[__i].second, __out); + } + else + { + *__out = *__fmt_first; + ++__out; + } + } + else + { + *__out = *__fmt_first; + ++__out; + } + } + } + else + { + for (; __fmt_first != __fmt_last; ++__fmt_first) + { + if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last) + { + switch (__fmt_first[1]) + { + case '$': + *__out = *++__fmt_first; + ++__out; + break; + case '&': + ++__fmt_first; + __out = _VSTD::copy(__matches_[0].first, __matches_[0].second, + __out); + break; + case '`': + ++__fmt_first; + __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out); + break; + case '\'': + ++__fmt_first; + __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out); + break; + default: + if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9') + { + ++__fmt_first; + size_t __i = *__fmt_first - '0'; + if (__fmt_first + 1 != __fmt_last && + '0' <= __fmt_first[1] && __fmt_first[1] <= '9') + { + ++__fmt_first; + __i = 10 * __i + *__fmt_first - '0'; + } + __out = _VSTD::copy(__matches_[__i].first, + __matches_[__i].second, __out); + } + else + { + *__out = *__fmt_first; + ++__out; + } + break; + } + } + else + { + *__out = *__fmt_first; + ++__out; + } + } + } + return __out; +} + +template <class _BidirectionalIterator, class _Allocator> +void +match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m) +{ + using _VSTD::swap; + swap(__matches_, __m.__matches_); + swap(__unmatched_, __m.__unmatched_); + swap(__prefix_, __m.__prefix_); + swap(__suffix_, __m.__suffix_); + swap(__position_start_, __m.__position_start_); + swap(__ready_, __m.__ready_); +} + +typedef match_results<const char*> cmatch; +typedef match_results<const wchar_t*> wcmatch; +typedef match_results<string::const_iterator> smatch; +typedef match_results<wstring::const_iterator> wsmatch; + +template <class _BidirectionalIterator, class _Allocator> +bool +operator==(const match_results<_BidirectionalIterator, _Allocator>& __x, + const match_results<_BidirectionalIterator, _Allocator>& __y) +{ + if (__x.__ready_ != __y.__ready_) + return false; + if (!__x.__ready_) + return true; + return __x.__matches_ == __y.__matches_ && + __x.__prefix_ == __y.__prefix_ && + __x.__suffix_ == __y.__suffix_; +} + +template <class _BidirectionalIterator, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x, + const match_results<_BidirectionalIterator, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _BidirectionalIterator, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(match_results<_BidirectionalIterator, _Allocator>& __x, + match_results<_BidirectionalIterator, _Allocator>& __y) +{ + __x.swap(__y); +} + +// regex_search + +template <class _CharT, class _Traits> +template <class _Allocator> +bool +basic_regex<_CharT, _Traits>::__match_at_start_ecma( + const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool __at_first) const +{ + vector<__state> __states; + __node* __st = __start_.get(); + if (__st) + { + __states.push_back(__state()); + __states.back().__do_ = 0; + __states.back().__first_ = __first; + __states.back().__current_ = __first; + __states.back().__last_ = __last; + __states.back().__sub_matches_.resize(mark_count()); + __states.back().__loop_data_.resize(__loop_count()); + __states.back().__node_ = __st; + __states.back().__flags_ = __flags; + __states.back().__at_first_ = __at_first; + do + { + __state& __s = __states.back(); + if (__s.__node_) + __s.__node_->__exec(__s); + switch (__s.__do_) + { + case __state::__end_state: + __m.__matches_[0].first = __first; + __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first); + __m.__matches_[0].matched = true; + for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i) + __m.__matches_[__i+1] = __s.__sub_matches_[__i]; + return true; + case __state::__accept_and_consume: + case __state::__repeat: + case __state::__accept_but_not_consume: + break; + case __state::__split: + { + __state __snext = __s; + __s.__node_->__exec_split(true, __s); + __snext.__node_->__exec_split(false, __snext); + __states.push_back(_VSTD::move(__snext)); + } + break; + case __state::__reject: + __states.pop_back(); + break; + default: +#ifndef _LIBCPP_NO_EXCEPTIONS + throw regex_error(regex_constants::__re_err_unknown); +#endif + break; + + } + } while (!__states.empty()); + } + return false; +} + +template <class _CharT, class _Traits> +template <class _Allocator> +bool +basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs( + const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool __at_first) const +{ + deque<__state> __states; + ptrdiff_t __highest_j = 0; + ptrdiff_t _Np = _VSTD::distance(__first, __last); + __node* __st = __start_.get(); + if (__st) + { + __states.push_back(__state()); + __states.back().__do_ = 0; + __states.back().__first_ = __first; + __states.back().__current_ = __first; + __states.back().__last_ = __last; + __states.back().__loop_data_.resize(__loop_count()); + __states.back().__node_ = __st; + __states.back().__flags_ = __flags; + __states.back().__at_first_ = __at_first; + bool __matched = false; + do + { + __state& __s = __states.back(); + if (__s.__node_) + __s.__node_->__exec(__s); + switch (__s.__do_) + { + case __state::__end_state: + if (!__matched || __highest_j < __s.__current_ - __s.__first_) + __highest_j = __s.__current_ - __s.__first_; + __matched = true; + if (__highest_j == _Np) + __states.clear(); + else + __states.pop_back(); + break; + case __state::__consume_input: + break; + case __state::__accept_and_consume: + __states.push_front(_VSTD::move(__s)); + __states.pop_back(); + break; + case __state::__repeat: + case __state::__accept_but_not_consume: + break; + case __state::__split: + { + __state __snext = __s; + __s.__node_->__exec_split(true, __s); + __snext.__node_->__exec_split(false, __snext); + __states.push_back(_VSTD::move(__snext)); + } + break; + case __state::__reject: + __states.pop_back(); + break; + default: +#ifndef _LIBCPP_NO_EXCEPTIONS + throw regex_error(regex_constants::__re_err_unknown); +#endif + break; + } + } while (!__states.empty()); + if (__matched) + { + __m.__matches_[0].first = __first; + __m.__matches_[0].second = _VSTD::next(__first, __highest_j); + __m.__matches_[0].matched = true; + return true; + } + } + return false; +} + +template <class _CharT, class _Traits> +template <class _Allocator> +bool +basic_regex<_CharT, _Traits>::__match_at_start_posix_subs( + const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool __at_first) const +{ + vector<__state> __states; + __state __best_state; + ptrdiff_t __j = 0; + ptrdiff_t __highest_j = 0; + ptrdiff_t _Np = _VSTD::distance(__first, __last); + __node* __st = __start_.get(); + if (__st) + { + __states.push_back(__state()); + __states.back().__do_ = 0; + __states.back().__first_ = __first; + __states.back().__current_ = __first; + __states.back().__last_ = __last; + __states.back().__sub_matches_.resize(mark_count()); + __states.back().__loop_data_.resize(__loop_count()); + __states.back().__node_ = __st; + __states.back().__flags_ = __flags; + __states.back().__at_first_ = __at_first; + const _CharT* __current = __first; + bool __matched = false; + do + { + __state& __s = __states.back(); + if (__s.__node_) + __s.__node_->__exec(__s); + switch (__s.__do_) + { + case __state::__end_state: + if (!__matched || __highest_j < __s.__current_ - __s.__first_) + { + __highest_j = __s.__current_ - __s.__first_; + __best_state = __s; + } + __matched = true; + if (__highest_j == _Np) + __states.clear(); + else + __states.pop_back(); + break; + case __state::__accept_and_consume: + __j += __s.__current_ - __current; + __current = __s.__current_; + break; + case __state::__repeat: + case __state::__accept_but_not_consume: + break; + case __state::__split: + { + __state __snext = __s; + __s.__node_->__exec_split(true, __s); + __snext.__node_->__exec_split(false, __snext); + __states.push_back(_VSTD::move(__snext)); + } + break; + case __state::__reject: + __states.pop_back(); + break; + default: +#ifndef _LIBCPP_NO_EXCEPTIONS + throw regex_error(regex_constants::__re_err_unknown); +#endif + break; + } + } while (!__states.empty()); + if (__matched) + { + __m.__matches_[0].first = __first; + __m.__matches_[0].second = _VSTD::next(__first, __highest_j); + __m.__matches_[0].matched = true; + for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i) + __m.__matches_[__i+1] = __best_state.__sub_matches_[__i]; + return true; + } + } + return false; +} + +template <class _CharT, class _Traits> +template <class _Allocator> +bool +basic_regex<_CharT, _Traits>::__match_at_start( + const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags, bool __at_first) const +{ + if ((__flags_ & 0x1F0) == ECMAScript) + return __match_at_start_ecma(__first, __last, __m, __flags, __at_first); + if (mark_count() == 0) + return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first); + return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first); +} + +template <class _CharT, class _Traits> +template <class _Allocator> +bool +basic_regex<_CharT, _Traits>::__search( + const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + regex_constants::match_flag_type __flags) const +{ + __m.__init(1 + mark_count(), __first, __last, + __flags & regex_constants::__no_update_pos); + if (__match_at_start(__first, __last, __m, __flags, true)) + { + __m.__prefix_.second = __m[0].first; + __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; + __m.__suffix_.first = __m[0].second; + __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; + return true; + } + if (__first != __last && !(__flags & regex_constants::match_continuous)) + { + __flags |= regex_constants::match_prev_avail; + for (++__first; __first != __last; ++__first) + { + __m.__matches_.assign(__m.size(), __m.__unmatched_); + if (__match_at_start(__first, __last, __m, __flags, false)) + { + __m.__prefix_.second = __m[0].first; + __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second; + __m.__suffix_.first = __m[0].second; + __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second; + return true; + } + __m.__matches_.assign(__m.size(), __m.__unmatched_); + } + } + __m.__matches_.clear(); + return false; +} + +template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last, + match_results<_BidirectionalIterator, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __s(__first, __last); + match_results<const _CharT*> __mc; + bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); + __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos); + return __r; +} + +template <class _Allocator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const _CharT* __first, const _CharT* __last, + match_results<const _CharT*, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return __e.__search(__first, __last, __m, __flags); +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __s(__first, __last); + match_results<const _CharT*> __mc; + return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const _CharT* __first, const _CharT* __last, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + match_results<const _CharT*> __mc; + return __e.__search(__first, __last, __mc, __flags); +} + +template <class _CharT, class _Allocator, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return __e.__search(__str, __str + _Traits::length(__str), __m, __flags); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + match_results<const _CharT*> __m; + return _VSTD::regex_search(__str, __m, __e, __flags); +} + +template <class _ST, class _SA, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + match_results<const _CharT*> __mc; + return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); +} + +template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_search(const basic_string<_CharT, _ST, _SA>& __s, + match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + match_results<const _CharT*> __mc; + bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags); + __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos); + return __r; +} + +// regex_match + +template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits> +bool +regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last, + match_results<_BidirectionalIterator, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + bool __r = _VSTD::regex_search(__first, __last, __m, __e, + __flags | regex_constants::match_continuous); + if (__r) + { + __r = !__m.suffix().matched; + if (!__r) + __m.__matches_.clear(); + } + return __r; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + match_results<_BidirectionalIterator> __m; + return _VSTD::regex_match(__first, __last, __m, __e, __flags); +} + +template <class _CharT, class _Allocator, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags); +} + +template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_match(const basic_string<_CharT, _ST, _SA>& __s, + match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags); +} + +template <class _ST, class _SA, class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +bool +regex_match(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags); +} + +// regex_iterator + +template <class _BidirectionalIterator, + class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, + class _Traits = regex_traits<_CharT> > +class _LIBCPP_VISIBLE regex_iterator +{ +public: + typedef basic_regex<_CharT, _Traits> regex_type; + typedef match_results<_BidirectionalIterator> value_type; + typedef ptrdiff_t difference_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef forward_iterator_tag iterator_category; + +private: + _BidirectionalIterator __begin_; + _BidirectionalIterator __end_; + const regex_type* __pregex_; + regex_constants::match_flag_type __flags_; + value_type __match_; + +public: + regex_iterator(); + regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + regex_constants::match_flag_type __m = regex_constants::match_default); + + bool operator==(const regex_iterator& __x) const; + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const regex_iterator& __x) const {return !(*this == __x);} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return __match_;} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return &__match_;} + + regex_iterator& operator++(); + _LIBCPP_INLINE_VISIBILITY + regex_iterator operator++(int) + { + regex_iterator __t(*this); + ++(*this); + return __t; + } +}; + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator() + : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_() +{ +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, regex_constants::match_flag_type __m) + : __begin_(__a), + __end_(__b), + __pregex_(&__re), + __flags_(__m) +{ + _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_); +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +bool +regex_iterator<_BidirectionalIterator, _CharT, _Traits>:: + operator==(const regex_iterator& __x) const +{ + if (__match_.empty() && __x.__match_.empty()) + return true; + if (__match_.empty() || __x.__match_.empty()) + return false; + return __begin_ == __x.__begin_ && + __end_ == __x.__end_ && + __pregex_ == __x.__pregex_ && + __flags_ == __x.__flags_ && + __match_[0] == __x.__match_[0]; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_iterator<_BidirectionalIterator, _CharT, _Traits>& +regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() +{ + __flags_ |= regex_constants::__no_update_pos; + _BidirectionalIterator __start = __match_[0].second; + if (__match_.length() == 0) + { + if (__start == __end_) + { + __match_ = value_type(); + return *this; + } + else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_, + __flags_ | regex_constants::match_not_null | + regex_constants::match_continuous)) + return *this; + else + ++__start; + } + __flags_ |= regex_constants::match_prev_avail; + if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_)) + __match_ = value_type(); + return *this; +} + +typedef regex_iterator<const char*> cregex_iterator; +typedef regex_iterator<const wchar_t*> wcregex_iterator; +typedef regex_iterator<string::const_iterator> sregex_iterator; +typedef regex_iterator<wstring::const_iterator> wsregex_iterator; + +// regex_token_iterator + +template <class _BidirectionalIterator, + class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type, + class _Traits = regex_traits<_CharT> > +class _LIBCPP_VISIBLE regex_token_iterator +{ +public: + typedef basic_regex<_CharT, _Traits> regex_type; + typedef sub_match<_BidirectionalIterator> value_type; + typedef ptrdiff_t difference_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef forward_iterator_tag iterator_category; + +private: + typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position; + + _Position __position_; + const value_type* __result_; + value_type __suffix_; + ptrdiff_t _N_; + vector<int> __subs_; + +public: + regex_token_iterator(); + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, int __submatch = 0, + regex_constants::match_flag_type __m = + regex_constants::match_default); + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, const vector<int>& __submatches, + regex_constants::match_flag_type __m = + regex_constants::match_default); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + initializer_list<int> __submatches, + regex_constants::match_flag_type __m = + regex_constants::match_default); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + template <size_t _Np> + regex_token_iterator(_BidirectionalIterator __a, + _BidirectionalIterator __b, + const regex_type& __re, + const int (&__submatches)[_Np], + regex_constants::match_flag_type __m = + regex_constants::match_default); + regex_token_iterator(const regex_token_iterator&); + regex_token_iterator& operator=(const regex_token_iterator&); + + bool operator==(const regex_token_iterator& __x) const; + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);} + + _LIBCPP_INLINE_VISIBILITY + const value_type& operator*() const {return *__result_;} + _LIBCPP_INLINE_VISIBILITY + const value_type* operator->() const {return __result_;} + + regex_token_iterator& operator++(); + _LIBCPP_INLINE_VISIBILITY + regex_token_iterator operator++(int) + { + regex_token_iterator __t(*this); + ++(*this); + return __t; + } + +private: + void __init(_BidirectionalIterator __a, _BidirectionalIterator __b); +}; + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator() + : __result_(nullptr), + __suffix_(), + _N_(0) +{ +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +void +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + __init(_BidirectionalIterator __a, _BidirectionalIterator __b) +{ + if (__position_ != _Position()) + { + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else if (__subs_[_N_] == -1) + { + __suffix_.matched = true; + __suffix_.first = __a; + __suffix_.second = __b; + __result_ = &__suffix_; + } + else + __result_ = nullptr; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, int __submatch, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(1, __submatch) +{ + __init(__a, __b); +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, const vector<int>& __submatches, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches) +{ + __init(__a, __b); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + initializer_list<int> __submatches, + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches) +{ + __init(__a, __b); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _BidirectionalIterator, class _CharT, class _Traits> +template <size_t _Np> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b, + const regex_type& __re, + const int (&__submatches)[_Np], + regex_constants::match_flag_type __m) + : __position_(__a, __b, __re, __m), + _N_(0), + __subs_(__submatches, __submatches + _Np) +{ + __init(__a, __b); +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + regex_token_iterator(const regex_token_iterator& __x) + : __position_(__x.__position_), + __result_(__x.__result_), + __suffix_(__x.__suffix_), + _N_(__x._N_), + __subs_(__x.__subs_) +{ + if (__x.__result_ == &__x.__suffix_) + __result_ == &__suffix_; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + operator=(const regex_token_iterator& __x) +{ + if (this != &__x) + { + __position_ = __x.__position_; + if (__x.__result_ == &__x.__suffix_) + __result_ == &__suffix_; + else + __result_ = __x.__result_; + __suffix_ = __x.__suffix_; + _N_ = __x._N_; + __subs_ = __x.__subs_; + } + return *this; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +bool +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>:: + operator==(const regex_token_iterator& __x) const +{ + if (__result_ == nullptr && __x.__result_ == nullptr) + return true; + if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ && + __suffix_ == __x.__suffix_) + return true; + if (__result_ == nullptr || __x.__result_ == nullptr) + return false; + if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_) + return false; + return __position_ == __x.__position_ && _N_ == __x._N_ && + __subs_ == __x.__subs_; +} + +template <class _BidirectionalIterator, class _CharT, class _Traits> +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>& +regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++() +{ + _Position __prev = __position_; + if (__result_ == &__suffix_) + __result_ = nullptr; + else if (_N_ + 1 < __subs_.size()) + { + ++_N_; + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else + { + _N_ = 0; + ++__position_; + if (__position_ != _Position()) + { + if (__subs_[_N_] == -1) + __result_ = &__position_->prefix(); + else + __result_ = &(*__position_)[__subs_[_N_]]; + } + else + { + if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end() + && __prev->suffix().length() != 0) + { + __suffix_.matched = true; + __suffix_.first = __prev->suffix().first; + __suffix_.second = __prev->suffix().second; + __result_ = &__suffix_; + } + else + __result_ = nullptr; + } + } + return *this; +} + +typedef regex_token_iterator<const char*> cregex_token_iterator; +typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; +typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; +typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; + +// regex_replace + +template <class _OutputIterator, class _BidirectionalIterator, + class _Traits, class _CharT> +_OutputIterator +regex_replace(_OutputIterator __out, + _BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter; + _Iter __i(__first, __last, __e, __flags); + _Iter __eof; + if (__i == __eof) + { + if (!(__flags & regex_constants::format_no_copy)) + __out = _VSTD::copy(__first, __last, __out); + } + else + { + sub_match<_BidirectionalIterator> __lm; + for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i) + { + if (!(__flags & regex_constants::format_no_copy)) + __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out); + __out = __i->format(__out, __fmt, __fmt + __len, __flags); + __lm = __i->suffix(); + if (__flags & regex_constants::format_first_only) + break; + } + if (!(__flags & regex_constants::format_no_copy)) + __out = _VSTD::copy(__lm.first, __lm.second, __out); + } + return __out; +} + +template <class _OutputIterator, class _BidirectionalIterator, + class _Traits, class _CharT, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +_OutputIterator +regex_replace(_OutputIterator __out, + _BidirectionalIterator __first, _BidirectionalIterator __last, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags); +} + +template <class _Traits, class _CharT, class _ST, class _SA, class _FST, + class _FSA> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _ST, _SA> +regex_replace(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _FST, _FSA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT, _ST, _SA> __r; + _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, + __fmt.c_str(), __flags); + return __r; +} + +template <class _Traits, class _CharT, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _ST, _SA> +regex_replace(const basic_string<_CharT, _ST, _SA>& __s, + const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT, _ST, _SA> __r; + _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e, + __fmt, __flags); + return __r; +} + +template <class _Traits, class _CharT, class _ST, class _SA> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT> +regex_replace(const _CharT* __s, + const basic_regex<_CharT, _Traits>& __e, + const basic_string<_CharT, _ST, _SA>& __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __r; + _VSTD::regex_replace(back_inserter(__r), __s, + __s + char_traits<_CharT>::length(__s), __e, + __fmt.c_str(), __flags); + return __r; +} + +template <class _Traits, class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT> +regex_replace(const _CharT* __s, + const basic_regex<_CharT, _Traits>& __e, + const _CharT* __fmt, + regex_constants::match_flag_type __flags = regex_constants::match_default) +{ + basic_string<_CharT> __r; + _VSTD::regex_replace(back_inserter(__r), __s, + __s + char_traits<_CharT>::length(__s), __e, + __fmt, __flags); + return __r; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_REGEX diff --git a/contrib/libc++/include/scoped_allocator b/contrib/libc++/include/scoped_allocator new file mode 100644 index 0000000..cd05102 --- /dev/null +++ b/contrib/libc++/include/scoped_allocator @@ -0,0 +1,578 @@ +// -*- C++ -*- +//===-------------------------- scoped_allocator --------------------------===// +// +// 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_SCOPED_ALLOCATOR +#define _LIBCPP_SCOPED_ALLOCATOR + +/* + scoped_allocator synopsis + +namespace std +{ + +template <class OuterAlloc, class... InnerAllocs> +class scoped_allocator_adaptor : public OuterAlloc +{ + typedef allocator_traits<OuterAlloc> OuterTraits; // exposition only + scoped_allocator_adaptor<InnerAllocs...> inner; // exposition only +public: + + typedef OuterAlloc outer_allocator_type; + typedef see below inner_allocator_type; + + typedef typename OuterTraits::value_type value_type; + typedef typename OuterTraits::size_type size_type; + typedef typename OuterTraits::difference_type difference_type; + typedef typename OuterTraits::pointer pointer; + typedef typename OuterTraits::const_pointer const_pointer; + typedef typename OuterTraits::void_pointer void_pointer; + typedef typename OuterTraits::const_void_pointer const_void_pointer; + + typedef see below propagate_on_container_copy_assignment; + typedef see below propagate_on_container_move_assignment; + typedef see below propagate_on_container_swap; + + template <class Tp> + struct rebind + { + typedef scoped_allocator_adaptor< + OuterTraits::template rebind_alloc<Tp>, InnerAllocs...> other; + }; + + scoped_allocator_adaptor(); + template <class OuterA2> + scoped_allocator_adaptor(OuterA2&& outerAlloc, + const InnerAllocs&... innerAllocs) noexcept; + scoped_allocator_adaptor(const scoped_allocator_adaptor& other) noexcept; + scoped_allocator_adaptor(scoped_allocator_adaptor&& other) noexcept; + template <class OuterA2> + scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& other) noexcept; + template <class OuterA2> + scoped_allocator_adaptor(const scoped_allocator_adaptor<OuterA2, InnerAllocs...>&& other) noexcept; + + ~scoped_allocator_adaptor(); + + inner_allocator_type& inner_allocator() noexcept; + const inner_allocator_type& inner_allocator() const noexcept; + + outer_allocator_type& outer_allocator() noexcept; + const outer_allocator_type& outer_allocator() const noexcept; + + pointer allocate(size_type n); + pointer allocate(size_type n, const_void_pointer hint); + void deallocate(pointer p, size_type n) noexcept; + + size_type max_size() const; + template <class T, class... Args> void construct(T* p, Args&& args); + template <class T1, class T2, class... Args1, class... Args2> + void construct(pair<T1, T2>* p, piecewise_construct t, tuple<Args1...> x, + tuple<Args2...> y); + template <class T1, class T2> + void construct(pair<T1, T2>* p); + template <class T1, class T2, class U, class V> + void construct(pair<T1, T2>* p, U&& x, V&& y); + template <class T1, class T2, class U, class V> + void construct(pair<T1, T2>* p, const pair<U, V>& x); + template <class T1, class T2, class U, class V> + void construct(pair<T1, T2>* p, pair<U, V>&& x); + template <class T> void destroy(T* p); + + template <class T> void destroy(T* p) noexcept; + + scoped_allocator_adaptor select_on_container_copy_construction() const noexcept; +}; + +template <class OuterA1, class OuterA2, class... InnerAllocs> + bool + operator==(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a, + const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept; + +template <class OuterA1, class OuterA2, class... InnerAllocs> + bool + operator!=(const scoped_allocator_adaptor<OuterA1, InnerAllocs...>& a, + const scoped_allocator_adaptor<OuterA2, InnerAllocs...>& b) noexcept; + +} // std + +*/ + +#include <__config> +#include <memory> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) + +// scoped_allocator_adaptor + +template <class ..._Allocs> +class scoped_allocator_adaptor; + +template <class ..._Allocs> struct __get_poc_copy_assignment; + +template <class _A0> +struct __get_poc_copy_assignment<_A0> +{ + static const bool value = allocator_traits<_A0>:: + propagate_on_container_copy_assignment::value; +}; + +template <class _A0, class ..._Allocs> +struct __get_poc_copy_assignment<_A0, _Allocs...> +{ + static const bool value = + allocator_traits<_A0>::propagate_on_container_copy_assignment::value || + __get_poc_copy_assignment<_Allocs...>::value; +}; + +template <class ..._Allocs> struct __get_poc_move_assignment; + +template <class _A0> +struct __get_poc_move_assignment<_A0> +{ + static const bool value = allocator_traits<_A0>:: + propagate_on_container_move_assignment::value; +}; + +template <class _A0, class ..._Allocs> +struct __get_poc_move_assignment<_A0, _Allocs...> +{ + static const bool value = + allocator_traits<_A0>::propagate_on_container_move_assignment::value || + __get_poc_move_assignment<_Allocs...>::value; +}; + +template <class ..._Allocs> struct __get_poc_swap; + +template <class _A0> +struct __get_poc_swap<_A0> +{ + static const bool value = allocator_traits<_A0>:: + propagate_on_container_swap::value; +}; + +template <class _A0, class ..._Allocs> +struct __get_poc_swap<_A0, _Allocs...> +{ + static const bool value = + allocator_traits<_A0>::propagate_on_container_swap::value || + __get_poc_swap<_Allocs...>::value; +}; + +template <class ..._Allocs> +class __scoped_allocator_storage; + +template <class _OuterAlloc, class... _InnerAllocs> +class __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> + : public _OuterAlloc +{ + typedef _OuterAlloc outer_allocator_type; +protected: + typedef scoped_allocator_adaptor<_InnerAllocs...> inner_allocator_type; + +private: + inner_allocator_type __inner_; + +protected: + + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage() _NOEXCEPT {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage(_OuterA2&& __outerAlloc, + const _InnerAllocs& ...__innerAllocs) _NOEXCEPT + : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)), + __inner_(__innerAllocs...) {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, const _OuterA2&>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage( + const __scoped_allocator_storage<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT + : outer_allocator_type(__other.outer_allocator()), + __inner_(__other.inner_allocator()) {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage( + __scoped_allocator_storage<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT + : outer_allocator_type(_VSTD::move(__other.outer_allocator())), + __inner_(_VSTD::move(__other.inner_allocator())) {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage(_OuterA2&& __o, + const inner_allocator_type& __i) _NOEXCEPT + : outer_allocator_type(_VSTD::forward<_OuterA2>(__o)), + __inner_(__i) + { + } + + _LIBCPP_INLINE_VISIBILITY + inner_allocator_type& inner_allocator() _NOEXCEPT {return __inner_;} + _LIBCPP_INLINE_VISIBILITY + const inner_allocator_type& inner_allocator() const _NOEXCEPT {return __inner_;} + + _LIBCPP_INLINE_VISIBILITY + outer_allocator_type& outer_allocator() _NOEXCEPT + {return static_cast<outer_allocator_type&>(*this);} + _LIBCPP_INLINE_VISIBILITY + const outer_allocator_type& outer_allocator() const _NOEXCEPT + {return static_cast<const outer_allocator_type&>(*this);} + + scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...> + _LIBCPP_INLINE_VISIBILITY + select_on_container_copy_construction() const _NOEXCEPT + { + return scoped_allocator_adaptor<outer_allocator_type, _InnerAllocs...> + ( + allocator_traits<outer_allocator_type>:: + select_on_container_copy_construction(outer_allocator()), + allocator_traits<inner_allocator_type>:: + select_on_container_copy_construction(inner_allocator()) + ); + } + + template <class...> friend class __scoped_allocator_storage; +}; + +template <class _OuterAlloc> +class __scoped_allocator_storage<_OuterAlloc> + : public _OuterAlloc +{ + typedef _OuterAlloc outer_allocator_type; +protected: + typedef scoped_allocator_adaptor<_OuterAlloc> inner_allocator_type; + + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage() _NOEXCEPT {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage(_OuterA2&& __outerAlloc) _NOEXCEPT + : outer_allocator_type(_VSTD::forward<_OuterA2>(__outerAlloc)) {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, const _OuterA2&>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage( + const __scoped_allocator_storage<_OuterA2>& __other) _NOEXCEPT + : outer_allocator_type(__other.outer_allocator()) {} + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + __scoped_allocator_storage( + __scoped_allocator_storage<_OuterA2>&& __other) _NOEXCEPT + : outer_allocator_type(_VSTD::move(__other.outer_allocator())) {} + + _LIBCPP_INLINE_VISIBILITY + inner_allocator_type& inner_allocator() _NOEXCEPT + {return static_cast<inner_allocator_type&>(*this);} + _LIBCPP_INLINE_VISIBILITY + const inner_allocator_type& inner_allocator() const _NOEXCEPT + {return static_cast<const inner_allocator_type&>(*this);} + + _LIBCPP_INLINE_VISIBILITY + outer_allocator_type& outer_allocator() _NOEXCEPT + {return static_cast<outer_allocator_type&>(*this);} + _LIBCPP_INLINE_VISIBILITY + const outer_allocator_type& outer_allocator() const _NOEXCEPT + {return static_cast<const outer_allocator_type&>(*this);} + + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor<outer_allocator_type> + select_on_container_copy_construction() const _NOEXCEPT + {return scoped_allocator_adaptor<outer_allocator_type>( + allocator_traits<outer_allocator_type>:: + select_on_container_copy_construction(outer_allocator()) + );} + + __scoped_allocator_storage(const outer_allocator_type& __o, + const inner_allocator_type& __i) _NOEXCEPT; + + template <class...> friend class __scoped_allocator_storage; +}; + +// __outermost + +template <class _Alloc> +decltype(declval<_Alloc>().outer_allocator(), true_type()) +__has_outer_allocator_test(_Alloc&& __a); + +template <class _Alloc> +false_type +__has_outer_allocator_test(const volatile _Alloc& __a); + +template <class _Alloc> +struct __has_outer_allocator + : public common_type + < + decltype(__has_outer_allocator_test(declval<_Alloc&>())) + >::type +{ +}; + +template <class _Alloc, bool = __has_outer_allocator<_Alloc>::value> +struct __outermost +{ + typedef _Alloc type; + _LIBCPP_INLINE_VISIBILITY + type& operator()(type& __a) const _NOEXCEPT {return __a;} +}; + +template <class _Alloc> +struct __outermost<_Alloc, true> +{ + typedef typename remove_reference + < + decltype(_VSTD::declval<_Alloc>().outer_allocator()) + >::type _OuterAlloc; + typedef typename __outermost<_OuterAlloc>::type type; + _LIBCPP_INLINE_VISIBILITY + type& operator()(_Alloc& __a) const _NOEXCEPT + {return __outermost<_OuterAlloc>()(__a.outer_allocator());} +}; + +template <class _OuterAlloc, class... _InnerAllocs> +class _LIBCPP_VISIBLE scoped_allocator_adaptor<_OuterAlloc, _InnerAllocs...> + : public __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> +{ + typedef __scoped_allocator_storage<_OuterAlloc, _InnerAllocs...> base; + typedef allocator_traits<_OuterAlloc> _OuterTraits; +public: + typedef _OuterAlloc outer_allocator_type; + typedef typename base::inner_allocator_type inner_allocator_type; + typedef typename _OuterTraits::size_type size_type; + typedef typename _OuterTraits::difference_type difference_type; + typedef typename _OuterTraits::pointer pointer; + typedef typename _OuterTraits::const_pointer const_pointer; + typedef typename _OuterTraits::void_pointer void_pointer; + typedef typename _OuterTraits::const_void_pointer const_void_pointer; + + typedef integral_constant + < + bool, + __get_poc_copy_assignment<outer_allocator_type, + _InnerAllocs...>::value + > propagate_on_container_copy_assignment; + typedef integral_constant + < + bool, + __get_poc_move_assignment<outer_allocator_type, + _InnerAllocs...>::value + > propagate_on_container_move_assignment; + typedef integral_constant + < + bool, + __get_poc_swap<outer_allocator_type, _InnerAllocs...>::value + > propagate_on_container_swap; + + template <class _Tp> + struct rebind + { + typedef scoped_allocator_adaptor + < + typename _OuterTraits::template rebind_alloc<_Tp>, _InnerAllocs... + > other; + }; + + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor() _NOEXCEPT {} + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor(_OuterA2&& __outerAlloc, + const _InnerAllocs& ...__innerAllocs) _NOEXCEPT + : base(_VSTD::forward<_OuterA2>(__outerAlloc), __innerAllocs...) {} + // scoped_allocator_adaptor(const scoped_allocator_adaptor& __other) = default; + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, const _OuterA2&>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor( + const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __other) _NOEXCEPT + : base(__other) {} + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor( + scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>&& __other) _NOEXCEPT + : base(_VSTD::move(__other)) {} + + // ~scoped_allocator_adaptor() = default; + + _LIBCPP_INLINE_VISIBILITY + inner_allocator_type& inner_allocator() _NOEXCEPT + {return base::inner_allocator();} + _LIBCPP_INLINE_VISIBILITY + const inner_allocator_type& inner_allocator() const _NOEXCEPT + {return base::inner_allocator();} + + _LIBCPP_INLINE_VISIBILITY + outer_allocator_type& outer_allocator() _NOEXCEPT + {return base::outer_allocator();} + _LIBCPP_INLINE_VISIBILITY + const outer_allocator_type& outer_allocator() const _NOEXCEPT + {return base::outer_allocator();} + + _LIBCPP_INLINE_VISIBILITY + pointer allocate(size_type __n) + {return allocator_traits<outer_allocator_type>:: + allocate(outer_allocator(), __n);} + _LIBCPP_INLINE_VISIBILITY + pointer allocate(size_type __n, const_void_pointer __hint) + {return allocator_traits<outer_allocator_type>:: + allocate(outer_allocator(), __n, __hint);} + + _LIBCPP_INLINE_VISIBILITY + void deallocate(pointer __p, size_type __n) _NOEXCEPT + {allocator_traits<outer_allocator_type>:: + deallocate(outer_allocator(), __p, __n);} + + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const + {return allocator_traits<outer_allocator_type>::max_size(outer_allocator());} + + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void construct(_Tp* __p, _Args&& ...__args) + {__construct(__uses_alloc_ctor<_Tp, inner_allocator_type, _Args...>(), + __p, _VSTD::forward<_Args>(__args)...);} + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + void destroy(_Tp* __p) + { + typedef __outermost<outer_allocator_type> _OM; + allocator_traits<typename _OM::type>:: + destroy(_OM()(outer_allocator()), __p); + } + + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor select_on_container_copy_construction() const _NOEXCEPT + {return base::select_on_container_copy_construction();} + +private: + + template <class _OuterA2, + class = typename enable_if< + is_constructible<outer_allocator_type, _OuterA2>::value + >::type> + _LIBCPP_INLINE_VISIBILITY + scoped_allocator_adaptor(_OuterA2&& __o, + const inner_allocator_type& __i) _NOEXCEPT + : base(_VSTD::forward<_OuterA2>(__o), __i) {} + + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void __construct(integral_constant<int, 0>, _Tp* __p, _Args&& ...__args) + { + typedef __outermost<outer_allocator_type> _OM; + allocator_traits<typename _OM::type>::construct + ( + _OM()(outer_allocator()), + __p, + _VSTD::forward<_Args>(__args)... + ); + } + + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void __construct(integral_constant<int, 1>, _Tp* __p, _Args&& ...__args) + { + typedef __outermost<outer_allocator_type> _OM; + allocator_traits<typename _OM::type>::construct + ( + _OM()(outer_allocator()), + __p, + allocator_arg, + inner_allocator(), + _VSTD::forward<_Args>(__args)... + ); + } + + template <class _Tp, class... _Args> + _LIBCPP_INLINE_VISIBILITY + void __construct(integral_constant<int, 2>, _Tp* __p, _Args&& ...__args) + { + typedef __outermost<outer_allocator_type> _OM; + allocator_traits<typename _OM::type>::construct + ( + _OM()(outer_allocator()), + __p, + _VSTD::forward<_Args>(__args)..., + inner_allocator() + ); + } + + template <class...> friend class __scoped_allocator_storage; +}; + +template <class _OuterA1, class _OuterA2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const scoped_allocator_adaptor<_OuterA1>& __a, + const scoped_allocator_adaptor<_OuterA2>& __b) _NOEXCEPT +{ + return __a.outer_allocator() == __b.outer_allocator(); +} + +template <class _OuterA1, class _OuterA2, class _InnerA0, class... _InnerAllocs> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const scoped_allocator_adaptor<_OuterA1, _InnerA0, _InnerAllocs...>& __a, + const scoped_allocator_adaptor<_OuterA2, _InnerA0, _InnerAllocs...>& __b) _NOEXCEPT +{ + return __a.outer_allocator() == __b.outer_allocator() && + __a.inner_allocator() == __b.inner_allocator(); +} + +template <class _OuterA1, class _OuterA2, class... _InnerAllocs> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const scoped_allocator_adaptor<_OuterA1, _InnerAllocs...>& __a, + const scoped_allocator_adaptor<_OuterA2, _InnerAllocs...>& __b) _NOEXCEPT +{ + return !(__a == __b); +} + +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_ADVANCED_SFINAE) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_SCOPED_ALLOCATOR diff --git a/contrib/libc++/include/set b/contrib/libc++/include/set new file mode 100644 index 0000000..36d3dd4 --- /dev/null +++ b/contrib/libc++/include/set @@ -0,0 +1,1025 @@ +// -*- C++ -*- +//===---------------------------- set -------------------------------------===// +// +// 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_SET +#define _LIBCPP_SET + +/* + + set synopsis + +namespace std +{ + +template <class Key, class Compare = less<Key>, + class Allocator = allocator<Key>> +class set +{ +public: + // types: + typedef Key key_type; + typedef key_type value_type; + typedef Compare key_compare; + typedef key_compare value_compare; + typedef Allocator allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + 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 implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + // construct/copy/destroy: + set() + noexcept( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value); + explicit set(const value_compare& comp); + set(const value_compare& comp, const allocator_type& a); + template <class InputIterator> + set(InputIterator first, InputIterator last, + const value_compare& comp = value_compare()); + template <class InputIterator> + set(InputIterator first, InputIterator last, const value_compare& comp, + const allocator_type& a); + set(const set& s); + set(set&& s) + noexcept( + is_nothrow_move_constructible<allocator_type>::value && + is_nothrow_move_constructible<key_compare>::value); + explicit set(const allocator_type& a); + set(const set& s, const allocator_type& a); + set(set&& s, const allocator_type& a); + set(initializer_list<value_type> il, const value_compare& comp = value_compare()); + set(initializer_list<value_type> il, const value_compare& comp, + const allocator_type& a); + ~set(); + + set& operator=(const set& s); + set& operator=(set&& s) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<key_compare>::value); + set& operator=(initializer_list<value_type> il); + + // iterators: + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + // modifiers: + template <class... Args> + pair<iterator, bool> emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + pair<iterator,bool> insert(const value_type& v); + pair<iterator,bool> insert(value_type&& v); + iterator insert(const_iterator position, const value_type& v); + iterator insert(const_iterator position, value_type&& v); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type> il); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(set& s) + noexcept( + __is_nothrow_swappable<key_compare>::value && + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value)); + + // observers: + allocator_type get_allocator() const noexcept; + key_compare key_comp() const; + value_compare value_comp() const; + + // set operations: + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + iterator lower_bound(const key_type& k); + const_iterator lower_bound(const key_type& k) const; + iterator upper_bound(const key_type& k); + const_iterator upper_bound(const key_type& k) const; + pair<iterator,iterator> equal_range(const key_type& k); + pair<const_iterator,const_iterator> equal_range(const key_type& k) const; +}; + +template <class Key, class Compare, class Allocator> +bool +operator==(const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator< (const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator!=(const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator> (const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator>=(const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator<=(const set<Key, Compare, Allocator>& x, + const set<Key, Compare, Allocator>& y); + +// specialized algorithms: +template <class Key, class Compare, class Allocator> +void +swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y) + noexcept(noexcept(x.swap(y))); + +template <class Key, class Compare = less<Key>, + class Allocator = allocator<Key>> +class multiset +{ +public: + // types: + typedef Key key_type; + typedef key_type value_type; + typedef Compare key_compare; + typedef key_compare value_compare; + typedef Allocator allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + 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 implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + // construct/copy/destroy: + multiset() + noexcept( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value); + explicit multiset(const value_compare& comp); + multiset(const value_compare& comp, const allocator_type& a); + template <class InputIterator> + multiset(InputIterator first, InputIterator last, + const value_compare& comp = value_compare()); + template <class InputIterator> + multiset(InputIterator first, InputIterator last, + const value_compare& comp, const allocator_type& a); + multiset(const multiset& s); + multiset(multiset&& s) + noexcept( + is_nothrow_move_constructible<allocator_type>::value && + is_nothrow_move_constructible<key_compare>::value); + explicit multiset(const allocator_type& a); + multiset(const multiset& s, const allocator_type& a); + multiset(multiset&& s, const allocator_type& a); + multiset(initializer_list<value_type> il, const value_compare& comp = value_compare()); + multiset(initializer_list<value_type> il, const value_compare& comp, + const allocator_type& a); + ~multiset(); + + multiset& operator=(const multiset& s); + multiset& operator=(multiset&& s) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<key_compare>::value); + multiset& operator=(initializer_list<value_type> il); + + // iterators: + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + // capacity: + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + // modifiers: + template <class... Args> + iterator emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + iterator insert(const value_type& v); + iterator insert(value_type&& v); + iterator insert(const_iterator position, const value_type& v); + iterator insert(const_iterator position, value_type&& v); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type> il); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(multiset& s) + noexcept( + __is_nothrow_swappable<key_compare>::value && + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value)); + + // observers: + allocator_type get_allocator() const noexcept; + key_compare key_comp() const; + value_compare value_comp() const; + + // set operations: + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + iterator lower_bound(const key_type& k); + const_iterator lower_bound(const key_type& k) const; + iterator upper_bound(const key_type& k); + const_iterator upper_bound(const key_type& k) const; + pair<iterator,iterator> equal_range(const key_type& k); + pair<const_iterator,const_iterator> equal_range(const key_type& k) const; +}; + +template <class Key, class Compare, class Allocator> +bool +operator==(const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator< (const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator!=(const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator> (const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator>=(const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +template <class Key, class Compare, class Allocator> +bool +operator<=(const multiset<Key, Compare, Allocator>& x, + const multiset<Key, Compare, Allocator>& y); + +// specialized algorithms: +template <class Key, class Compare, class Allocator> +void +swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> +#include <__tree> +#include <functional> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Key, class _Compare = less<_Key>, + class _Allocator = allocator<_Key> > +class _LIBCPP_VISIBLE set +{ +public: + // types: + typedef _Key key_type; + typedef key_type value_type; + typedef _Compare key_compare; + typedef key_compare value_compare; + typedef _Allocator allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __tree<value_type, value_compare, allocator_type> __base; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __base::__node_holder __node_holder; + + __base __tree_; + +public: + typedef typename __base::pointer pointer; + typedef typename __base::const_pointer const_pointer; + typedef typename __base::size_type size_type; + typedef typename __base::difference_type difference_type; + typedef typename __base::const_iterator iterator; + typedef typename __base::const_iterator const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + _LIBCPP_INLINE_VISIBILITY + explicit set(const value_compare& __comp = value_compare()) + _NOEXCEPT_( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value) + : __tree_(__comp) {} + _LIBCPP_INLINE_VISIBILITY + set(const value_compare& __comp, const allocator_type& __a) + : __tree_(__comp, __a) {} + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + set(_InputIterator __f, _InputIterator __l, + const value_compare& __comp = value_compare()) + : __tree_(__comp) + { + insert(__f, __l); + } + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + set(_InputIterator __f, _InputIterator __l, const value_compare& __comp, + const allocator_type& __a) + : __tree_(__comp, __a) + { + insert(__f, __l); + } + + _LIBCPP_INLINE_VISIBILITY + set(const set& __s) + : __tree_(__s.__tree_) + { + insert(__s.begin(), __s.end()); + } + + _LIBCPP_INLINE_VISIBILITY + set& operator=(const set& __s) + { + __tree_ = __s.__tree_; + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + set(set&& __s) + _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) + : __tree_(_VSTD::move(__s.__tree_)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + explicit set(const allocator_type& __a) + : __tree_(__a) {} + + _LIBCPP_INLINE_VISIBILITY + set(const set& __s, const allocator_type& __a) + : __tree_(__s.__tree_.value_comp(), __a) + { + insert(__s.begin(), __s.end()); + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + set(set&& __s, const allocator_type& __a); +#endif + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + set(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) + : __tree_(__comp) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + set(initializer_list<value_type> __il, const value_compare& __comp, + const allocator_type& __a) + : __tree_(__comp, __a) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + set& operator=(initializer_list<value_type> __il) + { + __tree_.__assign_unique(__il.begin(), __il.end()); + return *this; + } +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + set& operator=(set&& __s) + _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) + { + __tree_ = _VSTD::move(__s.__tree_); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __tree_.end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT {return rend();} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __tree_.max_size();} + + // modifiers: +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> emplace(_Args&&... __args) + {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p, _Args&&... __args) + {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);} +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + pair<iterator,bool> insert(const value_type& __v) + {return __tree_.__insert_unique(__v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + pair<iterator,bool> insert(value_type&& __v) + {return __tree_.__insert_unique(_VSTD::move(__v));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, const value_type& __v) + {return __tree_.__insert_unique(__p, __v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, value_type&& __v) + {return __tree_.__insert_unique(__p, _VSTD::move(__v));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + void insert(_InputIterator __f, _InputIterator __l) + { + for (const_iterator __e = cend(); __f != __l; ++__f) + __tree_.__insert_unique(__e, *__f); + } + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __tree_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) + {return __tree_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __f, const_iterator __l) + {return __tree_.erase(__f, __l);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__tree_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value) + {__tree_.swap(__s.__tree_);} + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY + key_compare key_comp() const {return __tree_.value_comp();} + _LIBCPP_INLINE_VISIBILITY + value_compare value_comp() const {return __tree_.value_comp();} + + // set operations: + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const + {return __tree_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator lower_bound(const key_type& __k) + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator lower_bound(const key_type& __k) const + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator upper_bound(const key_type& __k) + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator upper_bound(const key_type& __k) const + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator,iterator> equal_range(const key_type& __k) + {return __tree_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator,const_iterator> equal_range(const key_type& __k) const + {return __tree_.__equal_range_unique(__k);} +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Compare, class _Allocator> +set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a) + : __tree_(_VSTD::move(__s.__tree_), __a) +{ + if (__a != __s.get_allocator()) + { + const_iterator __e = cend(); + while (!__s.empty()) + insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_)); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const set<_Key, _Compare, _Allocator>& __x, + const set<_Key, _Compare, _Allocator>& __y) +{ + return !(__y < __x); +} + +// specialized algorithms: +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(set<_Key, _Compare, _Allocator>& __x, + set<_Key, _Compare, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Key, class _Compare = less<_Key>, + class _Allocator = allocator<_Key> > +class _LIBCPP_VISIBLE multiset +{ +public: + // types: + typedef _Key key_type; + typedef key_type value_type; + typedef _Compare key_compare; + typedef key_compare value_compare; + typedef _Allocator allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __tree<value_type, value_compare, allocator_type> __base; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __base::__node_holder __node_holder; + + __base __tree_; + +public: + typedef typename __base::pointer pointer; + typedef typename __base::const_pointer const_pointer; + typedef typename __base::size_type size_type; + typedef typename __base::difference_type difference_type; + typedef typename __base::const_iterator iterator; + typedef typename __base::const_iterator const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + explicit multiset(const value_compare& __comp = value_compare()) + _NOEXCEPT_( + is_nothrow_default_constructible<allocator_type>::value && + is_nothrow_default_constructible<key_compare>::value && + is_nothrow_copy_constructible<key_compare>::value) + : __tree_(__comp) {} + _LIBCPP_INLINE_VISIBILITY + multiset(const value_compare& __comp, const allocator_type& __a) + : __tree_(__comp, __a) {} + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + multiset(_InputIterator __f, _InputIterator __l, + const value_compare& __comp = value_compare()) + : __tree_(__comp) + { + insert(__f, __l); + } + + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + multiset(_InputIterator __f, _InputIterator __l, + const value_compare& __comp, const allocator_type& __a) + : __tree_(__comp, __a) + { + insert(__f, __l); + } + + _LIBCPP_INLINE_VISIBILITY + multiset(const multiset& __s) + : __tree_(__s.__tree_.value_comp(), + __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc())) + { + insert(__s.begin(), __s.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multiset& operator=(const multiset& __s) + { + __tree_ = __s.__tree_; + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + multiset(multiset&& __s) + _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) + : __tree_(_VSTD::move(__s.__tree_)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit multiset(const allocator_type& __a) + : __tree_(__a) {} + _LIBCPP_INLINE_VISIBILITY + multiset(const multiset& __s, const allocator_type& __a) + : __tree_(__s.__tree_.value_comp(), __a) + { + insert(__s.begin(), __s.end()); + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + multiset(multiset&& __s, const allocator_type& __a); +#endif + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) + : __tree_(__comp) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multiset(initializer_list<value_type> __il, const value_compare& __comp, + const allocator_type& __a) + : __tree_(__comp, __a) + { + insert(__il.begin(), __il.end()); + } + + _LIBCPP_INLINE_VISIBILITY + multiset& operator=(initializer_list<value_type> __il) + { + __tree_.__assign_multi(__il.begin(), __il.end()); + return *this; + } +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + multiset& operator=(multiset&& __s) + _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) + { + __tree_ = _VSTD::move(__s.__tree_); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __tree_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __tree_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __tree_.end();} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT {return rend();} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __tree_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __tree_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __tree_.max_size();} + + // modifiers: +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace(_Args&&... __args) + {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p, _Args&&... __args) + {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __v) + {return __tree_.__insert_multi(__v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(value_type&& __v) + {return __tree_.__insert_multi(_VSTD::move(__v));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, const value_type& __v) + {return __tree_.__insert_multi(__p, __v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, value_type&& __v) + {return __tree_.__insert_multi(_VSTD::move(__v));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + void insert(_InputIterator __f, _InputIterator __l) + { + for (const_iterator __e = cend(); __f != __l; ++__f) + __tree_.__insert_multi(__e, *__f); + } + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __tree_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __f, const_iterator __l) + {return __tree_.erase(__f, __l);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__tree_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(multiset& __s) + _NOEXCEPT_(__is_nothrow_swappable<__base>::value) + {__tree_.swap(__s.__tree_);} + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} + _LIBCPP_INLINE_VISIBILITY + key_compare key_comp() const {return __tree_.value_comp();} + _LIBCPP_INLINE_VISIBILITY + value_compare value_comp() const {return __tree_.value_comp();} + + // set operations: + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __tree_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const + {return __tree_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator lower_bound(const key_type& __k) + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator lower_bound(const key_type& __k) const + {return __tree_.lower_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator upper_bound(const key_type& __k) + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator upper_bound(const key_type& __k) const + {return __tree_.upper_bound(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator,iterator> equal_range(const key_type& __k) + {return __tree_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator,const_iterator> equal_range(const key_type& __k) const + {return __tree_.__equal_range_multi(__k);} +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Compare, class _Allocator> +multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a) + : __tree_(_VSTD::move(__s.__tree_), __a) +{ + if (__a != __s.get_allocator()) + { + const_iterator __e = cend(); + while (!__s.empty()) + insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_)); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const multiset<_Key, _Compare, _Allocator>& __x, + const multiset<_Key, _Compare, _Allocator>& __y) +{ + return !(__y < __x); +} + +template <class _Key, class _Compare, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(multiset<_Key, _Compare, _Allocator>& __x, + multiset<_Key, _Compare, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_SET diff --git a/contrib/libc++/include/sstream b/contrib/libc++/include/sstream new file mode 100644 index 0000000..22450f0 --- /dev/null +++ b/contrib/libc++/include/sstream @@ -0,0 +1,888 @@ +// -*- C++ -*- +//===--------------------------- sstream ----------------------------------===// +// +// 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_SSTREAM +#define _LIBCPP_SSTREAM + +/* + sstream synopsis + +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > +class basic_stringbuf + : public basic_streambuf<charT, traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef Allocator allocator_type; + + // 27.8.1.1 Constructors: + explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); + explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str, + ios_base::openmode which = ios_base::in | ios_base::out); + basic_stringbuf(basic_stringbuf&& rhs); + + // 27.8.1.2 Assign and swap: + basic_stringbuf& operator=(basic_stringbuf&& rhs); + void swap(basic_stringbuf& rhs); + + // 27.8.1.3 Get and set: + basic_string<char_type, traits_type, allocator_type> str() const; + void str(const basic_string<char_type, traits_type, allocator_type>& s); + +protected: + // 27.8.1.4 Overridden virtual functions: + virtual int_type underflow(); + virtual int_type pbackfail(int_type c = traits_type::eof()); + virtual int_type overflow (int_type c = traits_type::eof()); + virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize); + virtual pos_type seekoff(off_type off, ios_base::seekdir way, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type sp, + ios_base::openmode which = ios_base::in | ios_base::out); +}; + +template <class charT, class traits, class Allocator> + void swap(basic_stringbuf<charT, traits, Allocator>& x, + basic_stringbuf<charT, traits, Allocator>& y); + +typedef basic_stringbuf<char> stringbuf; +typedef basic_stringbuf<wchar_t> wstringbuf; + +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > +class basic_istringstream + : public basic_istream<charT, traits> +{ +public: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef Allocator allocator_type; + + // 27.8.2.1 Constructors: + explicit basic_istringstream(ios_base::openmode which = ios_base::in); + explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str, + ios_base::openmode which = ios_base::in); + basic_istringstream(basic_istringstream&& rhs); + + // 27.8.2.2 Assign and swap: + basic_istringstream& operator=(basic_istringstream&& rhs); + void swap(basic_istringstream& rhs); + + // 27.8.2.3 Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + basic_string<char_type, traits_type, allocator_type> str() const; + void str(const basic_string<char_type, traits_type, allocator_type>& s); +}; + +template <class charT, class traits, class Allocator> + void swap(basic_istringstream<charT, traits, Allocator>& x, + basic_istringstream<charT, traits, Allocator>& y); + +typedef basic_istringstream<char> istringstream; +typedef basic_istringstream<wchar_t> wistringstream; + +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > +class basic_ostringstream + : public basic_ostream<charT, traits> +{ +public: + // types: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef Allocator allocator_type; + + // 27.8.3.1 Constructors/destructor: + explicit basic_ostringstream(ios_base::openmode which = ios_base::out); + explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str, + ios_base::openmode which = ios_base::out); + basic_ostringstream(basic_ostringstream&& rhs); + + // 27.8.3.2 Assign/swap: + basic_ostringstream& operator=(basic_ostringstream&& rhs); + void swap(basic_ostringstream& rhs); + + // 27.8.3.3 Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + basic_string<char_type, traits_type, allocator_type> str() const; + void str(const basic_string<char_type, traits_type, allocator_type>& s); +}; + +template <class charT, class traits, class Allocator> + void swap(basic_ostringstream<charT, traits, Allocator>& x, + basic_ostringstream<charT, traits, Allocator>& y); + +typedef basic_ostringstream<char> ostringstream; +typedef basic_ostringstream<wchar_t> wostringstream; + +template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > +class basic_stringstream + : public basic_iostream<charT, traits> +{ +public: + // types: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef Allocator allocator_type; + + // constructors/destructor + explicit basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in); + explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str, + ios_base::openmode which = ios_base::out|ios_base::in); + basic_stringstream(basic_stringstream&& rhs); + + // 27.8.5.1 Assign/swap: + basic_stringstream& operator=(basic_stringstream&& rhs); + void swap(basic_stringstream& rhs); + + // Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + basic_string<char_type, traits_type, allocator_type> str() const; + void str(const basic_string<char_type, traits_type, allocator_type>& str); +}; + +template <class charT, class traits, class Allocator> + void swap(basic_stringstream<charT, traits, Allocator>& x, + basic_stringstream<charT, traits, Allocator>& y); + +typedef basic_stringstream<char> stringstream; +typedef basic_stringstream<wchar_t> wstringstream; + +} // std + +*/ + +#include <__config> +#include <ostream> +#include <istream> +#include <string> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// basic_stringbuf + +template <class _CharT, class _Traits, class _Allocator> +class _LIBCPP_VISIBLE basic_stringbuf + : public basic_streambuf<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef _Allocator allocator_type; + + typedef basic_string<char_type, traits_type, allocator_type> string_type; + +private: + + string_type __str_; + mutable char_type* __hm_; + ios_base::openmode __mode_; + +public: + // 27.8.1.1 Constructors: + explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out); + explicit basic_stringbuf(const string_type& __s, + ios_base::openmode __wch = ios_base::in | ios_base::out); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_stringbuf(basic_stringbuf&& __rhs); +#endif + + // 27.8.1.2 Assign and swap: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_stringbuf& operator=(basic_stringbuf&& __rhs); +#endif + void swap(basic_stringbuf& __rhs); + + // 27.8.1.3 Get and set: + string_type str() const; + void str(const string_type& __s); + +protected: + // 27.8.1.4 Overridden virtual functions: + virtual int_type underflow(); + virtual int_type pbackfail(int_type __c = traits_type::eof()); + virtual int_type overflow (int_type __c = traits_type::eof()); + virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __wch = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type __sp, + ios_base::openmode __wch = ios_base::in | ios_base::out); +}; + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode __wch) + : __hm_(0), + __mode_(__wch) +{ + str(string_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(const string_type& __s, + ios_base::openmode __wch) + : __hm_(0), + __mode_(__wch) +{ + str(__s); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(basic_stringbuf&& __rhs) + : __mode_(__rhs.__mode_) +{ + ptrdiff_t __ninp = __rhs.gptr() - __rhs.eback(); + ptrdiff_t __einp = __rhs.egptr() - __rhs.eback(); + ptrdiff_t __nout = __rhs.pptr() - __rhs.pbase(); + ptrdiff_t __eout = __rhs.epptr() - __rhs.pbase(); + ptrdiff_t __hm = __rhs.__hm_ - __rhs.pbase(); + __str_ = _VSTD::move(__rhs.__str_); + char_type* __p = const_cast<char_type*>(__str_.data()); + this->setg(__p, __p + __ninp, __p + __einp); + this->setp(__p, __p + __eout); + this->pbump(__nout); + __hm_ = __p + __hm; + __p = const_cast<char_type*>(__rhs.__str_.data()); + __rhs.setg(__p, __p, __p); + __rhs.setp(__p, __p); + __rhs.__hm_ = __p; + this->pubimbue(__rhs.getloc()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_stringbuf<_CharT, _Traits, _Allocator>& +basic_stringbuf<_CharT, _Traits, _Allocator>::operator=(basic_stringbuf&& __rhs) +{ + ptrdiff_t __ninp = __rhs.gptr() - __rhs.eback(); + ptrdiff_t __einp = __rhs.egptr() - __rhs.eback(); + ptrdiff_t __nout = __rhs.pptr() - __rhs.pbase(); + ptrdiff_t __eout = __rhs.epptr() - __rhs.pbase(); + ptrdiff_t __hm = __rhs.__hm_ - __rhs.pbase(); + __mode_ = __rhs.__mode_; + __str_ = _VSTD::move(__rhs.__str_); + char_type* __p = const_cast<char_type*>(__str_.data()); + this->setg(__p, __p + __ninp, __p + __einp); + this->setp(__p, __p + __eout); + this->pbump(__nout); + __hm_ = __p + __hm; + __p = const_cast<char_type*>(__rhs.__str_.data()); + __rhs.setg(__p, __p, __p); + __rhs.setp(__p, __p); + __rhs.__hm_ = __p; + this->pubimbue(__rhs.getloc()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +void +basic_stringbuf<_CharT, _Traits, _Allocator>::swap(basic_stringbuf& __rhs) +{ + ptrdiff_t __rninp = __rhs.gptr() - __rhs.eback(); + ptrdiff_t __reinp = __rhs.egptr() - __rhs.eback(); + ptrdiff_t __rnout = __rhs.pptr() - __rhs.pbase(); + ptrdiff_t __reout = __rhs.epptr() - __rhs.pbase(); + ptrdiff_t __rhm = __rhs.__hm_ - __rhs.pbase(); + ptrdiff_t __lninp = this->gptr() - this->eback(); + ptrdiff_t __leinp = this->egptr() - this->eback(); + ptrdiff_t __lnout = this->pptr() - this->pbase(); + ptrdiff_t __leout = this->epptr() - this->pbase(); + ptrdiff_t __lhm = this->__hm_ - this->pbase(); + _VSTD::swap(__mode_, __rhs.__mode_); + __str_.swap(__rhs.__str_); + char_type* __p = const_cast<char_type*>(__str_.data()); + this->setg(__p, __p + __rninp, __p + __reinp); + this->setp(__p, __p + __reout); + this->pbump(__rnout); + __hm_ = __p + __rhm; + __p = const_cast<char_type*>(__rhs.__str_.data()); + __rhs.setg(__p, __p + __lninp, __p + __leinp); + __rhs.setp(__p, __p + __leout); + __rhs.pbump(__lnout); + __rhs.__hm_ = __p + __lhm; + locale __tl = __rhs.getloc(); + __rhs.pubimbue(this->getloc()); + this->pubimbue(__tl); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_stringbuf<_CharT, _Traits, _Allocator>& __x, + basic_stringbuf<_CharT, _Traits, _Allocator>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +basic_stringbuf<_CharT, _Traits, _Allocator>::str() const +{ + if (__mode_ & ios_base::out) + { + if (__hm_ < this->pptr()) + __hm_ = this->pptr(); + return string_type(this->pbase(), __hm_, __str_.get_allocator()); + } + else if (__mode_ & ios_base::in) + return string_type(this->eback(), this->egptr(), __str_.get_allocator()); + return string_type(__str_.get_allocator()); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_stringbuf<_CharT, _Traits, _Allocator>::str(const string_type& __s) +{ + __str_ = __s; + __hm_ = 0; + if (__mode_ & ios_base::in) + { + __hm_ = const_cast<char_type*>(__str_.data()) + __str_.size(); + this->setg(const_cast<char_type*>(__str_.data()), + const_cast<char_type*>(__str_.data()), + __hm_); + } + if (__mode_ & ios_base::out) + { + typename string_type::size_type __sz = __str_.size(); + __hm_ = const_cast<char_type*>(__str_.data()) + __sz; + __str_.resize(__str_.capacity()); + this->setp(const_cast<char_type*>(__str_.data()), + const_cast<char_type*>(__str_.data()) + __str_.size()); + if (__mode_ & (ios_base::app | ios_base::ate)) + this->pbump(__sz); + } +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type +basic_stringbuf<_CharT, _Traits, _Allocator>::underflow() +{ + if (__hm_ < this->pptr()) + __hm_ = this->pptr(); + if (__mode_ & ios_base::in) + { + if (this->egptr() < __hm_) + this->setg(this->eback(), this->gptr(), __hm_); + if (this->gptr() < this->egptr()) + return traits_type::to_int_type(*this->gptr()); + } + return traits_type::eof(); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type +basic_stringbuf<_CharT, _Traits, _Allocator>::pbackfail(int_type __c) +{ + if (__hm_ < this->pptr()) + __hm_ = this->pptr(); + if (this->eback() < this->gptr()) + { + if (traits_type::eq_int_type(__c, traits_type::eof())) + { + this->setg(this->eback(), this->gptr()-1, __hm_); + return traits_type::not_eof(__c); + } + if ((__mode_ & ios_base::out) || + traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1])) + { + this->setg(this->eback(), this->gptr()-1, __hm_); + *this->gptr() = traits_type::to_char_type(__c); + return __c; + } + } + return traits_type::eof(); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_stringbuf<_CharT, _Traits, _Allocator>::int_type +basic_stringbuf<_CharT, _Traits, _Allocator>::overflow(int_type __c) +{ + if (!traits_type::eq_int_type(__c, traits_type::eof())) + { + ptrdiff_t __ninp = this->gptr() - this->eback(); + if (this->pptr() == this->epptr()) + { + if (!(__mode_ & ios_base::out)) + return traits_type::eof(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + ptrdiff_t __nout = this->pptr() - this->pbase(); + ptrdiff_t __hm = __hm_ - this->pbase(); + __str_.push_back(char_type()); + __str_.resize(__str_.capacity()); + char_type* __p = const_cast<char_type*>(__str_.data()); + this->setp(__p, __p + __str_.size()); + this->pbump(__nout); + __hm_ = this->pbase() + __hm; +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + return traits_type::eof(); + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + __hm_ = _VSTD::max(this->pptr() + 1, __hm_); + if (__mode_ & ios_base::in) + { + char_type* __p = const_cast<char_type*>(__str_.data()); + this->setg(__p, __p + __ninp, __hm_); + } + return this->sputc(__c); + } + return traits_type::not_eof(__c); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type +basic_stringbuf<_CharT, _Traits, _Allocator>::seekoff(off_type __off, + ios_base::seekdir __way, + ios_base::openmode __wch) +{ + if (__hm_ < this->pptr()) + __hm_ = this->pptr(); + if ((__wch & (ios_base::in | ios_base::out)) == 0) + return pos_type(-1); + if ((__wch & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) + && __way == ios_base::cur) + return pos_type(-1); + off_type __noff; + switch (__way) + { + case ios_base::beg: + __noff = 0; + break; + case ios_base::cur: + if (__wch & ios_base::in) + __noff = this->gptr() - this->eback(); + else + __noff = this->pptr() - this->pbase(); + break; + case ios_base::end: + __noff = __hm_ - __str_.data(); + break; + default: + return pos_type(-1); + } + __noff += __off; + if (__noff < 0 || __hm_ - __str_.data() < __noff) + return pos_type(-1); + if (__noff != 0) + { + if ((__wch & ios_base::in) && this->gptr() == 0) + return pos_type(-1); + if ((__wch & ios_base::out) && this->pptr() == 0) + return pos_type(-1); + } + if (__wch & ios_base::in) + this->setg(this->eback(), this->eback() + __noff, __hm_); + if (__wch & ios_base::out) + { + this->setp(this->pbase(), this->epptr()); + this->pbump(__noff); + } + return pos_type(__noff); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_stringbuf<_CharT, _Traits, _Allocator>::pos_type +basic_stringbuf<_CharT, _Traits, _Allocator>::seekpos(pos_type __sp, + ios_base::openmode __wch) +{ + return seekoff(__sp, ios_base::beg, __wch); +} + +// basic_istringstream + +template <class _CharT, class _Traits, class _Allocator> +class _LIBCPP_VISIBLE basic_istringstream + : public basic_istream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef _Allocator allocator_type; + + typedef basic_string<char_type, traits_type, allocator_type> string_type; + +private: + basic_stringbuf<char_type, traits_type, allocator_type> __sb_; + +public: + // 27.8.2.1 Constructors: + explicit basic_istringstream(ios_base::openmode __wch = ios_base::in); + explicit basic_istringstream(const string_type& __s, + ios_base::openmode __wch = ios_base::in); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_istringstream(basic_istringstream&& __rhs); + + // 27.8.2.2 Assign and swap: + basic_istringstream& operator=(basic_istringstream&& __rhs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void swap(basic_istringstream& __rhs); + + // 27.8.2.3 Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + string_type str() const; + void str(const string_type& __s); +}; + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(ios_base::openmode __wch) + : basic_istream<_CharT, _Traits>(&__sb_), + __sb_(__wch | ios_base::in) +{ +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(const string_type& __s, + ios_base::openmode __wch) + : basic_istream<_CharT, _Traits>(&__sb_), + __sb_(__s, __wch | ios_base::in) +{ +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istringstream<_CharT, _Traits, _Allocator>::basic_istringstream(basic_istringstream&& __rhs) + : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_istringstream<_CharT, _Traits, _Allocator>& +basic_istringstream<_CharT, _Traits, _Allocator>::operator=(basic_istringstream&& __rhs) +{ + basic_istream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_istringstream<_CharT, _Traits, _Allocator>::swap(basic_istringstream& __rhs) +{ + basic_istream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_istringstream<_CharT, _Traits, _Allocator>& __x, + basic_istringstream<_CharT, _Traits, _Allocator>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringbuf<_CharT, _Traits, _Allocator>* +basic_istringstream<_CharT, _Traits, _Allocator>::rdbuf() const +{ + return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _Traits, _Allocator> +basic_istringstream<_CharT, _Traits, _Allocator>::str() const +{ + return __sb_.str(); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_istringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s) +{ + __sb_.str(__s); +} + +// basic_ostringstream + +template <class _CharT, class _Traits, class _Allocator> +class _LIBCPP_VISIBLE basic_ostringstream + : public basic_ostream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef _Allocator allocator_type; + + typedef basic_string<char_type, traits_type, allocator_type> string_type; + +private: + basic_stringbuf<char_type, traits_type, allocator_type> __sb_; + +public: + // 27.8.2.1 Constructors: + explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out); + explicit basic_ostringstream(const string_type& __s, + ios_base::openmode __wch = ios_base::out); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_ostringstream(basic_ostringstream&& __rhs); + + // 27.8.2.2 Assign and swap: + basic_ostringstream& operator=(basic_ostringstream&& __rhs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void swap(basic_ostringstream& __rhs); + + // 27.8.2.3 Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + string_type str() const; + void str(const string_type& __s); +}; + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(ios_base::openmode __wch) + : basic_ostream<_CharT, _Traits>(&__sb_), + __sb_(__wch | ios_base::out) +{ +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(const string_type& __s, + ios_base::openmode __wch) + : basic_ostream<_CharT, _Traits>(&__sb_), + __sb_(__s, __wch | ios_base::out) +{ +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostringstream<_CharT, _Traits, _Allocator>::basic_ostringstream(basic_ostringstream&& __rhs) + : basic_ostream<_CharT, _Traits>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + basic_ostream<_CharT, _Traits>::set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_ostringstream<_CharT, _Traits, _Allocator>& +basic_ostringstream<_CharT, _Traits, _Allocator>::operator=(basic_ostringstream&& __rhs) +{ + basic_ostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ostringstream<_CharT, _Traits, _Allocator>::swap(basic_ostringstream& __rhs) +{ + basic_ostream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_ostringstream<_CharT, _Traits, _Allocator>& __x, + basic_ostringstream<_CharT, _Traits, _Allocator>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringbuf<_CharT, _Traits, _Allocator>* +basic_ostringstream<_CharT, _Traits, _Allocator>::rdbuf() const +{ + return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _Traits, _Allocator> +basic_ostringstream<_CharT, _Traits, _Allocator>::str() const +{ + return __sb_.str(); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_ostringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s) +{ + __sb_.str(__s); +} + +// basic_stringstream + +template <class _CharT, class _Traits, class _Allocator> +class _LIBCPP_VISIBLE basic_stringstream + : public basic_iostream<_CharT, _Traits> +{ +public: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + typedef _Allocator allocator_type; + + typedef basic_string<char_type, traits_type, allocator_type> string_type; + +private: + basic_stringbuf<char_type, traits_type, allocator_type> __sb_; + +public: + // 27.8.2.1 Constructors: + explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out); + explicit basic_stringstream(const string_type& __s, + ios_base::openmode __wch = ios_base::in | ios_base::out); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + basic_stringstream(basic_stringstream&& __rhs); + + // 27.8.2.2 Assign and swap: + basic_stringstream& operator=(basic_stringstream&& __rhs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + void swap(basic_stringstream& __rhs); + + // 27.8.2.3 Members: + basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; + string_type str() const; + void str(const string_type& __s); +}; + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(ios_base::openmode __wch) + : basic_iostream<_CharT, _Traits>(&__sb_), + __sb_(__wch) +{ +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(const string_type& __s, + ios_base::openmode __wch) + : basic_iostream<_CharT, _Traits>(&__sb_), + __sb_(__s, __wch) +{ +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringstream<_CharT, _Traits, _Allocator>::basic_stringstream(basic_stringstream&& __rhs) + : basic_iostream<_CharT, _Traits>(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) +{ + basic_istream<_CharT, _Traits>::set_rdbuf(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_stringstream<_CharT, _Traits, _Allocator>& +basic_stringstream<_CharT, _Traits, _Allocator>::operator=(basic_stringstream&& __rhs) +{ + basic_iostream<char_type, traits_type>::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_stringstream<_CharT, _Traits, _Allocator>::swap(basic_stringstream& __rhs) +{ + basic_iostream<char_type, traits_type>::swap(__rhs); + __sb_.swap(__rhs.__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(basic_stringstream<_CharT, _Traits, _Allocator>& __x, + basic_stringstream<_CharT, _Traits, _Allocator>& __y) +{ + __x.swap(__y); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_stringbuf<_CharT, _Traits, _Allocator>* +basic_stringstream<_CharT, _Traits, _Allocator>::rdbuf() const +{ + return const_cast<basic_stringbuf<char_type, traits_type, allocator_type>*>(&__sb_); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_string<_CharT, _Traits, _Allocator> +basic_stringstream<_CharT, _Traits, _Allocator>::str() const +{ + return __sb_.str(); +} + +template <class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_stringstream<_CharT, _Traits, _Allocator>::str(const string_type& __s) +{ + __sb_.str(__s); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_SSTREAM diff --git a/contrib/libc++/include/stack b/contrib/libc++/include/stack new file mode 100644 index 0000000..59906bd --- /dev/null +++ b/contrib/libc++/include/stack @@ -0,0 +1,290 @@ +// -*- C++ -*- +//===---------------------------- stack -----------------------------------===// +// +// 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_STACK +#define _LIBCPP_STACK + +/* + stack synopsis + +namespace std +{ + +template <class T, class Container = deque<T>> +class stack +{ +public: + typedef Container container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + +public: + stack() = default; + ~stack() = default; + + stack(const stack& q) = default; + stack(stack&& q) = default; + + stack& operator=(const stack& q) = default; + stack& operator=(stack&& q) = default; + + explicit stack(const container_type& c); + explicit stack(container_type&& c); + template <class Alloc> explicit stack(const Alloc& a); + template <class Alloc> stack(const container_type& c, const Alloc& a); + template <class Alloc> stack(container_type&& c, const Alloc& a); + template <class Alloc> stack(const stack& c, const Alloc& a); + template <class Alloc> stack(stack&& c, const Alloc& a); + + bool empty() const; + size_type size() const; + reference top(); + const_reference top() const; + + void push(const value_type& x); + void push(value_type&& x); + template <class... Args> void emplace(Args&&... args); + void pop(); + + void swap(stack& c) noexcept(noexcept(swap(c, q.c))); +}; + +template <class T, class Container> + bool operator==(const stack<T, Container>& x, const stack<T, Container>& y); +template <class T, class Container> + bool operator< (const stack<T, Container>& x, const stack<T, Container>& y); +template <class T, class Container> + bool operator!=(const stack<T, Container>& x, const stack<T, Container>& y); +template <class T, class Container> + bool operator> (const stack<T, Container>& x, const stack<T, Container>& y); +template <class T, class Container> + bool operator>=(const stack<T, Container>& x, const stack<T, Container>& y); +template <class T, class Container> + bool operator<=(const stack<T, Container>& x, const stack<T, Container>& y); + +template <class T, class Container> + void swap(stack<T, Container>& x, stack<T, Container>& y) + noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> +#include <deque> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp, class _Container> class stack; + +template <class _Tp, class _Container> +bool +operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); + +template <class _Tp, class _Container> +bool +operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y); + +template <class _Tp, class _Container = deque<_Tp> > +class _LIBCPP_VISIBLE stack +{ +public: + typedef _Container container_type; + typedef typename container_type::value_type value_type; + typedef typename container_type::reference reference; + typedef typename container_type::const_reference const_reference; + typedef typename container_type::size_type size_type; + +protected: + container_type c; + +public: + _LIBCPP_INLINE_VISIBILITY + stack() + _NOEXCEPT_(is_nothrow_default_constructible<container_type>::value) + : c() {} + + _LIBCPP_INLINE_VISIBILITY + stack(const stack& __q) : c(__q.c) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + stack(stack&& __q) + _NOEXCEPT_(is_nothrow_move_constructible<container_type>::value) + : c(_VSTD::move(__q.c)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + stack& operator=(const stack& __q) {c = __q.c; return *this;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + stack& operator=(stack&& __q) + _NOEXCEPT_(is_nothrow_move_assignable<container_type>::value) + {c = _VSTD::move(__q.c); return *this;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + explicit stack(const container_type& __c) : c(__c) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + explicit stack(container_type&& __c) : c(_VSTD::move(__c)) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit stack(const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + stack(const container_type& __c, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__c, __a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + stack(const stack& __s, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(__s.c, __a) {} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + stack(container_type&& __c, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(_VSTD::move(__c), __a) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + stack(stack&& __s, const _Alloc& __a, + typename enable_if<uses_allocator<container_type, + _Alloc>::value>::type* = 0) + : c(_VSTD::move(__s.c), __a) {} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + bool empty() const {return c.empty();} + _LIBCPP_INLINE_VISIBILITY + size_type size() const {return c.size();} + _LIBCPP_INLINE_VISIBILITY + reference top() {return c.back();} + _LIBCPP_INLINE_VISIBILITY + const_reference top() const {return c.back();} + + _LIBCPP_INLINE_VISIBILITY + void push(const value_type& __v) {c.push_back(__v);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void push(value_type&& __v) {c.push_back(_VSTD::move(__v));} +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + void emplace(_Args&&... __args) + {c.emplace_back(_VSTD::forward<_Args>(__args)...);} +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void pop() {c.pop_back();} + + _LIBCPP_INLINE_VISIBILITY + void swap(stack& __s) + _NOEXCEPT_(__is_nothrow_swappable<container_type>::value) + { + using _VSTD::swap; + swap(c, __s.c); + } + + template <class T1, class _C1> + friend + bool + operator==(const stack<T1, _C1>& __x, const stack<T1, _C1>& __y); + + template <class T1, class _C1> + friend + bool + operator< (const stack<T1, _C1>& __x, const stack<T1, _C1>& __y); +}; + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return __x.c == __y.c; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return __x.c < __y.c; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const stack<_Tp, _Container>& __x, const stack<_Tp, _Container>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Container> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(stack<_Tp, _Container>& __x, stack<_Tp, _Container>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Tp, class _Container, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator<stack<_Tp, _Container>, _Alloc> + : public uses_allocator<_Container, _Alloc> +{ +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STACK diff --git a/contrib/libc++/include/stdexcept b/contrib/libc++/include/stdexcept new file mode 100644 index 0000000..ef5de59 --- /dev/null +++ b/contrib/libc++/include/stdexcept @@ -0,0 +1,162 @@ +// -*- C++ -*- +//===--------------------------- stdexcept --------------------------------===// +// +// 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_STDEXCEPT +#define _LIBCPP_STDEXCEPT + +/* + stdexcept synopsis + +namespace std +{ + +class logic_error; + class domain_error; + class invalid_argument; + class length_error; + class out_of_range; +class runtime_error; + class range_error; + class overflow_error; + class underflow_error; + +for each class xxx_error: + +class xxx_error : public exception // at least indirectly +{ +public: + explicit xxx_error(const string& what_arg); + explicit xxx_error(const char* what_arg); + + virtual const char* what() const noexcept // returns what_arg +}; + +} // std + +*/ + +#include <__config> +#include <exception> +#include <iosfwd> // for string forward decl + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not using versioning namespace +{ + +class _LIBCPP_EXCEPTION_ABI logic_error + : public exception +{ +private: + void* __imp_; +public: + explicit logic_error(const string&); + explicit logic_error(const char*); + + logic_error(const logic_error&) _NOEXCEPT; + logic_error& operator=(const logic_error&) _NOEXCEPT; + + virtual ~logic_error() _NOEXCEPT; + + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI runtime_error + : public exception +{ +private: + void* __imp_; +public: + explicit runtime_error(const string&); + explicit runtime_error(const char*); + + runtime_error(const runtime_error&) _NOEXCEPT; + runtime_error& operator=(const runtime_error&) _NOEXCEPT; + + virtual ~runtime_error() _NOEXCEPT; + + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI domain_error + : public logic_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit domain_error(const string& __s) : logic_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit domain_error(const char* __s) : logic_error(__s) {} + + virtual ~domain_error() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI invalid_argument + : public logic_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const string& __s) : logic_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit invalid_argument(const char* __s) : logic_error(__s) {} + + virtual ~invalid_argument() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI length_error + : public logic_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit length_error(const string& __s) : logic_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit length_error(const char* __s) : logic_error(__s) {} + + virtual ~length_error() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI out_of_range + : public logic_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const string& __s) : logic_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit out_of_range(const char* __s) : logic_error(__s) {} + + virtual ~out_of_range() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI range_error + : public runtime_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit range_error(const string& __s) : runtime_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit range_error(const char* __s) : runtime_error(__s) {} + + virtual ~range_error() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI overflow_error + : public runtime_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const string& __s) : runtime_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit overflow_error(const char* __s) : runtime_error(__s) {} + + virtual ~overflow_error() _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI underflow_error + : public runtime_error +{ +public: + _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const string& __s) : runtime_error(__s) {} + _LIBCPP_INLINE_VISIBILITY explicit underflow_error(const char* __s) : runtime_error(__s) {} + + virtual ~underflow_error() _NOEXCEPT; +}; + +} // std + +#endif // _LIBCPP_STDEXCEPT diff --git a/contrib/libc++/include/streambuf b/contrib/libc++/include/streambuf new file mode 100644 index 0000000..e128be5 --- /dev/null +++ b/contrib/libc++/include/streambuf @@ -0,0 +1,564 @@ +// -*- C++ -*- +//===------------------------- streambuf ----------------------------------===// +// +// 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_STEAMBUF +#define _LIBCPP_STEAMBUF + +/* + streambuf synopsis + +namespace std +{ + +template <class charT, class traits = char_traits<charT> > +class basic_streambuf +{ +public: + // types: + typedef charT char_type; + typedef traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + virtual ~basic_streambuf(); + + // 27.6.2.2.1 locales: + locale pubimbue(const locale& loc); + locale getloc() const; + + // 27.6.2.2.2 buffer and positioning: + basic_streambuf* pubsetbuf(char_type* s, streamsize n); + pos_type pubseekoff(off_type off, ios_base::seekdir way, + ios_base::openmode which = ios_base::in | ios_base::out); + pos_type pubseekpos(pos_type sp, + ios_base::openmode which = ios_base::in | ios_base::out); + int pubsync(); + + // Get and put areas: + // 27.6.2.2.3 Get area: + streamsize in_avail(); + int_type snextc(); + int_type sbumpc(); + int_type sgetc(); + streamsize sgetn(char_type* s, streamsize n); + + // 27.6.2.2.4 Putback: + int_type sputbackc(char_type c); + int_type sungetc(); + + // 27.6.2.2.5 Put area: + int_type sputc(char_type c); + streamsize sputn(const char_type* s, streamsize n); + +protected: + basic_streambuf(); + basic_streambuf(const basic_streambuf& rhs); + basic_streambuf& operator=(const basic_streambuf& rhs); + void swap(basic_streambuf& rhs); + + // 27.6.2.3.2 Get area: + char_type* eback() const; + char_type* gptr() const; + char_type* egptr() const; + void gbump(int n); + void setg(char_type* gbeg, char_type* gnext, char_type* gend); + + // 27.6.2.3.3 Put area: + char_type* pbase() const; + char_type* pptr() const; + char_type* epptr() const; + void pbump(int n); + void setp(char_type* pbeg, char_type* pend); + + // 27.6.2.4 virtual functions: + // 27.6.2.4.1 Locales: + virtual void imbue(const locale& loc); + + // 27.6.2.4.2 Buffer management and positioning: + virtual basic_streambuf* setbuf(char_type* s, streamsize n); + virtual pos_type seekoff(off_type off, ios_base::seekdir way, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type sp, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual int sync(); + + // 27.6.2.4.3 Get area: + virtual streamsize showmanyc(); + virtual streamsize xsgetn(char_type* s, streamsize n); + virtual int_type underflow(); + virtual int_type uflow(); + + // 27.6.2.4.4 Putback: + virtual int_type pbackfail(int_type c = traits_type::eof()); + + // 27.6.2.4.5 Put area: + virtual streamsize xsputn(const char_type* s, streamsize n); + virtual int_type overflow (int_type c = traits_type::eof()); +}; + +} // std + +*/ + +#include <__config> +#include <iosfwd> +#include <ios> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _CharT, class _Traits> +class _LIBCPP_VISIBLE basic_streambuf +{ +public: + // types: + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename traits_type::int_type int_type; + typedef typename traits_type::pos_type pos_type; + typedef typename traits_type::off_type off_type; + + virtual ~basic_streambuf(); + + // 27.6.2.2.1 locales: + locale pubimbue(const locale& __loc); + locale getloc() const; + + // 27.6.2.2.2 buffer and positioning: + basic_streambuf* pubsetbuf(char_type* __s, streamsize __n); + pos_type pubseekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __which = ios_base::in | ios_base::out); + pos_type pubseekpos(pos_type __sp, + ios_base::openmode __which = ios_base::in | ios_base::out); + int pubsync(); + + // Get and put areas: + // 27.6.2.2.3 Get area: + streamsize in_avail(); + int_type snextc(); + int_type sbumpc(); + int_type sgetc(); + streamsize sgetn(char_type* __s, streamsize __n); + + // 27.6.2.2.4 Putback: + int_type sputbackc(char_type __c); + int_type sungetc(); + + // 27.6.2.2.5 Put area: + int_type sputc(char_type __c); + streamsize sputn(const char_type* __s, streamsize __n); + +protected: + basic_streambuf(); + basic_streambuf(const basic_streambuf& __rhs); + basic_streambuf& operator=(const basic_streambuf& __rhs); + void swap(basic_streambuf& __rhs); + + // 27.6.2.3.2 Get area: + _LIBCPP_ALWAYS_INLINE char_type* eback() const {return __binp_;} + _LIBCPP_ALWAYS_INLINE char_type* gptr() const {return __ninp_;} + _LIBCPP_ALWAYS_INLINE char_type* egptr() const {return __einp_;} + void gbump(int __n); + void setg(char_type* __gbeg, char_type* __gnext, char_type* __gend); + + // 27.6.2.3.3 Put area: + _LIBCPP_ALWAYS_INLINE char_type* pbase() const {return __bout_;} + _LIBCPP_ALWAYS_INLINE char_type* pptr() const {return __nout_;} + _LIBCPP_ALWAYS_INLINE char_type* epptr() const {return __eout_;} + void pbump(int __n); + void setp(char_type* __pbeg, char_type* __pend); + + // 27.6.2.4 virtual functions: + // 27.6.2.4.1 Locales: + virtual void imbue(const locale& __loc); + + // 27.6.2.4.2 Buffer management and positioning: + virtual basic_streambuf* setbuf(char_type* __s, streamsize __n); + virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type __sp, + ios_base::openmode __which = ios_base::in | ios_base::out); + virtual int sync(); + + // 27.6.2.4.3 Get area: + virtual streamsize showmanyc(); + virtual streamsize xsgetn(char_type* __s, streamsize __n); + virtual int_type underflow(); + virtual int_type uflow(); + + // 27.6.2.4.4 Putback: + virtual int_type pbackfail(int_type __c = traits_type::eof()); + + // 27.6.2.4.5 Put area: + virtual streamsize xsputn(const char_type* __s, streamsize __n); + virtual int_type overflow(int_type __c = traits_type::eof()); + +private: + locale __loc_; + char_type* __binp_; + char_type* __ninp_; + char_type* __einp_; + char_type* __bout_; + char_type* __nout_; + char_type* __eout_; +}; + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>::~basic_streambuf() +{ +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +locale +basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) +{ + imbue(__loc); + locale __r = __loc_; + __loc_ = __loc; + return __r; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +locale +basic_streambuf<_CharT, _Traits>::getloc() const +{ + return __loc_; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +basic_streambuf<_CharT, _Traits>* +basic_streambuf<_CharT, _Traits>::pubsetbuf(char_type* __s, streamsize __n) +{ + return setbuf(__s, __n); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::pos_type +basic_streambuf<_CharT, _Traits>::pubseekoff(off_type __off, + ios_base::seekdir __way, + ios_base::openmode __which) +{ + return seekoff(__off, __way, __which); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::pos_type +basic_streambuf<_CharT, _Traits>::pubseekpos(pos_type __sp, + ios_base::openmode __which) +{ + return seekpos(__sp, __which); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +int +basic_streambuf<_CharT, _Traits>::pubsync() +{ + return sync(); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +streamsize +basic_streambuf<_CharT, _Traits>::in_avail() +{ + if (__ninp_ < __einp_) + return static_cast<streamsize>(__einp_ - __ninp_); + return showmanyc(); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::snextc() +{ + if (sbumpc() == traits_type::eof()) + return traits_type::eof(); + return sgetc(); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::sbumpc() +{ + if (__ninp_ == __einp_) + return uflow(); + return traits_type::to_int_type(*__ninp_++); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::sgetc() +{ + if (__ninp_ == __einp_) + return underflow(); + return traits_type::to_int_type(*__ninp_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +streamsize +basic_streambuf<_CharT, _Traits>::sgetn(char_type* __s, streamsize __n) +{ + return xsgetn(__s, __n); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::sputbackc(char_type __c) +{ + if (__binp_ == __ninp_ || !traits_type::eq(__c, __ninp_[-1])) + return pbackfail(traits_type::to_int_type(__c)); + return traits_type::to_int_type(*--__ninp_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::sungetc() +{ + if (__binp_ == __ninp_) + return pbackfail(); + return traits_type::to_int_type(*--__ninp_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::sputc(char_type __c) +{ + if (__nout_ == __eout_) + return overflow(traits_type::to_int_type(__c)); + *__nout_++ = __c; + return traits_type::to_int_type(__c); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +streamsize +basic_streambuf<_CharT, _Traits>::sputn(const char_type* __s, streamsize __n) +{ + return xsputn(__s, __n); +} + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>::basic_streambuf() + : __binp_(0), + __ninp_(0), + __einp_(0), + __bout_(0), + __nout_(0), + __eout_(0) +{ +} + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>::basic_streambuf(const basic_streambuf& __sb) + : __loc_(__sb.__loc_), + __binp_(__sb.__binp_), + __ninp_(__sb.__ninp_), + __einp_(__sb.__einp_), + __bout_(__sb.__bout_), + __nout_(__sb.__nout_), + __eout_(__sb.__eout_) +{ +} + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>& +basic_streambuf<_CharT, _Traits>::operator=(const basic_streambuf& __sb) +{ + __loc_ = __sb.__loc_; + __binp_ = __sb.__binp_; + __ninp_ = __sb.__ninp_; + __einp_ = __sb.__einp_; + __bout_ = __sb.__bout_; + __nout_ = __sb.__nout_; + __eout_ = __sb.__eout_; + return *this; +} + +template <class _CharT, class _Traits> +void +basic_streambuf<_CharT, _Traits>::swap(basic_streambuf& __sb) +{ + _VSTD::swap(__loc_, __sb.__loc_); + _VSTD::swap(__binp_, __sb.__binp_); + _VSTD::swap(__ninp_, __sb.__ninp_); + _VSTD::swap(__einp_, __sb.__einp_); + _VSTD::swap(__bout_, __sb.__bout_); + _VSTD::swap(__nout_, __sb.__nout_); + _VSTD::swap(__eout_, __sb.__eout_); +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_streambuf<_CharT, _Traits>::gbump(int __n) +{ + __ninp_ += __n; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_streambuf<_CharT, _Traits>::setg(char_type* __gbeg, char_type* __gnext, + char_type* __gend) +{ + __binp_ = __gbeg; + __ninp_ = __gnext; + __einp_ = __gend; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_streambuf<_CharT, _Traits>::pbump(int __n) +{ + __nout_ += __n; +} + +template <class _CharT, class _Traits> +inline _LIBCPP_INLINE_VISIBILITY +void +basic_streambuf<_CharT, _Traits>::setp(char_type* __pbeg, char_type* __pend) +{ + __bout_ = __nout_ = __pbeg; + __eout_ = __pend; +} + +template <class _CharT, class _Traits> +void +basic_streambuf<_CharT, _Traits>::imbue(const locale&) +{ +} + +template <class _CharT, class _Traits> +basic_streambuf<_CharT, _Traits>* +basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) +{ + return this; +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::pos_type +basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, + ios_base::openmode) +{ + return pos_type(off_type(-1)); +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::pos_type +basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) +{ + return pos_type(off_type(-1)); +} + +template <class _CharT, class _Traits> +int +basic_streambuf<_CharT, _Traits>::sync() +{ + return 0; +} + +template <class _CharT, class _Traits> +streamsize +basic_streambuf<_CharT, _Traits>::showmanyc() +{ + return 0; +} + +template <class _CharT, class _Traits> +streamsize +basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) +{ + const int_type __eof = traits_type::eof(); + int_type __c; + streamsize __i = 0; + for (;__i < __n; ++__i, ++__s) + { + if (__ninp_ < __einp_) + *__s = *__ninp_++; + else if ((__c = uflow()) != __eof) + *__s = traits_type::to_char_type(__c); + else + break; + } + return __i; +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::underflow() +{ + return traits_type::eof(); +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::uflow() +{ + if (underflow() == traits_type::eof()) + return traits_type::eof(); + return traits_type::to_int_type(*__ninp_++); +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::pbackfail(int_type) +{ + return traits_type::eof(); +} + +template <class _CharT, class _Traits> +streamsize +basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) +{ + streamsize __i = 0; + int_type __eof = traits_type::eof(); + for (; __i < __n; ++__s, ++__i) + { + if (__nout_ < __eout_) + *__nout_++ = *__s; + else if (overflow(*__s) == __eof) + break; + } + return __i; +} + +template <class _CharT, class _Traits> +typename basic_streambuf<_CharT, _Traits>::int_type +basic_streambuf<_CharT, _Traits>::overflow(int_type) +{ + return traits_type::eof(); +} + +extern template class basic_streambuf<char>; +extern template class basic_streambuf<wchar_t>; + +extern template class basic_ios<char>; +extern template class basic_ios<wchar_t>; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STEAMBUF diff --git a/contrib/libc++/include/string b/contrib/libc++/include/string new file mode 100644 index 0000000..620e6f8 --- /dev/null +++ b/contrib/libc++/include/string @@ -0,0 +1,3984 @@ +// -*- C++ -*- +//===--------------------------- string -----------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_STRING +#define _LIBCPP_STRING + +/* + string synopsis + +namespace std +{ + +template <class stateT> +class fpos +{ +private: + stateT st; +public: + fpos(streamoff = streamoff()); + + operator streamoff() const; + + stateT state() const; + void state(stateT); + + fpos& operator+=(streamoff); + fpos operator+ (streamoff) const; + fpos& operator-=(streamoff); + fpos operator- (streamoff) const; +}; + +template <class stateT> streamoff operator-(const fpos<stateT>& x, const fpos<stateT>& y); + +template <class stateT> bool operator==(const fpos<stateT>& x, const fpos<stateT>& y); +template <class stateT> bool operator!=(const fpos<stateT>& x, const fpos<stateT>& y); + +template <class charT> +struct char_traits +{ + typedef charT char_type; + typedef ... int_type; + typedef streamoff off_type; + typedef streampos pos_type; + typedef mbstate_t state_type; + + static void assign(char_type& c1, const char_type& c2) noexcept; + static bool eq(char_type c1, char_type c2) noexcept; + static bool lt(char_type c1, char_type c2) noexcept; + + static int compare(const char_type* s1, const char_type* s2, size_t n); + static size_t length(const char_type* s); + static const char_type* find(const char_type* s, size_t n, const char_type& a); + static char_type* move(char_type* s1, const char_type* s2, size_t n); + static char_type* copy(char_type* s1, const char_type* s2, size_t n); + static char_type* assign(char_type* s, size_t n, char_type a); + + static int_type not_eof(int_type c) noexcept; + static char_type to_char_type(int_type c) noexcept; + static int_type to_int_type(char_type c) noexcept; + static bool eq_int_type(int_type c1, int_type c2) noexcept; + static int_type eof() noexcept; +}; + +template <> struct char_traits<char>; +template <> struct char_traits<wchar_t>; + +template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > +class basic_string +{ +public: +// types: + typedef traits traits_type; + typedef typename traits_type::char_type value_type; + typedef Allocator allocator_type; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef implementation-defined iterator; + typedef implementation-defined const_iterator; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + static const size_type npos = -1; + + basic_string() + noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit basic_string(const allocator_type& a); + basic_string(const basic_string& str); + basic_string(basic_string&& str) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + basic_string(const basic_string& str, size_type pos, size_type n = npos, + const allocator_type& a = allocator_type()); + basic_string(const_pointer s, const allocator_type& a = allocator_type()); + basic_string(const_pointer s, size_type n, const allocator_type& a = allocator_type()); + basic_string(size_type n, value_type c, const allocator_type& a = allocator_type()); + template<class InputIterator> + basic_string(InputIterator begin, InputIterator end, + const allocator_type& a = allocator_type()); + basic_string(initializer_list<value_type>, const Allocator& = Allocator()); + basic_string(const basic_string&, const Allocator&); + basic_string(basic_string&&, const Allocator&); + + ~basic_string(); + + basic_string& operator=(const basic_string& str); + basic_string& operator=(basic_string&& str) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + basic_string& operator=(const_pointer s); + basic_string& operator=(value_type c); + basic_string& operator=(initializer_list<value_type>); + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + size_type size() const noexcept; + size_type length() const noexcept; + size_type max_size() const noexcept; + size_type capacity() const noexcept; + + void resize(size_type n, value_type c); + void resize(size_type n); + + void reserve(size_type res_arg = 0); + void shrink_to_fit(); + void clear() noexcept; + bool empty() const noexcept; + + const_reference operator[](size_type pos) const; + reference operator[](size_type pos); + + const_reference at(size_type n) const; + reference at(size_type n); + + basic_string& operator+=(const basic_string& str); + basic_string& operator+=(const_pointer s); + basic_string& operator+=(value_type c); + basic_string& operator+=(initializer_list<value_type>); + + basic_string& append(const basic_string& str); + basic_string& append(const basic_string& str, size_type pos, size_type n); + basic_string& append(const_pointer s, size_type n); + basic_string& append(const_pointer s); + basic_string& append(size_type n, value_type c); + template<class InputIterator> + basic_string& append(InputIterator first, InputIterator last); + basic_string& append(initializer_list<value_type>); + + void push_back(value_type c); + void pop_back(); + reference front(); + const_reference front() const; + reference back(); + const_reference back() const; + + basic_string& assign(const basic_string& str); + basic_string& assign(basic_string&& str); + basic_string& assign(const basic_string& str, size_type pos, size_type n); + basic_string& assign(const_pointer s, size_type n); + basic_string& assign(const_pointer s); + basic_string& assign(size_type n, value_type c); + template<class InputIterator> + basic_string& assign(InputIterator first, InputIterator last); + basic_string& assign(initializer_list<value_type>); + + basic_string& insert(size_type pos1, const basic_string& str); + basic_string& insert(size_type pos1, const basic_string& str, + size_type pos2, size_type n); + basic_string& insert(size_type pos, const_pointer s, size_type n); + basic_string& insert(size_type pos, const_pointer s); + basic_string& insert(size_type pos, size_type n, value_type c); + iterator insert(const_iterator p, value_type c); + iterator insert(const_iterator p, size_type n, value_type c); + template<class InputIterator> + iterator insert(const_iterator p, InputIterator first, InputIterator last); + iterator insert(const_iterator p, initializer_list<value_type>); + + basic_string& erase(size_type pos = 0, size_type n = npos); + iterator erase(const_iterator position); + iterator erase(const_iterator first, const_iterator last); + + basic_string& replace(size_type pos1, size_type n1, const basic_string& str); + basic_string& replace(size_type pos1, size_type n1, const basic_string& str, + size_type pos2, size_type n2); + basic_string& replace(size_type pos, size_type n1, const_pointer s, size_type n2); + basic_string& replace(size_type pos, size_type n1, const_pointer s); + basic_string& replace(size_type pos, size_type n1, size_type n2, value_type c); + basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str); + basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s, size_type n); + basic_string& replace(const_iterator i1, const_iterator i2, const_pointer s); + basic_string& replace(const_iterator i1, const_iterator i2, size_type n, value_type c); + template<class InputIterator> + basic_string& replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); + basic_string& replace(const_iterator i1, const_iterator i2, initializer_list<value_type>); + + size_type copy(pointer s, size_type n, size_type pos = 0) const; + basic_string substr(size_type pos = 0, size_type n = npos) const; + + void swap(basic_string& str) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) + + const_pointer c_str() const noexcept; + const_pointer data() const noexcept; + + allocator_type get_allocator() const noexcept; + + size_type find(const basic_string& str, size_type pos = 0) const noexcept; + size_type find(const_pointer s, size_type pos, size_type n) const noexcept; + size_type find(const_pointer s, size_type pos = 0) const noexcept; + size_type find(value_type c, size_type pos = 0) const noexcept; + + size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; + size_type rfind(const_pointer s, size_type pos, size_type n) const noexcept; + size_type rfind(const_pointer s, size_type pos = npos) const noexcept; + size_type rfind(value_type c, size_type pos = npos) const noexcept; + + size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept; + size_type find_first_of(const_pointer s, size_type pos, size_type n) const noexcept; + size_type find_first_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_first_of(value_type c, size_type pos = 0) const noexcept; + + size_type find_last_of(const basic_string& str, size_type pos = npos) const noexcept; + size_type find_last_of(const_pointer s, size_type pos, size_type n) const noexcept; + size_type find_last_of(const_pointer s, size_type pos = npos) const noexcept; + size_type find_last_of(value_type c, size_type pos = npos) const noexcept; + + size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept; + size_type find_first_not_of(const_pointer s, size_type pos, size_type n) const noexcept; + size_type find_first_not_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_first_not_of(value_type c, size_type pos = 0) const noexcept; + + size_type find_last_not_of(const basic_string& str, size_type pos = npos) const noexcept; + size_type find_last_not_of(const_pointer s, size_type pos, size_type n) const noexcept; + size_type find_last_not_of(const_pointer s, size_type pos = npos) const noexcept; + size_type find_last_not_of(value_type c, size_type pos = npos) const noexcept; + + int compare(const basic_string& str) const noexcept; + int compare(size_type pos1, size_type n1, const basic_string& str) const; + int compare(size_type pos1, size_type n1, const basic_string& str, + size_type pos2, size_type n2) const; + int compare(const_pointer s) const noexcept; + int compare(size_type pos1, size_type n1, const_pointer s) const; + int compare(size_type pos1, size_type n1, const_pointer s, size_type n2) const; + + bool __invariants() const; +}; + +template<class charT, class traits, class Allocator> +basic_string<charT, traits, Allocator> +operator+(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs); + +template<class charT, class traits, class Allocator> +basic_string<charT, traits, Allocator> +operator+(const charT* lhs , const basic_string<charT,traits,Allocator>&rhs); + +template<class charT, class traits, class Allocator> +basic_string<charT, traits, Allocator> +operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs); + +template<class charT, class traits, class Allocator> +basic_string<charT, traits, Allocator> +operator+(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs); + +template<class charT, class traits, class Allocator> +basic_string<charT, traits, Allocator> +operator+(const basic_string<charT, traits, Allocator>& lhs, charT rhs); + +template<class charT, class traits, class Allocator> +bool operator==(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator==(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator!=(const basic_string<charT,traits,Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator!=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator!=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator< (const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator< (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator< (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator> (const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator> (const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator> (const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator<=(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator<=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator<=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator>=(const basic_string<charT, traits, Allocator>& lhs, + const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator>=(const basic_string<charT, traits, Allocator>& lhs, const charT* rhs) noexcept; + +template<class charT, class traits, class Allocator> +bool operator>=(const charT* lhs, const basic_string<charT, traits, Allocator>& rhs) noexcept; + +template<class charT, class traits, class Allocator> +void swap(basic_string<charT, traits, Allocator>& lhs, + basic_string<charT, traits, Allocator>& rhs) + noexcept(noexcept(lhs.swap(rhs))); + +template<class charT, class traits, class Allocator> +basic_istream<charT, traits>& +operator>>(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str); + +template<class charT, class traits, class Allocator> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& os, const basic_string<charT, traits, Allocator>& str); + +template<class charT, class traits, class Allocator> +basic_istream<charT, traits>& +getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str, + charT delim); + +template<class charT, class traits, class Allocator> +basic_istream<charT, traits>& +getline(basic_istream<charT, traits>& is, basic_string<charT, traits, Allocator>& str); + +typedef basic_string<char> string; +typedef basic_string<wchar_t> wstring; +typedef basic_string<char16_t> u16string; +typedef basic_string<char32_t> u32string; + +int stoi (const string& str, size_t* idx = 0, int base = 10); +long stol (const string& str, size_t* idx = 0, int base = 10); +unsigned long stoul (const string& str, size_t* idx = 0, int base = 10); +long long stoll (const string& str, size_t* idx = 0, int base = 10); +unsigned long long stoull(const string& str, size_t* idx = 0, int base = 10); + +float stof (const string& str, size_t* idx = 0); +double stod (const string& str, size_t* idx = 0); +long double stold(const string& str, size_t* idx = 0); + +string to_string(int val); +string to_string(unsigned val); +string to_string(long val); +string to_string(unsigned long val); +string to_string(long long val); +string to_string(unsigned long long val); +string to_string(float val); +string to_string(double val); +string to_string(long double val); + +int stoi (const wstring& str, size_t* idx = 0, int base = 10); +long stol (const wstring& str, size_t* idx = 0, int base = 10); +unsigned long stoul (const wstring& str, size_t* idx = 0, int base = 10); +long long stoll (const wstring& str, size_t* idx = 0, int base = 10); +unsigned long long stoull(const wstring& str, size_t* idx = 0, int base = 10); + +float stof (const wstring& str, size_t* idx = 0); +double stod (const wstring& str, size_t* idx = 0); +long double stold(const wstring& str, size_t* idx = 0); + +wstring to_wstring(int val); +wstring to_wstring(unsigned val); +wstring to_wstring(long val); +wstring to_wstring(unsigned long val); +wstring to_wstring(long long val); +wstring to_wstring(unsigned long long val); +wstring to_wstring(float val); +wstring to_wstring(double val); +wstring to_wstring(long double val); + +template <> struct hash<string>; +template <> struct hash<u16string>; +template <> struct hash<u32string>; +template <> struct hash<wstring>; + +} // std + +*/ + +#include <__config> +#include <iosfwd> +#include <cstring> +#include <cstdio> // For EOF. +#include <cwchar> +#include <algorithm> +#include <iterator> +#include <utility> +#include <memory> +#include <stdexcept> +#include <type_traits> +#include <initializer_list> +#include <__functional_base> +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS +#include <cstdint> +#endif +#if defined(_LIBCPP_NO_EXCEPTIONS) || defined(_LIBCPP_DEBUG) +#include <cassert> +#endif + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// fpos + +template <class _StateT> +class _LIBCPP_VISIBLE fpos +{ +private: + _StateT __st_; + streamoff __off_; +public: + _LIBCPP_INLINE_VISIBILITY fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {} + + _LIBCPP_INLINE_VISIBILITY operator streamoff() const {return __off_;} + + _LIBCPP_INLINE_VISIBILITY _StateT state() const {return __st_;} + _LIBCPP_INLINE_VISIBILITY void state(_StateT __st) {__st_ = __st;} + + _LIBCPP_INLINE_VISIBILITY fpos& operator+=(streamoff __off) {__off_ += __off; return *this;} + _LIBCPP_INLINE_VISIBILITY fpos operator+ (streamoff __off) const {fpos __t(*this); __t += __off; return __t;} + _LIBCPP_INLINE_VISIBILITY fpos& operator-=(streamoff __off) {__off_ -= __off; return *this;} + _LIBCPP_INLINE_VISIBILITY fpos operator- (streamoff __off) const {fpos __t(*this); __t -= __off; return __t;} +}; + +template <class _StateT> +inline _LIBCPP_INLINE_VISIBILITY +streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y) + {return streamoff(__x) - streamoff(__y);} + +template <class _StateT> +inline _LIBCPP_INLINE_VISIBILITY +bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y) + {return streamoff(__x) == streamoff(__y);} + +template <class _StateT> +inline _LIBCPP_INLINE_VISIBILITY +bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y) + {return streamoff(__x) != streamoff(__y);} + +// char_traits + +template <class _CharT> +struct _LIBCPP_VISIBLE char_traits +{ + typedef _CharT char_type; + typedef int int_type; + typedef streamoff off_type; + typedef streampos pos_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT + {__c1 = __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool eq(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool lt(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 < __c2;} + + static int compare(const char_type* __s1, const char_type* __s2, size_t __n); + static size_t length(const char_type* __s); + static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); + static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* assign(char_type* __s, size_t __n, char_type __a); + + _LIBCPP_INLINE_VISIBILITY static int_type not_eof(int_type __c) _NOEXCEPT + {return eq_int_type(__c, eof()) ? ~eof() : __c;} + _LIBCPP_INLINE_VISIBILITY + static char_type to_char_type(int_type __c) _NOEXCEPT + {return char_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static int_type to_int_type(char_type __c) _NOEXCEPT + {return int_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static int_type eof() _NOEXCEPT + {return int_type(EOF);} +}; + +template <class _CharT> +int +char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n) +{ + for (; __n; --__n, ++__s1, ++__s2) + { + if (lt(*__s1, *__s2)) + return -1; + if (lt(*__s2, *__s1)) + return 1; + } + return 0; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +size_t +char_traits<_CharT>::length(const char_type* __s) +{ + size_t __len = 0; + for (; !eq(*__s, char_type(0)); ++__s) + ++__len; + return __len; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +const _CharT* +char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a) +{ + for (; __n; --__n) + { + if (eq(*__s, __a)) + return __s; + ++__s; + } + return 0; +} + +template <class _CharT> +_CharT* +char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + if (__s1 < __s2) + { + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + } + else if (__s2 < __s1) + { + __s1 += __n; + __s2 += __n; + for (; __n; --__n) + assign(*--__s1, *--__s2); + } + return __r; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +_CharT* +char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + return __r; +} + +template <class _CharT> +inline _LIBCPP_INLINE_VISIBILITY +_CharT* +char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a) +{ + char_type* __r = __s; + for (; __n; --__n, ++__s) + assign(*__s, __a); + return __r; +} + +// char_traits<char> + +template <> +struct _LIBCPP_VISIBLE char_traits<char> +{ + typedef char char_type; + typedef int int_type; + typedef streamoff off_type; + typedef streampos pos_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT + {__c1 = __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool eq(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool lt(char_type __c1, char_type __c2) _NOEXCEPT + {return (unsigned char)__c1 < (unsigned char)__c2;} + + _LIBCPP_INLINE_VISIBILITY + static int compare(const char_type* __s1, const char_type* __s2, size_t __n) + {return memcmp(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static size_t length(const char_type* __s) {return strlen(__s);} + _LIBCPP_INLINE_VISIBILITY + static const char_type* find(const char_type* __s, size_t __n, const char_type& __a) + {return (const char_type*)memchr(__s, to_int_type(__a), __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) + {return (char_type*)memmove(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) + {return (char_type*)memcpy(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* assign(char_type* __s, size_t __n, char_type __a) + {return (char_type*)memset(__s, to_int_type(__a), __n);} + + _LIBCPP_INLINE_VISIBILITY static int_type not_eof(int_type __c) _NOEXCEPT + {return eq_int_type(__c, eof()) ? ~eof() : __c;} + _LIBCPP_INLINE_VISIBILITY + static char_type to_char_type(int_type __c) _NOEXCEPT + {return char_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static int_type to_int_type(char_type __c) _NOEXCEPT + {return int_type((unsigned char)__c);} + _LIBCPP_INLINE_VISIBILITY + static bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static int_type eof() _NOEXCEPT + {return int_type(EOF);} +}; + +// char_traits<wchar_t> + +template <> +struct _LIBCPP_VISIBLE char_traits<wchar_t> +{ + typedef wchar_t char_type; + typedef wint_t int_type; + typedef streamoff off_type; + typedef streampos pos_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT + {__c1 = __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool eq(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool lt(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 < __c2;} + + _LIBCPP_INLINE_VISIBILITY + static int compare(const char_type* __s1, const char_type* __s2, size_t __n) + {return wmemcmp(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static size_t length(const char_type* __s) + {return wcslen(__s);} + _LIBCPP_INLINE_VISIBILITY + static const char_type* find(const char_type* __s, size_t __n, const char_type& __a) + {return (const char_type*)wmemchr(__s, __a, __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* move(char_type* __s1, const char_type* __s2, size_t __n) + {return (char_type*)wmemmove(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n) + {return (char_type*)wmemcpy(__s1, __s2, __n);} + _LIBCPP_INLINE_VISIBILITY + static char_type* assign(char_type* __s, size_t __n, char_type __a) + {return (char_type*)wmemset(__s, __a, __n);} + + _LIBCPP_INLINE_VISIBILITY + static int_type not_eof(int_type __c) _NOEXCEPT + {return eq_int_type(__c, eof()) ? ~eof() : __c;} + _LIBCPP_INLINE_VISIBILITY + static char_type to_char_type(int_type __c) _NOEXCEPT + {return char_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static int_type to_int_type(char_type __c) _NOEXCEPT + {return int_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static int_type eof() _NOEXCEPT + {return int_type(WEOF);} +}; + +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + +template <> +struct _LIBCPP_VISIBLE char_traits<char16_t> +{ + typedef char16_t char_type; + typedef uint_least16_t int_type; + typedef streamoff off_type; + typedef u16streampos pos_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT + {__c1 = __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool eq(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool lt(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 < __c2;} + + static int compare(const char_type* __s1, const char_type* __s2, size_t __n); + static size_t length(const char_type* __s); + static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); + static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* assign(char_type* __s, size_t __n, char_type __a); + + _LIBCPP_INLINE_VISIBILITY + static int_type not_eof(int_type __c) _NOEXCEPT + {return eq_int_type(__c, eof()) ? ~eof() : __c;} + _LIBCPP_INLINE_VISIBILITY + static char_type to_char_type(int_type __c) _NOEXCEPT + {return char_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static int_type to_int_type(char_type __c) _NOEXCEPT + {return int_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static int_type eof() _NOEXCEPT + {return int_type(0xDFFF);} +}; + +inline _LIBCPP_INLINE_VISIBILITY +int +char_traits<char16_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) +{ + for (; __n; --__n, ++__s1, ++__s2) + { + if (lt(*__s1, *__s2)) + return -1; + if (lt(*__s2, *__s1)) + return 1; + } + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t +char_traits<char16_t>::length(const char_type* __s) +{ + size_t __len = 0; + for (; !eq(*__s, char_type(0)); ++__s) + ++__len; + return __len; +} + +inline _LIBCPP_INLINE_VISIBILITY +const char16_t* +char_traits<char16_t>::find(const char_type* __s, size_t __n, const char_type& __a) +{ + for (; __n; --__n) + { + if (eq(*__s, __a)) + return __s; + ++__s; + } + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +char16_t* +char_traits<char16_t>::move(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + if (__s1 < __s2) + { + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + } + else if (__s2 < __s1) + { + __s1 += __n; + __s2 += __n; + for (; __n; --__n) + assign(*--__s1, *--__s2); + } + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +char16_t* +char_traits<char16_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +char16_t* +char_traits<char16_t>::assign(char_type* __s, size_t __n, char_type __a) +{ + char_type* __r = __s; + for (; __n; --__n, ++__s) + assign(*__s, __a); + return __r; +} + +template <> +struct _LIBCPP_VISIBLE char_traits<char32_t> +{ + typedef char32_t char_type; + typedef uint_least32_t int_type; + typedef streamoff off_type; + typedef u32streampos pos_type; + typedef mbstate_t state_type; + + _LIBCPP_INLINE_VISIBILITY + static void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT + {__c1 = __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool eq(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static bool lt(char_type __c1, char_type __c2) _NOEXCEPT + {return __c1 < __c2;} + + static int compare(const char_type* __s1, const char_type* __s2, size_t __n); + static size_t length(const char_type* __s); + static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); + static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); + static char_type* assign(char_type* __s, size_t __n, char_type __a); + + _LIBCPP_INLINE_VISIBILITY + static int_type not_eof(int_type __c) _NOEXCEPT + {return eq_int_type(__c, eof()) ? ~eof() : __c;} + _LIBCPP_INLINE_VISIBILITY + static char_type to_char_type(int_type __c) _NOEXCEPT + {return char_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static int_type to_int_type(char_type __c) _NOEXCEPT + {return int_type(__c);} + _LIBCPP_INLINE_VISIBILITY + static bool eq_int_type(int_type __c1, int_type __c2) _NOEXCEPT + {return __c1 == __c2;} + _LIBCPP_INLINE_VISIBILITY + static int_type eof() _NOEXCEPT + {return int_type(0xFFFFFFFF);} +}; + +inline _LIBCPP_INLINE_VISIBILITY +int +char_traits<char32_t>::compare(const char_type* __s1, const char_type* __s2, size_t __n) +{ + for (; __n; --__n, ++__s1, ++__s2) + { + if (lt(*__s1, *__s2)) + return -1; + if (lt(*__s2, *__s1)) + return 1; + } + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t +char_traits<char32_t>::length(const char_type* __s) +{ + size_t __len = 0; + for (; !eq(*__s, char_type(0)); ++__s) + ++__len; + return __len; +} + +inline _LIBCPP_INLINE_VISIBILITY +const char32_t* +char_traits<char32_t>::find(const char_type* __s, size_t __n, const char_type& __a) +{ + for (; __n; --__n) + { + if (eq(*__s, __a)) + return __s; + ++__s; + } + return 0; +} + +inline _LIBCPP_INLINE_VISIBILITY +char32_t* +char_traits<char32_t>::move(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + if (__s1 < __s2) + { + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + } + else if (__s2 < __s1) + { + __s1 += __n; + __s2 += __n; + for (; __n; --__n) + assign(*--__s1, *--__s2); + } + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +char32_t* +char_traits<char32_t>::copy(char_type* __s1, const char_type* __s2, size_t __n) +{ + char_type* __r = __s1; + for (; __n; --__n, ++__s1, ++__s2) + assign(*__s1, *__s2); + return __r; +} + +inline _LIBCPP_INLINE_VISIBILITY +char32_t* +char_traits<char32_t>::assign(char_type* __s, size_t __n, char_type __a) +{ + char_type* __r = __s; + for (; __n; --__n, ++__s) + assign(*__s, __a); + return __r; +} + +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +// basic_string + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, + const basic_string<_CharT, _Traits, _Allocator>& __y); + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const _CharT* __x, const basic_string<_CharT,_Traits,_Allocator>& __y); + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(_CharT __x, const basic_string<_CharT,_Traits,_Allocator>& __y); + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, const _CharT* __y); + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y); + +template <bool> +class __basic_string_common +{ +protected: + void __throw_length_error() const; + void __throw_out_of_range() const; +}; + +template <bool __b> +void +__basic_string_common<__b>::__throw_length_error() const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw length_error("basic_string"); +#else + assert(!"basic_string length_error"); +#endif +} + +template <bool __b> +void +__basic_string_common<__b>::__throw_out_of_range() const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw out_of_range("basic_string"); +#else + assert(!"basic_string out_of_range"); +#endif +} + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4231 ) +#endif // _MSC_VER +extern template class __basic_string_common<true>; +#ifdef _MSC_VER +#pragma warning( pop ) +#endif // _MSC_VER + +template<class _CharT, class _Traits, class _Allocator> +class _LIBCPP_VISIBLE basic_string + : private __basic_string_common<true> +{ +public: + typedef basic_string __self; + typedef _Traits traits_type; + typedef typename traits_type::char_type value_type; + typedef _Allocator allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; +#ifdef _LIBCPP_DEBUG + typedef __debug_iter<basic_string, pointer> iterator; + typedef __debug_iter<basic_string, const_pointer> const_iterator; + + friend class __debug_iter<basic_string, pointer>; + friend class __debug_iter<basic_string, const_pointer>; +#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 _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + +private: + struct __long + { + size_type __cap_; + size_type __size_; + pointer __data_; + }; + +#if _LIBCPP_BIG_ENDIAN + enum {__short_mask = 0x80}; + enum {__long_mask = ~(size_type(~0) >> 1)}; +#else // _LIBCPP_BIG_ENDIAN + enum {__short_mask = 0x01}; + enum {__long_mask = 0x1ul}; +#endif // _LIBCPP_BIG_ENDIAN + + enum {__mask = size_type(~0) >> 1}; + + enum {__min_cap = (sizeof(__long) - 1)/sizeof(value_type) > 2 ? + (sizeof(__long) - 1)/sizeof(value_type) : 2}; + + struct __short + { + union + { + unsigned char __size_; + value_type _; + }; + value_type __data_[__min_cap]; + }; + + union _{__long _; __short __;}; + + enum {__n_words = sizeof(_) / sizeof(size_type)}; + + struct __raw + { + size_type __words[__n_words]; + }; + + struct __rep + { + union + { + __long __l; + __short __s; + __raw __r; + }; + }; + + __compressed_pair<__rep, allocator_type> __r_; + +#ifdef _LIBCPP_DEBUG + + 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;} + +#endif // _LIBCPP_DEBUG + +public: + static const size_type npos = -1; + + _LIBCPP_INLINE_VISIBILITY basic_string() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY explicit basic_string(const allocator_type& __a); + basic_string(const basic_string& __str); + basic_string(const basic_string& __str, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_string(basic_string&& __str) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY + basic_string(basic_string&& __str, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY basic_string(const_pointer __s); + _LIBCPP_INLINE_VISIBILITY + basic_string(const_pointer __s, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY + basic_string(const_pointer __s, size_type __n); + _LIBCPP_INLINE_VISIBILITY + basic_string(const_pointer __s, size_type __n, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY + basic_string(size_type __n, value_type __c); + _LIBCPP_INLINE_VISIBILITY + basic_string(size_type __n, value_type __c, const allocator_type& __a); + basic_string(const basic_string& __str, size_type __pos, size_type __n = npos, + const allocator_type& __a = allocator_type()); + template<class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + basic_string(_InputIterator __first, _InputIterator __last); + template<class _InputIterator> + _LIBCPP_INLINE_VISIBILITY + basic_string(_InputIterator __first, _InputIterator __last, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_string(initializer_list<value_type> __il); + _LIBCPP_INLINE_VISIBILITY + basic_string(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + ~basic_string(); + + basic_string& operator=(const basic_string& __str); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_string& operator=(basic_string&& __str) + _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); +#endif + _LIBCPP_INLINE_VISIBILITY basic_string& operator=(const_pointer __s) {return assign(__s);} + basic_string& operator=(value_type __c); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_string& operator=(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_DEBUG + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT + {return iterator(__get_pointer());} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT + {return const_iterator(data());} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT + {return iterator(__get_pointer() + size());} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT + {return const_iterator(data() + size());} +#else // _LIBCPP_DEBUG + _LIBCPP_INLINE_VISIBILITY iterator begin() {return iterator(this, __get_pointer());} + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const {return const_iterator(this, data());} + _LIBCPP_INLINE_VISIBILITY iterator end() {return iterator(this, __get_pointer() + size());} + _LIBCPP_INLINE_VISIBILITY const_iterator end() const {return const_iterator(this, data() + size());} +#endif // _LIBCPP_DEBUG + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT + {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT + {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT + {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT + {return rend();} + + _LIBCPP_INLINE_VISIBILITY size_type size() const _NOEXCEPT + {return __is_long() ? __get_long_size() : __get_short_size();} + _LIBCPP_INLINE_VISIBILITY size_type length() const _NOEXCEPT {return size();} + _LIBCPP_INLINE_VISIBILITY size_type max_size() const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY size_type capacity() const _NOEXCEPT + {return (__is_long() ? __get_long_cap() : __min_cap) - 1;} + + void resize(size_type __n, value_type __c); + _LIBCPP_INLINE_VISIBILITY void resize(size_type __n) {resize(__n, value_type());} + + void reserve(size_type res_arg = 0); + _LIBCPP_INLINE_VISIBILITY + void shrink_to_fit() _NOEXCEPT {reserve();} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY bool empty() const _NOEXCEPT {return size() == 0;} + + _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __pos) const; + _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __pos); + + const_reference at(size_type __n) const; + reference at(size_type __n); + + _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const basic_string& __str) {return append(__str);} + _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(const_pointer __s) {return append(__s);} + _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(value_type __c) {push_back(__c); return *this;} +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY basic_string& operator+=(initializer_list<value_type> __il) {return append(__il);} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + basic_string& append(const basic_string& __str); + basic_string& append(const basic_string& __str, size_type __pos, size_type __n); + basic_string& append(const_pointer __s, size_type __n); + basic_string& append(const_pointer __s); + basic_string& append(size_type __n, value_type __c); + template<class _InputIterator> + typename enable_if + < + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + basic_string& + >::type + append(_InputIterator __first, _InputIterator __last); + template<class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + basic_string& + >::type + append(_ForwardIterator __first, _ForwardIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_string& append(initializer_list<value_type> __il) {return append(__il.begin(), __il.size());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + void push_back(value_type __c); + _LIBCPP_INLINE_VISIBILITY + void pop_back(); + _LIBCPP_INLINE_VISIBILITY reference front(); + _LIBCPP_INLINE_VISIBILITY const_reference front() const; + _LIBCPP_INLINE_VISIBILITY reference back(); + _LIBCPP_INLINE_VISIBILITY const_reference back() const; + + _LIBCPP_INLINE_VISIBILITY + basic_string& assign(const basic_string& __str); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + basic_string& assign(basic_string&& str) + {*this = _VSTD::move(str); return *this;} +#endif + basic_string& assign(const basic_string& __str, size_type __pos, size_type __n); + basic_string& assign(const_pointer __s, size_type __n); + basic_string& assign(const_pointer __s); + basic_string& assign(size_type __n, value_type __c); + template<class _InputIterator> + typename enable_if + < + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + basic_string& + >::type + assign(_InputIterator __first, _InputIterator __last); + template<class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + basic_string& + >::type + assign(_ForwardIterator __first, _ForwardIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_string& assign(initializer_list<value_type> __il) {return assign(__il.begin(), __il.size());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + basic_string& insert(size_type __pos1, const basic_string& __str); + basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n); + basic_string& insert(size_type __pos, const_pointer __s, size_type __n); + basic_string& insert(size_type __pos, const_pointer __s); + basic_string& insert(size_type __pos, size_type __n, value_type __c); + iterator insert(const_iterator __pos, value_type __c); + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __pos, size_type __n, value_type __c); + template<class _InputIterator> + typename enable_if + < + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + iterator + >::type + insert(const_iterator __pos, _InputIterator __first, _InputIterator __last); + template<class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + iterator + >::type + insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __pos, initializer_list<value_type> __il) + {return insert(__pos, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + basic_string& erase(size_type __pos = 0, size_type __n = npos); + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __pos); + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __first, const_iterator __last); + + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str); + basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2); + basic_string& replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2); + basic_string& replace(size_type __pos, size_type __n1, const_pointer __s); + basic_string& replace(size_type __pos, size_type __n1, size_type __n2, value_type __c); + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(const_iterator __i1, const_iterator __i2, const basic_string& __str); + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n); + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(const_iterator __i1, const_iterator __i2, const_pointer __s); + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c); + template<class _InputIterator> + typename enable_if + < + __is_input_iterator<_InputIterator>::value, + basic_string& + >::type + replace(const_iterator __i1, const_iterator __i2, _InputIterator __j1, _InputIterator __j2); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + basic_string& replace(const_iterator __i1, const_iterator __i2, initializer_list<value_type> __il) + {return replace(__i1, __i2, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + size_type copy(pointer __s, size_type __n, size_type __pos = 0) const; + _LIBCPP_INLINE_VISIBILITY + basic_string substr(size_type __pos = 0, size_type __n = npos) const; + + _LIBCPP_INLINE_VISIBILITY + void swap(basic_string& __str) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + + _LIBCPP_INLINE_VISIBILITY + const_pointer c_str() const _NOEXCEPT {return data();} + _LIBCPP_INLINE_VISIBILITY + const_pointer data() const _NOEXCEPT {return __get_pointer();} + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT {return __alloc();} + + _LIBCPP_INLINE_VISIBILITY + size_type find(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; + size_type find(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find(const_pointer __s, size_type __pos = 0) const _NOEXCEPT; + size_type find(value_type __c, size_type __pos = 0) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type rfind(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; + size_type rfind(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type rfind(const_pointer __s, size_type __pos = npos) const _NOEXCEPT; + size_type rfind(value_type __c, size_type __pos = npos) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type find_first_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; + size_type find_first_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_first_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_first_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type find_last_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; + size_type find_last_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_last_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_last_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const _NOEXCEPT; + size_type find_first_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_first_not_of(const_pointer __s, size_type __pos = 0) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_first_not_of(value_type __c, size_type __pos = 0) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const _NOEXCEPT; + size_type find_last_not_of(const_pointer __s, size_type __pos, size_type __n) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_last_not_of(const_pointer __s, size_type __pos = npos) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type find_last_not_of(value_type __c, size_type __pos = npos) const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + int compare(const basic_string& __str) const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + int compare(size_type __pos1, size_type __n1, const basic_string& __str) const; + int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const; + int compare(const_pointer __s) const _NOEXCEPT; + int compare(size_type __pos1, size_type __n1, const_pointer __s) const; + int compare(size_type __pos1, size_type __n1, const_pointer __s, size_type __n2) const; + + _LIBCPP_INLINE_VISIBILITY bool __invariants() const; +private: + _LIBCPP_INLINE_VISIBILITY + allocator_type& __alloc() _NOEXCEPT + {return __r_.second();} + _LIBCPP_INLINE_VISIBILITY + const allocator_type& __alloc() const _NOEXCEPT + {return __r_.second();} + + _LIBCPP_INLINE_VISIBILITY + bool __is_long() const _NOEXCEPT + {return bool(__r_.first().__s.__size_ & __short_mask);} + + _LIBCPP_INLINE_VISIBILITY + void __set_short_size(size_type __s) _NOEXCEPT +#if _LIBCPP_BIG_ENDIAN + {__r_.first().__s.__size_ = (unsigned char)(__s);} +#else + {__r_.first().__s.__size_ = (unsigned char)(__s << 1);} +#endif + _LIBCPP_INLINE_VISIBILITY + size_type __get_short_size() const _NOEXCEPT +#if _LIBCPP_BIG_ENDIAN + {return __r_.first().__s.__size_;} +#else + {return __r_.first().__s.__size_ >> 1;} +#endif + _LIBCPP_INLINE_VISIBILITY + void __set_long_size(size_type __s) _NOEXCEPT + {__r_.first().__l.__size_ = __s;} + _LIBCPP_INLINE_VISIBILITY + size_type __get_long_size() const _NOEXCEPT + {return __r_.first().__l.__size_;} + _LIBCPP_INLINE_VISIBILITY + void __set_size(size_type __s) _NOEXCEPT + {if (__is_long()) __set_long_size(__s); else __set_short_size(__s);} + + _LIBCPP_INLINE_VISIBILITY + void __set_long_cap(size_type __s) _NOEXCEPT + {__r_.first().__l.__cap_ = __long_mask | __s;} + _LIBCPP_INLINE_VISIBILITY + size_type __get_long_cap() const _NOEXCEPT + {return __r_.first().__l.__cap_ & size_type(~__long_mask);} + + _LIBCPP_INLINE_VISIBILITY + void __set_long_pointer(pointer __p) _NOEXCEPT + {__r_.first().__l.__data_ = __p;} + _LIBCPP_INLINE_VISIBILITY + pointer __get_long_pointer() _NOEXCEPT + {return __r_.first().__l.__data_;} + _LIBCPP_INLINE_VISIBILITY + const_pointer __get_long_pointer() const _NOEXCEPT + {return __r_.first().__l.__data_;} + _LIBCPP_INLINE_VISIBILITY + pointer __get_short_pointer() _NOEXCEPT + {return __r_.first().__s.__data_;} + _LIBCPP_INLINE_VISIBILITY + const_pointer __get_short_pointer() const _NOEXCEPT + {return __r_.first().__s.__data_;} + _LIBCPP_INLINE_VISIBILITY + pointer __get_pointer() _NOEXCEPT + {return __is_long() ? __get_long_pointer() : __get_short_pointer();} + _LIBCPP_INLINE_VISIBILITY + const_pointer __get_pointer() const _NOEXCEPT + {return __is_long() ? __get_long_pointer() : __get_short_pointer();} + + _LIBCPP_INLINE_VISIBILITY + void __zero() _NOEXCEPT + { + size_type (&__a)[__n_words] = __r_.first().__r.__words; + for (unsigned __i = 0; __i < __n_words; ++__i) + __a[__i] = 0; + } + + template <size_type __a> static + _LIBCPP_INLINE_VISIBILITY + size_type __align(size_type __s) _NOEXCEPT + {return __s + (__a-1) & ~(__a-1);} + enum {__alignment = 16}; + static _LIBCPP_INLINE_VISIBILITY + size_type __recommend(size_type __s) _NOEXCEPT + {return (__s < __min_cap ? __min_cap : + __align<sizeof(value_type) < __alignment ? + __alignment/sizeof(value_type) : 1 > (__s+1)) - 1;} + + void __init(const_pointer __s, size_type __sz, size_type __reserve); + void __init(const_pointer __s, size_type __sz); + void __init(size_type __n, value_type __c); + + template <class _InputIterator> + typename enable_if + < + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + void + >::type + __init(_InputIterator __first, _InputIterator __last); + + template <class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + void + >::type + __init(_ForwardIterator __first, _ForwardIterator __last); + + void __grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, + size_type __n_copy, size_type __n_del, size_type __n_add = 0); + void __grow_by_and_replace(size_type __old_cap, size_type __delta_cap, size_type __old_sz, + size_type __n_copy, size_type __n_del, + size_type __n_add, const_pointer __p_new_stuff); + + _LIBCPP_INLINE_VISIBILITY + void __erase_to_end(size_type __pos); + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const basic_string& __str) + {__copy_assign_alloc(__str, integral_constant<bool, + __alloc_traits::propagate_on_container_copy_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const basic_string& __str, true_type) + { + if (__alloc() != __str.__alloc()) + { + clear(); + shrink_to_fit(); + } + __alloc() = __str.__alloc(); + } + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const basic_string&, false_type) _NOEXCEPT + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void __move_assign(basic_string& __str, false_type); + _LIBCPP_INLINE_VISIBILITY + void __move_assign(basic_string& __str, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); +#endif + + _LIBCPP_INLINE_VISIBILITY + void + __move_assign_alloc(basic_string& __str) + _NOEXCEPT_( + !__alloc_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<allocator_type>::value) + {__move_assign_alloc(__str, integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>());} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(basic_string& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(basic_string&, false_type) + _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type& __x, allocator_type& __y) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __alloc_traits::propagate_on_container_swap::value>());} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type&, allocator_type&, false_type) _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); + _LIBCPP_INLINE_VISIBILITY void __invalidate_iterators_past(size_type); + + friend basic_string operator+<>(const basic_string&, const basic_string&); + friend basic_string operator+<>(const value_type*, const basic_string&); + friend basic_string operator+<>(value_type, const basic_string&); + friend basic_string operator+<>(const basic_string&, const value_type*); + friend basic_string operator+<>(const basic_string&, value_type); +}; + +template <class _CharT, class _Traits, class _Allocator> +#ifndef _LIBCPP_DEBUG +_LIBCPP_INLINE_VISIBILITY inline +#endif +void +basic_string<_CharT, _Traits, _Allocator>::__invalidate_all_iterators() +{ +#ifdef _LIBCPP_DEBUG + iterator::__remove_all(this); + const_iterator::__remove_all(this); +#endif // _LIBCPP_DEBUG +} + +template <class _CharT, class _Traits, class _Allocator> +#ifndef _LIBCPP_DEBUG +_LIBCPP_INLINE_VISIBILITY inline +#endif +void +basic_string<_CharT, _Traits, _Allocator>::__invalidate_iterators_past(size_type +#ifdef _LIBCPP_DEBUG + __pos +#endif + ) +{ +#ifdef _LIBCPP_DEBUG + const_iterator __beg = begin(); + if (__iterator_list_.first) + { + for (iterator* __p = __iterator_list_.first; __p;) + { + if (*__p - __beg > static_cast<difference_type>(__pos)) + { + iterator* __n = __p; + __p = __p->__next; + __n->__remove_owner(); + } + else + __p = __p->__next; + } + } + if (__iterator_list_.second) + { + for (const_iterator* __p = __iterator_list_.second; __p;) + { + if (*__p - __beg > static_cast<difference_type>(__pos)) + { + const_iterator* __n = __p; + __p = __p->__next; + __n->__remove_owner(); + } + else + __p = __p->__next; + } + } +#endif // _LIBCPP_DEBUG +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) +{ + __zero(); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(const allocator_type& __a) + : __r_(__a) +{ + __zero(); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz, size_type __reserve) +{ + if (__reserve > max_size()) + this->__throw_length_error(); + pointer __p; + if (__reserve < __min_cap) + { + __set_short_size(__sz); + __p = __get_short_pointer(); + } + else + { + size_type __cap = __recommend(__reserve); + __p = __alloc_traits::allocate(__alloc(), __cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); + __set_long_size(__sz); + } + traits_type::copy(__p, __s, __sz); + traits_type::assign(__p[__sz], value_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::__init(const_pointer __s, size_type __sz) +{ + if (__sz > max_size()) + this->__throw_length_error(); + pointer __p; + if (__sz < __min_cap) + { + __set_short_size(__sz); + __p = __get_short_pointer(); + } + else + { + size_type __cap = __recommend(__sz); + __p = __alloc_traits::allocate(__alloc(), __cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); + __set_long_size(__sz); + } + traits_type::copy(__p, __s, __sz); + traits_type::assign(__p[__sz], value_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + __init(__s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, const allocator_type& __a) + : __r_(__a) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + __init(__s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + __init(__s, __n); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(const_pointer __s, size_type __n, const allocator_type& __a) + : __r_(__a) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + __init(__s, __n); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str) + : __r_(__alloc_traits::select_on_container_copy_construction(__str.__alloc())) +{ + if (!__str.__is_long()) + __r_.first().__r = __str.__r_.first().__r; + else + __init(__str.__get_long_pointer(), __str.__get_long_size()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, const allocator_type& __a) + : __r_(__a) +{ + if (!__str.__is_long()) + __r_.first().__r = __str.__r_.first().__r; + else + __init(__str.__get_long_pointer(), __str.__get_long_size()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __r_(_VSTD::move(__str.__r_)) +{ + __str.__zero(); +#ifdef _LIBCPP_DEBUG + __str.__invalidate_all_iterators(); +#endif +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(basic_string&& __str, const allocator_type& __a) + : __r_(__a) +{ + if (__a == __str.__alloc() || !__str.__is_long()) + __r_.first().__r = __str.__r_.first().__r; + else + __init(__str.__get_long_pointer(), __str.__get_long_size()); + __str.__zero(); +#ifdef _LIBCPP_DEBUG + __str.__invalidate_all_iterators(); +#endif +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::__init(size_type __n, value_type __c) +{ + if (__n > max_size()) + this->__throw_length_error(); + pointer __p; + if (__n < __min_cap) + { + __set_short_size(__n); + __p = __get_short_pointer(); + } + else + { + size_type __cap = __recommend(__n); + __p = __alloc_traits::allocate(__alloc(), __cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); + __set_long_size(__n); + } + traits_type::assign(__p, __n, __c); + traits_type::assign(__p[__n], value_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c) +{ + __init(__n, __c); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(size_type __n, value_type __c, const allocator_type& __a) + : __r_(__a) +{ + __init(__n, __c); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>::basic_string(const basic_string& __str, size_type __pos, size_type __n, + const allocator_type& __a) + : __r_(__a) +{ + size_type __str_sz = __str.size(); + if (__pos > __str_sz) + this->__throw_out_of_range(); + __init(__str.data() + __pos, _VSTD::min(__n, __str_sz - __pos)); +} + +template <class _CharT, class _Traits, class _Allocator> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + void +>::type +basic_string<_CharT, _Traits, _Allocator>::__init(_InputIterator __first, _InputIterator __last) +{ + __zero(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __first != __last; ++__first) + push_back(*__first); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + if (__is_long()) + __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _CharT, class _Traits, class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +basic_string<_CharT, _Traits, _Allocator>::__init(_ForwardIterator __first, _ForwardIterator __last) +{ + size_type __sz = static_cast<size_type>(_VSTD::distance(__first, __last)); + if (__sz > max_size()) + this->__throw_length_error(); + pointer __p; + if (__sz < __min_cap) + { + __set_short_size(__sz); + __p = __get_short_pointer(); + } + else + { + size_type __cap = __recommend(__sz); + __p = __alloc_traits::allocate(__alloc(), __cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); + __set_long_size(__sz); + } + for (; __first != __last; ++__first, ++__p) + traits_type::assign(*__p, *__first); + traits_type::assign(*__p, value_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last) +{ + __init(__first, __last); +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(_InputIterator __first, _InputIterator __last, + const allocator_type& __a) + : __r_(__a) +{ + __init(__first, __last); +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il) +{ + __init(__il.begin(), __il.end()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>::basic_string(initializer_list<value_type> __il, const allocator_type& __a) + : __r_(__a) +{ + __init(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>::~basic_string() +{ + __invalidate_all_iterators(); + if (__is_long()) + __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::__grow_by_and_replace + (size_type __old_cap, size_type __delta_cap, size_type __old_sz, + size_type __n_copy, size_type __n_del, size_type __n_add, const_pointer __p_new_stuff) +{ + size_type __ms = max_size(); + if (__delta_cap > __ms - __old_cap - 1) + this->__throw_length_error(); + pointer __old_p = __get_pointer(); + size_type __cap = __old_cap < __ms / 2 - __alignment ? + __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : + __ms - 1; + pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); + __invalidate_all_iterators(); + if (__n_copy != 0) + traits_type::copy(__p, __old_p, __n_copy); + if (__n_add != 0) + traits_type::copy(__p + __n_copy, __p_new_stuff, __n_add); + size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; + if (__sec_cp_sz != 0) + traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz); + if (__old_cap+1 != __min_cap) + __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); + __old_sz = __n_copy + __n_add + __sec_cp_sz; + __set_long_size(__old_sz); + traits_type::assign(__p[__old_sz], value_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::__grow_by(size_type __old_cap, size_type __delta_cap, size_type __old_sz, + size_type __n_copy, size_type __n_del, size_type __n_add) +{ + size_type __ms = max_size(); + if (__delta_cap > __ms - __old_cap - 1) + this->__throw_length_error(); + pointer __old_p = __get_pointer(); + size_type __cap = __old_cap < __ms / 2 - __alignment ? + __recommend(_VSTD::max(__old_cap + __delta_cap, 2 * __old_cap)) : + __ms - 1; + pointer __p = __alloc_traits::allocate(__alloc(), __cap+1); + __invalidate_all_iterators(); + if (__n_copy != 0) + traits_type::copy(__p, __old_p, __n_copy); + size_type __sec_cp_sz = __old_sz - __n_del - __n_copy; + if (__sec_cp_sz != 0) + traits_type::copy(__p + __n_copy + __n_add, __old_p + __n_copy + __n_del, __sec_cp_sz); + if (__old_cap+1 != __min_cap) + __alloc_traits::deallocate(__alloc(), __old_p, __old_cap+1); + __set_long_pointer(__p); + __set_long_cap(__cap+1); +} + +// assign + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s, size_type __n) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __cap = capacity(); + if (__cap >= __n) + { + pointer __p = __get_pointer(); + traits_type::move(__p, __s, __n); + traits_type::assign(__p[__n], value_type()); + __set_size(__n); + __invalidate_iterators_past(__n); + } + else + { + size_type __sz = size(); + __grow_by_and_replace(__cap, __n - __cap, __sz, 0, __sz, __n, __s); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::assign(size_type __n, value_type __c) +{ + size_type __cap = capacity(); + if (__cap < __n) + { + size_type __sz = size(); + __grow_by(__cap, __n - __cap, __sz, 0, __sz); + } + else + __invalidate_iterators_past(__n); + pointer __p = __get_pointer(); + traits_type::assign(__p, __n, __c); + traits_type::assign(__p[__n], value_type()); + __set_size(__n); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::operator=(value_type __c) +{ + pointer __p; + if (__is_long()) + { + __p = __get_long_pointer(); + __set_long_size(1); + } + else + { + __p = __get_short_pointer(); + __set_short_size(1); + } + traits_type::assign(*__p, __c); + traits_type::assign(*++__p, value_type()); + __invalidate_iterators_past(1); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::operator=(const basic_string& __str) +{ + if (this != &__str) + { + __copy_assign_alloc(__str); + assign(__str); + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, false_type) +{ + if (__alloc() != __str.__alloc()) + assign(__str); + else + __move_assign(__str, true_type()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) +{ + clear(); + shrink_to_fit(); + __r_.first() = __str.__r_.first(); + __move_assign_alloc(__str); + __str.__zero(); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::operator=(basic_string&& __str) + _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) +{ + __move_assign(__str, integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +#endif + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + basic_string<_CharT, _Traits, _Allocator>& +>::type +basic_string<_CharT, _Traits, _Allocator>::assign(_InputIterator __first, _InputIterator __last) +{ + clear(); + for (; __first != __last; ++__first) + push_back(*__first); +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + basic_string<_CharT, _Traits, _Allocator>& +>::type +basic_string<_CharT, _Traits, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) +{ + size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); + size_type __cap = capacity(); + if (__cap < __n) + { + size_type __sz = size(); + __grow_by(__cap, __n - __cap, __sz, 0, __sz); + } + else + __invalidate_iterators_past(__n); + pointer __p = __get_pointer(); + for (; __first != __last; ++__first, ++__p) + traits_type::assign(*__p, *__first); + traits_type::assign(*__p, value_type()); + __set_size(__n); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str) +{ + return assign(__str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::assign(const basic_string& __str, size_type __pos, size_type __n) +{ + size_type __sz = __str.size(); + if (__pos > __sz) + this->__throw_out_of_range(); + return assign(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::assign(const_pointer __s) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return assign(__s, traits_type::length(__s)); +} + +// append + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s, size_type __n) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __cap = capacity(); + size_type __sz = size(); + if (__cap - __sz >= __n) + { + if (__n) + { + pointer __p = __get_pointer(); + traits_type::copy(__p + __sz, __s, __n); + __sz += __n; + __set_size(__sz); + traits_type::assign(__p[__sz], value_type()); + } + } + else + __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __sz, 0, __n, __s); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::append(size_type __n, value_type __c) +{ + if (__n) + { + size_type __cap = capacity(); + size_type __sz = size(); + if (__cap - __sz < __n) + __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); + pointer __p = __get_pointer(); + traits_type::assign(__p + __sz, __n, __c); + __sz += __n; + __set_size(__sz); + traits_type::assign(__p[__sz], value_type()); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::push_back(value_type __c) +{ + size_type __cap = capacity(); + size_type __sz = size(); + if (__sz == __cap) + __grow_by(__cap, 1, __sz, __sz, 0); + pointer __p = __get_pointer() + __sz; + traits_type::assign(*__p, __c); + traits_type::assign(*++__p, value_type()); + __set_size(__sz+1); +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + basic_string<_CharT, _Traits, _Allocator>& +>::type +basic_string<_CharT, _Traits, _Allocator>::append(_InputIterator __first, _InputIterator __last) +{ + for (; __first != __last; ++__first) + push_back(*__first); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + basic_string<_CharT, _Traits, _Allocator>& +>::type +basic_string<_CharT, _Traits, _Allocator>::append(_ForwardIterator __first, _ForwardIterator __last) +{ + size_type __sz = size(); + size_type __cap = capacity(); + size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); + if (__n) + { + if (__cap - __sz < __n) + __grow_by(__cap, __sz + __n - __cap, __sz, __sz, 0); + pointer __p = __get_pointer() + __sz; + for (; __first != __last; ++__p, ++__first) + traits_type::assign(*__p, *__first); + traits_type::assign(*__p, value_type()); + __set_size(__sz + __n); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str) +{ + return append(__str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::append(const basic_string& __str, size_type __pos, size_type __n) +{ + size_type __sz = __str.size(); + if (__pos > __sz) + this->__throw_out_of_range(); + return append(__str.data() + __pos, _VSTD::min(__n, __sz - __pos)); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::append(const_pointer __s) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return append(__s, traits_type::length(__s)); +} + +// insert + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s, size_type __n) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + size_type __cap = capacity(); + if (__cap - __sz >= __n) + { + if (__n) + { + pointer __p = __get_pointer(); + size_type __n_move = __sz - __pos; + if (__n_move != 0) + { + if (__p + __pos <= __s && __s < __p + __sz) + __s += __n; + traits_type::move(__p + __pos + __n, __p + __pos, __n_move); + } + traits_type::move(__p + __pos, __s, __n); + __sz += __n; + __set_size(__sz); + traits_type::assign(__p[__sz], value_type()); + } + } + else + __grow_by_and_replace(__cap, __sz + __n - __cap, __sz, __pos, 0, __n, __s); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, size_type __n, value_type __c) +{ + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + if (__n) + { + size_type __cap = capacity(); + pointer __p; + if (__cap - __sz >= __n) + { + __p = __get_pointer(); + size_type __n_move = __sz - __pos; + if (__n_move != 0) + traits_type::move(__p + __pos + __n, __p + __pos, __n_move); + } + else + { + __grow_by(__cap, __sz + __n - __cap, __sz, __pos, 0, __n); + __p = __get_long_pointer(); + } + traits_type::assign(__p + __pos, __n, __c); + __sz += __n; + __set_size(__sz); + traits_type::assign(__p[__sz], value_type()); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + typename basic_string<_CharT, _Traits, _Allocator>::iterator +>::type +basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _InputIterator __first, _InputIterator __last) +{ + size_type __old_sz = size(); + difference_type __ip = __pos - begin(); + for (; __first != __last; ++__first) + push_back(*__first); + pointer __p = __get_pointer(); + _VSTD::rotate(__p + __ip, __p + __old_sz, __p + size()); + return iterator(__p + __ip); +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + typename basic_string<_CharT, _Traits, _Allocator>::iterator +>::type +basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, _ForwardIterator __first, _ForwardIterator __last) +{ + size_type __ip = static_cast<size_type>(__pos - begin()); + size_type __sz = size(); + size_type __cap = capacity(); + size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); + if (__n) + { + pointer __p; + if (__cap - __sz >= __n) + { + __p = __get_pointer(); + size_type __n_move = __sz - __ip; + if (__n_move != 0) + traits_type::move(__p + __ip + __n, __p + __ip, __n_move); + } + else + { + __grow_by(__cap, __sz + __n - __cap, __sz, __ip, 0, __n); + __p = __get_long_pointer(); + } + __sz += __n; + __set_size(__sz); + traits_type::assign(__p[__sz], value_type()); + for (__p += __ip; __first != __last; ++__p, ++__first) + traits_type::assign(*__p, *__first); + } + return begin() + __ip; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str) +{ + return insert(__pos1, __str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos1, const basic_string& __str, + size_type __pos2, size_type __n) +{ + size_type __str_sz = __str.size(); + if (__pos2 > __str_sz) + this->__throw_out_of_range(); + return insert(__pos1, __str.data() + __pos2, _VSTD::min(__n, __str_sz - __pos2)); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::insert(size_type __pos, const_pointer __s) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return insert(__pos, __s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::iterator +basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, value_type __c) +{ + size_type __ip = static_cast<size_type>(__pos - begin()); + size_type __sz = size(); + size_type __cap = capacity(); + pointer __p; + if (__cap == __sz) + { + __grow_by(__cap, 1, __sz, __ip, 0, 1); + __p = __get_long_pointer(); + } + else + { + __p = __get_pointer(); + size_type __n_move = __sz - __ip; + if (__n_move != 0) + traits_type::move(__p + __ip + 1, __p + __ip, __n_move); + } + traits_type::assign(__p[__ip], __c); + traits_type::assign(__p[++__sz], value_type()); + __set_size(__sz); + return begin() + static_cast<difference_type>(__ip); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::iterator +basic_string<_CharT, _Traits, _Allocator>::insert(const_iterator __pos, size_type __n, value_type __c) +{ + difference_type __p = __pos - begin(); + insert(static_cast<size_type>(__p), __n, __c); + return begin() + __p; +} + +// replace + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s, size_type __n2) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + __n1 = _VSTD::min(__n1, __sz - __pos); + size_type __cap = capacity(); + if (__cap - __sz + __n1 >= __n2) + { + pointer __p = __get_pointer(); + if (__n1 != __n2) + { + size_type __n_move = __sz - __pos - __n1; + if (__n_move != 0) + { + if (__n1 > __n2) + { + traits_type::move(__p + __pos, __s, __n2); + traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); + goto __finish; + } + if (__p + __pos < __s && __s < __p + __sz) + { + if (__p + __pos + __n1 <= __s) + __s += __n2 - __n1; + else // __p + __pos < __s < __p + __pos + __n1 + { + traits_type::move(__p + __pos, __s, __n1); + __pos += __n1; + __s += __n2; + __n2 -= __n1; + __n1 = 0; + } + } + traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); + } + } + traits_type::move(__p + __pos, __s, __n2); +__finish: + __sz += __n2 - __n1; + __set_size(__sz); + __invalidate_iterators_past(__sz); + traits_type::assign(__p[__sz], value_type()); + } + else + __grow_by_and_replace(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2, __s); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, size_type __n2, value_type __c) +{ + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + __n1 = _VSTD::min(__n1, __sz - __pos); + size_type __cap = capacity(); + pointer __p; + if (__cap - __sz + __n1 >= __n2) + { + __p = __get_pointer(); + if (__n1 != __n2) + { + size_type __n_move = __sz - __pos - __n1; + if (__n_move != 0) + traits_type::move(__p + __pos + __n2, __p + __pos + __n1, __n_move); + } + } + else + { + __grow_by(__cap, __sz - __n1 + __n2 - __cap, __sz, __pos, __n1, __n2); + __p = __get_long_pointer(); + } + traits_type::assign(__p + __pos, __n2, __c); + __sz += __n2 - __n1; + __set_size(__sz); + __invalidate_iterators_past(__sz); + traits_type::assign(__p[__sz], value_type()); + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +template<class _InputIterator> +typename enable_if +< + __is_input_iterator<_InputIterator>::value, + basic_string<_CharT, _Traits, _Allocator>& +>::type +basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, + _InputIterator __j1, _InputIterator __j2) +{ + for (; true; ++__i1, ++__j1) + { + if (__i1 == __i2) + { + if (__j1 != __j2) + insert(__i1, __j1, __j2); + break; + } + if (__j1 == __j2) + { + erase(__i1, __i2); + break; + } + traits_type::assign(const_cast<value_type&>(*__i1), *__j1); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str) +{ + return replace(__pos1, __n1, __str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos1, size_type __n1, const basic_string& __str, + size_type __pos2, size_type __n2) +{ + size_type __str_sz = __str.size(); + if (__pos2 > __str_sz) + this->__throw_out_of_range(); + return replace(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, __str_sz - __pos2)); +} + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(size_type __pos, size_type __n1, const_pointer __s) +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return replace(__pos, __n1, __s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const basic_string& __str) +{ + return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), + __str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s, size_type __n) +{ + return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s, __n); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, const_pointer __s) +{ + return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __s); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::replace(const_iterator __i1, const_iterator __i2, size_type __n, value_type __c) +{ + return replace(static_cast<size_type>(__i1 - begin()), static_cast<size_type>(__i2 - __i1), __n, __c); +} + +// erase + +template <class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator>& +basic_string<_CharT, _Traits, _Allocator>::erase(size_type __pos, size_type __n) +{ + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + if (__n) + { + pointer __p = __get_pointer(); + __n = _VSTD::min(__n, __sz - __pos); + size_type __n_move = __sz - __pos - __n; + if (__n_move != 0) + traits_type::move(__p + __pos, __p + __pos + __n, __n_move); + __sz -= __n; + __set_size(__sz); + __invalidate_iterators_past(__sz); + traits_type::assign(__p[__sz], value_type()); + } + return *this; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::iterator +basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __pos) +{ + iterator __b = begin(); + size_type __r = static_cast<size_type>(__pos - __b); + erase(__r, 1); + return __b + static_cast<difference_type>(__r); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::iterator +basic_string<_CharT, _Traits, _Allocator>::erase(const_iterator __first, const_iterator __last) +{ + iterator __b = begin(); + size_type __r = static_cast<size_type>(__first - __b); + erase(__r, static_cast<size_type>(__last - __first)); + return __b + static_cast<difference_type>(__r); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::pop_back() +{ +#ifdef _LIBCPP_DEBUG + assert(!empty()); +#endif + size_type __sz; + if (__is_long()) + { + __sz = __get_long_size() - 1; + __set_long_size(__sz); + traits_type::assign(*(__get_long_pointer() + __sz), value_type()); + } + else + { + __sz = __get_short_size() - 1; + __set_short_size(__sz); + traits_type::assign(*(__get_short_pointer() + __sz), value_type()); + } + __invalidate_iterators_past(__sz); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::clear() _NOEXCEPT +{ + __invalidate_all_iterators(); + if (__is_long()) + { + traits_type::assign(*__get_long_pointer(), value_type()); + __set_long_size(0); + } + else + { + traits_type::assign(*__get_short_pointer(), value_type()); + __set_short_size(0); + } +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::__erase_to_end(size_type __pos) +{ + if (__is_long()) + { + traits_type::assign(*(__get_long_pointer() + __pos), value_type()); + __set_long_size(__pos); + } + else + { + traits_type::assign(*(__get_short_pointer() + __pos), value_type()); + __set_short_size(__pos); + } + __invalidate_iterators_past(__pos); +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::resize(size_type __n, value_type __c) +{ + size_type __sz = size(); + if (__n > __sz) + append(__n - __sz, __c); + else + __erase_to_end(__n); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::max_size() const _NOEXCEPT +{ + size_type __m = __alloc_traits::max_size(__alloc()); +#if _LIBCPP_BIG_ENDIAN + return (__m <= ~__long_mask ? __m : __m/2) - 1; +#else + return __m - 1; +#endif +} + +template <class _CharT, class _Traits, class _Allocator> +void +basic_string<_CharT, _Traits, _Allocator>::reserve(size_type __res_arg) +{ + if (__res_arg > max_size()) + this->__throw_length_error(); + size_type __cap = capacity(); + size_type __sz = size(); + __res_arg = _VSTD::max(__res_arg, __sz); + __res_arg = __recommend(__res_arg); + if (__res_arg != __cap) + { + pointer __new_data, __p; + bool __was_long, __now_long; + if (__res_arg == __min_cap - 1) + { + __was_long = true; + __now_long = false; + __new_data = __get_short_pointer(); + __p = __get_long_pointer(); + } + else + { + if (__res_arg > __cap) + __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); + else + { + #ifndef _LIBCPP_NO_EXCEPTIONS + try + { + #endif // _LIBCPP_NO_EXCEPTIONS + __new_data = __alloc_traits::allocate(__alloc(), __res_arg+1); + #ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + return; + } + #else // _LIBCPP_NO_EXCEPTIONS + if (__new_data == 0) + return; + #endif // _LIBCPP_NO_EXCEPTIONS + } + __now_long = true; + __was_long = __is_long(); + __p = __get_pointer(); + } + traits_type::copy(__new_data, __p, size()+1); + if (__was_long) + __alloc_traits::deallocate(__alloc(), __p, __cap+1); + if (__now_long) + { + __set_long_cap(__res_arg+1); + __set_long_size(__sz); + __set_long_pointer(__new_data); + } + else + __set_short_size(__sz); + __invalidate_all_iterators(); + } +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::const_reference +basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) const +{ +#ifdef __LIBCPP_DEBUG + assert(__pos <= size()); +#endif + return *(data() + __pos); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::reference +basic_string<_CharT, _Traits, _Allocator>::operator[](size_type __pos) +{ +#ifdef __LIBCPP_DEBUG + assert(__pos < size()); +#endif + return *(__get_pointer() + __pos); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::const_reference +basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) const +{ + if (__n >= size()) + this->__throw_out_of_range(); + return (*this)[__n]; +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::reference +basic_string<_CharT, _Traits, _Allocator>::at(size_type __n) +{ + if (__n >= size()) + this->__throw_out_of_range(); + return (*this)[__n]; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::reference +basic_string<_CharT, _Traits, _Allocator>::front() +{ +#ifdef _LIBCPP_DEBUG + assert(!empty()); +#endif + return *__get_pointer(); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::const_reference +basic_string<_CharT, _Traits, _Allocator>::front() const +{ +#ifdef _LIBCPP_DEBUG + assert(!empty()); +#endif + return *data(); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::reference +basic_string<_CharT, _Traits, _Allocator>::back() +{ +#ifdef _LIBCPP_DEBUG + assert(!empty()); +#endif + return *(__get_pointer() + size() - 1); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::const_reference +basic_string<_CharT, _Traits, _Allocator>::back() const +{ +#ifdef _LIBCPP_DEBUG + assert(!empty()); +#endif + return *(data() + size() - 1); +} + +template <class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::copy(pointer __s, size_type __n, size_type __pos) const +{ + size_type __sz = size(); + if (__pos > __sz) + this->__throw_out_of_range(); + size_type __rlen = _VSTD::min(__n, __sz - __pos); + traits_type::copy(__s, data() + __pos, __rlen); + return __rlen; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +basic_string<_CharT, _Traits, _Allocator>::substr(size_type __pos, size_type __n) const +{ + return basic_string(*this, __pos, __n, __alloc()); +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +basic_string<_CharT, _Traits, _Allocator>::swap(basic_string& __str) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) +{ + _VSTD::swap(__r_.first(), __str.__r_.first()); + __swap_alloc(__alloc(), __str.__alloc()); +#ifdef _LIBCPP_DEBUG + __invalidate_all_iterators(); + __str.__invalidate_all_iterators(); +#endif // _LIBCPP_DEBUG +} + +// find + +template <class _Traits> +struct _LIBCPP_HIDDEN __traits_eq +{ + typedef typename _Traits::char_type char_type; + _LIBCPP_INLINE_VISIBILITY + bool operator()(const char_type& __x, const char_type& __y) _NOEXCEPT + {return _Traits::eq(__x, __y);} +}; + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos > __sz || __sz - __pos < __n) + return npos; + if (__n == 0) + return __pos; + const_pointer __p = data(); + const_pointer __r = _VSTD::search(__p + __pos, __p + __sz, __s, __s + __n, + __traits_eq<traits_type>()); + if (__r == __p + __sz) + return npos; + return static_cast<size_type>(__r - __p); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return find(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return find(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find(value_type __c, + size_type __pos) const _NOEXCEPT +{ + size_type __sz = size(); + if (__pos >= __sz) + return npos; + const_pointer __p = data(); + const_pointer __r = traits_type::find(__p + __pos, __sz - __pos, __c); + if (__r == 0) + return npos; + return static_cast<size_type>(__r - __p); +} + +// rfind + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + __pos = _VSTD::min(__pos, __sz); + if (__n < __sz - __pos) + __pos += __n; + else + __pos = __sz; + const_pointer __p = data(); + const_pointer __r = _VSTD::find_end(__p, __p + __pos, __s, __s + __n, + __traits_eq<traits_type>()); + if (__n > 0 && __r == __p + __pos) + return npos; + return static_cast<size_type>(__r - __p); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::rfind(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return rfind(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::rfind(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return rfind(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::rfind(value_type __c, + size_type __pos) const _NOEXCEPT +{ + size_type __sz = size(); + if (__sz) + { + if (__pos < __sz) + ++__pos; + else + __pos = __sz; + const_pointer __p = data(); + for (const_pointer __ps = __p + __pos; __ps != __p;) + { + if (traits_type::eq(*--__ps, __c)) + return static_cast<size_type>(__ps - __p); + } + } + return npos; +} + +// find_first_of + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos >= __sz || __n == 0) + return npos; + const_pointer __p = data(); + const_pointer __r = _VSTD::find_first_of(__p + __pos, __p + __sz, __s, + __s + __n, __traits_eq<traits_type>()); + if (__r == __p + __sz) + return npos; + return static_cast<size_type>(__r - __p); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_of(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return find_first_of(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_of(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return find_first_of(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_of(value_type __c, + size_type __pos) const _NOEXCEPT +{ + return find(__c, __pos); +} + +// find_last_of + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + if (__n != 0) + { + size_type __sz = size(); + if (__pos < __sz) + ++__pos; + else + __pos = __sz; + const_pointer __p = data(); + for (const_pointer __ps = __p + __pos; __ps != __p;) + { + const_pointer __r = traits_type::find(__s, __n, *--__ps); + if (__r) + return static_cast<size_type>(__ps - __p); + } + } + return npos; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_of(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return find_last_of(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_of(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return find_last_of(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_of(value_type __c, + size_type __pos) const _NOEXCEPT +{ + return rfind(__c, __pos); +} + +// find_first_not_of + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos < __sz) + { + const_pointer __p = data(); + const_pointer __pe = __p + __sz; + for (const_pointer __ps = __p + __pos; __ps != __pe; ++__ps) + if (traits_type::find(__s, __n, *__ps) == 0) + return static_cast<size_type>(__ps - __p); + } + return npos; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return find_first_not_of(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return find_first_not_of(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_first_not_of(value_type __c, + size_type __pos) const _NOEXCEPT +{ + size_type __sz = size(); + if (__pos < __sz) + { + const_pointer __p = data(); + const_pointer __pe = __p + __sz; + for (const_pointer __ps = __p + __pos; __p != __pe; ++__ps) + if (!traits_type::eq(*__ps, __c)) + return static_cast<size_type>(__ps - __p); + } + return npos; +} + +// find_last_not_of + +template<class _CharT, class _Traits, class _Allocator> +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s, + size_type __pos, + size_type __n) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos < __sz) + ++__pos; + else + __pos = __sz; + const_pointer __p = data(); + for (const_pointer __ps = __p + __pos; __ps != __p;) + if (traits_type::find(__s, __n, *--__ps) == 0) + return static_cast<size_type>(__ps - __p); + return npos; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const basic_string& __str, + size_type __pos) const _NOEXCEPT +{ + return find_last_not_of(__str.data(), __pos, __str.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(const_pointer __s, + size_type __pos) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return find_last_not_of(__s, __pos, traits_type::length(__s)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename basic_string<_CharT, _Traits, _Allocator>::size_type +basic_string<_CharT, _Traits, _Allocator>::find_last_not_of(value_type __c, + size_type __pos) const _NOEXCEPT +{ + size_type __sz = size(); + if (__pos < __sz) + ++__pos; + else + __pos = __sz; + const_pointer __p = data(); + for (const_pointer __ps = __p + __pos; __ps != __p;) + if (!traits_type::eq(*--__ps, __c)) + return static_cast<size_type>(__ps - __p); + return npos; +} + +// compare + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +int +basic_string<_CharT, _Traits, _Allocator>::compare(const basic_string& __str) const _NOEXCEPT +{ + size_t __lhs_sz = size(); + size_t __rhs_sz = __str.size(); + int __result = traits_type::compare(data(), __str.data(), + _VSTD::min(__lhs_sz, __rhs_sz)); + if (__result != 0) + return __result; + if (__lhs_sz < __rhs_sz) + return -1; + if (__lhs_sz > __rhs_sz) + return 1; + return 0; +} + +template <class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +int +basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, + size_type __n1, + const basic_string& __str) const +{ + return compare(__pos1, __n1, __str.data(), __str.size()); +} + +template <class _CharT, class _Traits, class _Allocator> +int +basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, + size_type __n1, + const basic_string& __str, + size_type __pos2, + size_type __n2) const +{ + size_type __sz = __str.size(); + if (__pos2 > __sz) + this->__throw_out_of_range(); + return compare(__pos1, __n1, __str.data() + __pos2, _VSTD::min(__n2, + __sz - __pos2)); +} + +template <class _CharT, class _Traits, class _Allocator> +int +basic_string<_CharT, _Traits, _Allocator>::compare(const_pointer __s) const _NOEXCEPT +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return compare(0, npos, __s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +int +basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, + size_type __n1, + const_pointer __s) const +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + return compare(__pos1, __n1, __s, traits_type::length(__s)); +} + +template <class _CharT, class _Traits, class _Allocator> +int +basic_string<_CharT, _Traits, _Allocator>::compare(size_type __pos1, + size_type __n1, + const_pointer __s, + size_type __n2) const +{ +#ifdef _LIBCPP_DEBUG + assert(__s != 0); +#endif + size_type __sz = size(); + if (__pos1 > __sz || __n2 == npos) + this->__throw_out_of_range(); + size_type __rlen = _VSTD::min(__n1, __sz - __pos1); + int __r = traits_type::compare(data() + __pos1, __s, _VSTD::min(__rlen, __n2)); + if (__r == 0) + { + if (__rlen < __n2) + __r = -1; + else if (__rlen > __n2) + __r = 1; + } + return __r; +} + +// __invariants + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +basic_string<_CharT, _Traits, _Allocator>::__invariants() const +{ + if (size() > capacity()) + return false; + if (capacity() < __min_cap - 1) + return false; + if (data() == 0) + return false; + if (data()[size()] != value_type(0)) + return false; + return true; +} + +// operator== + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __lhs.size() == __rhs.size() && _Traits::compare(__lhs.data(), + __rhs.data(), + __lhs.size()) == 0; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __rhs.compare(__lhs) == 0; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const basic_string<_CharT,_Traits,_Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return __lhs.compare(__rhs) == 0; +} + +// operator!= + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const basic_string<_CharT,_Traits,_Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__lhs == __rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__lhs == __rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return !(__lhs == __rhs); +} + +// operator< + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __lhs.compare(__rhs) < 0; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator< (const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return __lhs.compare(__rhs) < 0; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator< (const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __rhs.compare(__lhs) > 0; +} + +// operator> + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __rhs < __lhs; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator> (const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return __rhs < __lhs; +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator> (const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return __rhs < __lhs; +} + +// operator<= + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__rhs < __lhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return !(__rhs < __lhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__rhs < __lhs); +} + +// operator>= + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__lhs < __rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const _CharT* __rhs) _NOEXCEPT +{ + return !(__lhs < __rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const _CharT* __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) _NOEXCEPT +{ + return !(__lhs < __rhs); +} + +// operator + + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, + const basic_string<_CharT, _Traits, _Allocator>& __rhs) +{ + basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); + __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); + __r.append(__rhs.data(), __rhs_sz); + return __r; +} + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const _CharT* __lhs , const basic_string<_CharT,_Traits,_Allocator>& __rhs) +{ + basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = _Traits::length(__lhs); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); + __r.__init(__lhs, __lhs_sz, __lhs_sz + __rhs_sz); + __r.append(__rhs.data(), __rhs_sz); + return __r; +} + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(_CharT __lhs, const basic_string<_CharT,_Traits,_Allocator>& __rhs) +{ + basic_string<_CharT, _Traits, _Allocator> __r(__rhs.get_allocator()); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = __rhs.size(); + __r.__init(&__lhs, 1, 1 + __rhs_sz); + __r.append(__rhs.data(), __rhs_sz); + return __r; +} + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, const _CharT* __rhs) +{ + basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __rhs_sz = _Traits::length(__rhs); + __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + __rhs_sz); + __r.append(__rhs, __rhs_sz); + return __r; +} + +template<class _CharT, class _Traits, class _Allocator> +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, _CharT __rhs) +{ + basic_string<_CharT, _Traits, _Allocator> __r(__lhs.get_allocator()); + typename basic_string<_CharT, _Traits, _Allocator>::size_type __lhs_sz = __lhs.size(); + __r.__init(__lhs.data(), __lhs_sz, __lhs_sz + 1); + __r.push_back(__rhs); + return __r; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const basic_string<_CharT, _Traits, _Allocator>& __rhs) +{ + return _VSTD::move(__lhs.append(__rhs)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(const basic_string<_CharT, _Traits, _Allocator>& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) +{ + return _VSTD::move(__rhs.insert(0, __lhs)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, basic_string<_CharT, _Traits, _Allocator>&& __rhs) +{ + return _VSTD::move(__lhs.append(__rhs)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(const _CharT* __lhs , basic_string<_CharT,_Traits,_Allocator>&& __rhs) +{ + return _VSTD::move(__rhs.insert(0, __lhs)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(_CharT __lhs, basic_string<_CharT,_Traits,_Allocator>&& __rhs) +{ + __rhs.insert(__rhs.begin(), __lhs); + return _VSTD::move(__rhs); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, const _CharT* __rhs) +{ + return _VSTD::move(__lhs.append(__rhs)); +} + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +basic_string<_CharT, _Traits, _Allocator> +operator+(basic_string<_CharT, _Traits, _Allocator>&& __lhs, _CharT __rhs) +{ + __lhs.push_back(__rhs); + return _VSTD::move(__lhs); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +// swap + +template<class _CharT, class _Traits, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(basic_string<_CharT, _Traits, _Allocator>& __lhs, + basic_string<_CharT, _Traits, _Allocator>& __rhs) + _NOEXCEPT_(_NOEXCEPT_(__lhs.swap(__rhs))) +{ + __lhs.swap(__rhs); +} + +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS + +typedef basic_string<char16_t> u16string; +typedef basic_string<char32_t> u32string; + +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS + +int stoi (const string& __str, size_t* __idx = 0, int __base = 10); +long stol (const string& __str, size_t* __idx = 0, int __base = 10); +unsigned long stoul (const string& __str, size_t* __idx = 0, int __base = 10); +long long stoll (const string& __str, size_t* __idx = 0, int __base = 10); +unsigned long long stoull(const string& __str, size_t* __idx = 0, int __base = 10); + +float stof (const string& __str, size_t* __idx = 0); +double stod (const string& __str, size_t* __idx = 0); +long double stold(const string& __str, size_t* __idx = 0); + +string to_string(int __val); +string to_string(unsigned __val); +string to_string(long __val); +string to_string(unsigned long __val); +string to_string(long long __val); +string to_string(unsigned long long __val); +string to_string(float __val); +string to_string(double __val); +string to_string(long double __val); + +int stoi (const wstring& __str, size_t* __idx = 0, int __base = 10); +long stol (const wstring& __str, size_t* __idx = 0, int __base = 10); +unsigned long stoul (const wstring& __str, size_t* __idx = 0, int __base = 10); +long long stoll (const wstring& __str, size_t* __idx = 0, int __base = 10); +unsigned long long stoull(const wstring& __str, size_t* __idx = 0, int __base = 10); + +float stof (const wstring& __str, size_t* __idx = 0); +double stod (const wstring& __str, size_t* __idx = 0); +long double stold(const wstring& __str, size_t* __idx = 0); + +wstring to_wstring(int __val); +wstring to_wstring(unsigned __val); +wstring to_wstring(long __val); +wstring to_wstring(unsigned long __val); +wstring to_wstring(long long __val); +wstring to_wstring(unsigned long long __val); +wstring to_wstring(float __val); +wstring to_wstring(double __val); +wstring to_wstring(long double __val); + +template<class _CharT, class _Traits, class _Allocator> + const typename basic_string<_CharT, _Traits, _Allocator>::size_type + basic_string<_CharT, _Traits, _Allocator>::npos; + +template<class _Ptr> +size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e) +{ + typedef typename iterator_traits<_Ptr>::value_type value_type; + return __murmur2_or_cityhash<size_t>()(__p, (__e-__p)*sizeof(value_type)); +} + +template<class _CharT, class _Traits, class _Allocator> +struct _LIBCPP_VISIBLE hash<basic_string<_CharT, _Traits, _Allocator> > + : public unary_function<basic_string<_CharT, _Traits, _Allocator>, size_t> +{ + size_t + operator()(const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT; +}; + +template<class _CharT, class _Traits, class _Allocator> +size_t +hash<basic_string<_CharT, _Traits, _Allocator> >::operator()( + const basic_string<_CharT, _Traits, _Allocator>& __val) const _NOEXCEPT +{ + return __do_string_hash(__val.data(), __val.data() + __val.size()); +} + +template<class _CharT, class _Traits, class _Allocator> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT, _Traits, _Allocator>& __str); + +template<class _CharT, class _Traits, class _Allocator> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str); + +template<class _CharT, class _Traits, class _Allocator> +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT, _Traits, _Allocator>& __str); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm); + +template<class _CharT, class _Traits, class _Allocator> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +getline(basic_istream<_CharT, _Traits>&& __is, + basic_string<_CharT, _Traits, _Allocator>& __str); + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +extern template class basic_string<char>; +extern template class basic_string<wchar_t>; + +extern template + string + operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STRING diff --git a/contrib/libc++/include/strstream b/contrib/libc++/include/strstream new file mode 100644 index 0000000..5eadefd --- /dev/null +++ b/contrib/libc++/include/strstream @@ -0,0 +1,400 @@ +// -*- C++ -*- +//===--------------------------- strstream --------------------------------===// +// +// 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_STRSTREAM +#define _LIBCPP_STRSTREAM + +/* + strstream synopsis + +class strstreambuf + : public basic_streambuf<char> +{ +public: + explicit strstreambuf(streamsize alsize_arg = 0); + strstreambuf(void* (*palloc_arg)(size_t), void (*pfree_arg)(void*)); + strstreambuf(char* gnext_arg, streamsize n, char* pbeg_arg = 0); + strstreambuf(const char* gnext_arg, streamsize n); + + strstreambuf(signed char* gnext_arg, streamsize n, signed char* pbeg_arg = 0); + strstreambuf(const signed char* gnext_arg, streamsize n); + strstreambuf(unsigned char* gnext_arg, streamsize n, unsigned char* pbeg_arg = 0); + strstreambuf(const unsigned char* gnext_arg, streamsize n); + + strstreambuf(strstreambuf&& rhs); + strstreambuf& operator=(strstreambuf&& rhs); + + virtual ~strstreambuf(); + + void swap(strstreambuf& rhs); + + void freeze(bool freezefl = true); + char* str(); + int pcount() const; + +protected: + virtual int_type overflow (int_type c = EOF); + virtual int_type pbackfail(int_type c = EOF); + virtual int_type underflow(); + virtual pos_type seekoff(off_type off, ios_base::seekdir way, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type sp, + ios_base::openmode which = ios_base::in | ios_base::out); + virtual streambuf* setbuf(char* s, streamsize n); + +private: + typedef T1 strstate; // exposition only + static const strstate allocated; // exposition only + static const strstate constant; // exposition only + static const strstate dynamic; // exposition only + static const strstate frozen; // exposition only + strstate strmode; // exposition only + streamsize alsize; // exposition only + void* (*palloc)(size_t); // exposition only + void (*pfree)(void*); // exposition only +}; + +class istrstream + : public basic_istream<char> +{ +public: + explicit istrstream(const char* s); + explicit istrstream(char* s); + istrstream(const char* s, streamsize n); + istrstream(char* s, streamsize n); + + virtual ~istrstream(); + + strstreambuf* rdbuf() const; + char *str(); + +private: + strstreambuf sb; // exposition only +}; + +class ostrstream + : public basic_ostream<char> +{ +public: + ostrstream(); + ostrstream(char* s, int n, ios_base::openmode mode = ios_base::out); + + virtual ~ostrstream(); + + strstreambuf* rdbuf() const; + void freeze(bool freezefl = true); + char* str(); + int pcount() const; + +private: + strstreambuf sb; // exposition only +}; + +class strstream + : public basic_iostream<char> +{ +public: + // Types + typedef char char_type; + typedef char_traits<char>::int_type int_type; + typedef char_traits<char>::pos_type pos_type; + typedef char_traits<char>::off_type off_type; + + // constructors/destructor + strstream(); + strstream(char* s, int n, ios_base::openmode mode = ios_base::in | ios_base::out); + + virtual ~strstream(); + + // Members: + strstreambuf* rdbuf() const; + void freeze(bool freezefl = true); + int pcount() const; + char* str(); + +private: + strstreambuf sb; // exposition only +}; + +} // std + +*/ + +#include <__config> +#include <ostream> +#include <istream> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_VISIBLE strstreambuf + : public streambuf +{ +public: + explicit strstreambuf(streamsize __alsize = 0); + strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*)); + strstreambuf(char* __gnext, streamsize __n, char* __pbeg = 0); + strstreambuf(const char* __gnext, streamsize __n); + + strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg = 0); + strstreambuf(const signed char* __gnext, streamsize __n); + strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg = 0); + strstreambuf(const unsigned char* __gnext, streamsize __n); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + strstreambuf(strstreambuf&& __rhs); + _LIBCPP_INLINE_VISIBILITY + strstreambuf& operator=(strstreambuf&& __rhs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + virtual ~strstreambuf(); + + void swap(strstreambuf& __rhs); + + void freeze(bool __freezefl = true); + char* str(); + int pcount() const; + +protected: + virtual int_type overflow (int_type __c = EOF); + virtual int_type pbackfail(int_type __c = EOF); + virtual int_type underflow(); + virtual pos_type seekoff(off_type __off, ios_base::seekdir __way, + ios_base::openmode __which = ios_base::in | ios_base::out); + virtual pos_type seekpos(pos_type __sp, + ios_base::openmode __which = ios_base::in | ios_base::out); + +private: + typedef unsigned __mode_type; + static const __mode_type __allocated = 0x01; + static const __mode_type __constant = 0x02; + static const __mode_type __dynamic = 0x04; + static const __mode_type __frozen = 0x08; + static const streamsize __default_alsize = 4096; + + __mode_type __strmode_; + streamsize __alsize_; + void* (*__palloc_)(size_t); + void (*__pfree_)(void*); + + void __init(char* __gnext, streamsize __n, char* __pbeg); +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +inline _LIBCPP_INLINE_VISIBILITY +strstreambuf::strstreambuf(strstreambuf&& __rhs) + : streambuf(__rhs), + __strmode_(__rhs.__strmode_), + __alsize_(__rhs.__alsize_), + __palloc_(__rhs.__palloc_), + __pfree_(__rhs.__pfree_) +{ + __rhs.setg(nullptr, nullptr, nullptr); + __rhs.setp(nullptr, nullptr); +} + +inline _LIBCPP_INLINE_VISIBILITY +strstreambuf& +strstreambuf::operator=(strstreambuf&& __rhs) +{ + if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) + { + if (__pfree_) + __pfree_(eback()); + else + delete [] eback(); + } + streambuf::operator=(__rhs); + __strmode_ = __rhs.__strmode_; + __alsize_ = __rhs.__alsize_; + __palloc_ = __rhs.__palloc_; + __pfree_ = __rhs.__pfree_; + __rhs.setg(nullptr, nullptr, nullptr); + __rhs.setp(nullptr, nullptr); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +class _LIBCPP_VISIBLE istrstream + : public istream +{ +public: + _LIBCPP_INLINE_VISIBILITY + explicit istrstream(const char* __s) + : istream(&__sb_), __sb_(__s, 0) {} + _LIBCPP_INLINE_VISIBILITY + explicit istrstream(char* __s) + : istream(&__sb_), __sb_(__s, 0) {} + _LIBCPP_INLINE_VISIBILITY + istrstream(const char* __s, streamsize __n) + : istream(&__sb_), __sb_(__s, __n) {} + _LIBCPP_INLINE_VISIBILITY + istrstream(char* __s, streamsize __n) + : istream(&__sb_), __sb_(__s, __n) {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + istrstream(istrstream&& __rhs) + : istream(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) + { + istream::set_rdbuf(&__sb_); + } + + _LIBCPP_INLINE_VISIBILITY + istrstream& operator=(istrstream&& __rhs) + { + istream::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + virtual ~istrstream(); + + _LIBCPP_INLINE_VISIBILITY + void swap(istrstream& __rhs) + { + istream::swap(__rhs); + __sb_.swap(__rhs.__sb_); + } + + _LIBCPP_INLINE_VISIBILITY + strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} + _LIBCPP_INLINE_VISIBILITY + char *str() {return __sb_.str();} + +private: + strstreambuf __sb_; +}; + +class _LIBCPP_VISIBLE ostrstream + : public ostream +{ +public: + _LIBCPP_INLINE_VISIBILITY + ostrstream() + : ostream(&__sb_) {} + _LIBCPP_INLINE_VISIBILITY + ostrstream(char* __s, int __n, ios_base::openmode __mode = ios_base::out) + : ostream(&__sb_), + __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0)) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + ostrstream(ostrstream&& __rhs) + : ostream(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) + { + ostream::set_rdbuf(&__sb_); + } + + _LIBCPP_INLINE_VISIBILITY + ostrstream& operator=(ostrstream&& __rhs) + { + ostream::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + virtual ~ostrstream(); + + _LIBCPP_INLINE_VISIBILITY + void swap(ostrstream& __rhs) + { + ostream::swap(__rhs); + __sb_.swap(__rhs.__sb_); + } + + _LIBCPP_INLINE_VISIBILITY + strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} + _LIBCPP_INLINE_VISIBILITY + void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} + _LIBCPP_INLINE_VISIBILITY + char* str() {return __sb_.str();} + _LIBCPP_INLINE_VISIBILITY + int pcount() const {return __sb_.pcount();} + +private: + strstreambuf __sb_; // exposition only +}; + +class _LIBCPP_VISIBLE strstream + : public iostream +{ +public: + // Types + typedef char char_type; + typedef char_traits<char>::int_type int_type; + typedef char_traits<char>::pos_type pos_type; + typedef char_traits<char>::off_type off_type; + + // constructors/destructor + _LIBCPP_INLINE_VISIBILITY + strstream() + : iostream(&__sb_) {} + _LIBCPP_INLINE_VISIBILITY + strstream(char* __s, int __n, ios_base::openmode __mode = ios_base::in | ios_base::out) + : iostream(&__sb_), + __sb_(__s, __n, __s + (__mode & ios::app ? strlen(__s) : 0)) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + strstream(strstream&& __rhs) + : iostream(_VSTD::move(__rhs)), + __sb_(_VSTD::move(__rhs.__sb_)) + { + iostream::set_rdbuf(&__sb_); + } + + _LIBCPP_INLINE_VISIBILITY + strstream& operator=(strstream&& __rhs) + { + iostream::operator=(_VSTD::move(__rhs)); + __sb_ = _VSTD::move(__rhs.__sb_); + return *this; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + virtual ~strstream(); + + _LIBCPP_INLINE_VISIBILITY + void swap(strstream& __rhs) + { + iostream::swap(__rhs); + __sb_.swap(__rhs.__sb_); + } + + // Members: + _LIBCPP_INLINE_VISIBILITY + strstreambuf* rdbuf() const {return const_cast<strstreambuf*>(&__sb_);} + _LIBCPP_INLINE_VISIBILITY + void freeze(bool __freezefl = true) {__sb_.freeze(__freezefl);} + _LIBCPP_INLINE_VISIBILITY + int pcount() const {return __sb_.pcount();} + _LIBCPP_INLINE_VISIBILITY + char* str() {return __sb_.str();} + +private: + strstreambuf __sb_; // exposition only +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STRSTREAM diff --git a/contrib/libc++/include/system_error b/contrib/libc++/include/system_error new file mode 100644 index 0000000..805c646 --- /dev/null +++ b/contrib/libc++/include/system_error @@ -0,0 +1,636 @@ +// -*- C++ -*- +//===---------------------------- system_error ----------------------------===// +// +// 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_SYSTEM_ERROR +#define _LIBCPP_SYSTEM_ERROR + +/* + system_error synopsis + +namespace std +{ + +class error_category +{ +public: + virtual ~error_category() noexcept; + + error_category(const error_category&) = delete; + error_category& operator=(const error_category&) = delete; + + virtual const char* name() const noexcept = 0; + virtual error_condition default_error_condition(int ev) const noexcept; + virtual bool equivalent(int code, const error_condition& condition) const noexcept; + virtual bool equivalent(const error_code& code, int condition) const noexcept; + virtual string message(int ev) const = 0; + + bool operator==(const error_category& rhs) const noexcept; + bool operator!=(const error_category& rhs) const noexcept; + bool operator<(const error_category& rhs) const noexcept; +}; + +const error_category& generic_category() noexcept; +const error_category& system_category() noexcept; + +template <class T> struct is_error_code_enum + : public false_type {}; + +template <class T> struct is_error_condition_enum + : public false_type {}; + +class error_code +{ +public: + // constructors: + error_code() noexcept; + error_code(int val, const error_category& cat) noexcept; + template <class ErrorCodeEnum> + error_code(ErrorCodeEnum e) noexcept; + + // modifiers: + void assign(int val, const error_category& cat) noexcept; + template <class ErrorCodeEnum> + error_code& operator=(ErrorCodeEnum e) noexcept; + void clear() noexcept; + + // observers: + int value() const noexcept; + const error_category& category() const noexcept; + error_condition default_error_condition() const noexcept; + string message() const; + explicit operator bool() const noexcept; +}; + +// non-member functions: +bool operator<(const error_code& lhs, const error_code& rhs) noexcept; +template <class charT, class traits> + basic_ostream<charT,traits>& + operator<<(basic_ostream<charT,traits>& os, const error_code& ec); + +class error_condition +{ +public: + // constructors: + error_condition() noexcept; + error_condition(int val, const error_category& cat) noexcept; + template <class ErrorConditionEnum> + error_condition(ErrorConditionEnum e) noexcept; + + // modifiers: + void assign(int val, const error_category& cat) noexcept; + template <class ErrorConditionEnum> + error_condition& operator=(ErrorConditionEnum e) noexcept; + void clear() noexcept; + + // observers: + int value() const noexcept; + const error_category& category() const noexcept; + string message() const noexcept; + explicit operator bool() const noexcept; +}; + +bool operator<(const error_condition& lhs, const error_condition& rhs) noexcept; + +class system_error + : public runtime_error +{ +public: + system_error(error_code ec, const string& what_arg); + system_error(error_code ec, const char* what_arg); + system_error(error_code ec); + system_error(int ev, const error_category& ecat, const string& what_arg); + system_error(int ev, const error_category& ecat, const char* what_arg); + system_error(int ev, const error_category& ecat); + + const error_code& code() const noexcept; + const char* what() const noexcept; +}; + +enum class errc +{ + address_family_not_supported, // EAFNOSUPPORT + address_in_use, // EADDRINUSE + address_not_available, // EADDRNOTAVAIL + already_connected, // EISCONN + argument_list_too_long, // E2BIG + argument_out_of_domain, // EDOM + bad_address, // EFAULT + bad_file_descriptor, // EBADF + bad_message, // EBADMSG + broken_pipe, // EPIPE + connection_aborted, // ECONNABORTED + connection_already_in_progress, // EALREADY + connection_refused, // ECONNREFUSED + connection_reset, // ECONNRESET + cross_device_link, // EXDEV + destination_address_required, // EDESTADDRREQ + device_or_resource_busy, // EBUSY + directory_not_empty, // ENOTEMPTY + executable_format_error, // ENOEXEC + file_exists, // EEXIST + file_too_large, // EFBIG + filename_too_long, // ENAMETOOLONG + function_not_supported, // ENOSYS + host_unreachable, // EHOSTUNREACH + identifier_removed, // EIDRM + illegal_byte_sequence, // EILSEQ + inappropriate_io_control_operation, // ENOTTY + interrupted, // EINTR + invalid_argument, // EINVAL + invalid_seek, // ESPIPE + io_error, // EIO + is_a_directory, // EISDIR + message_size, // EMSGSIZE + network_down, // ENETDOWN + network_reset, // ENETRESET + network_unreachable, // ENETUNREACH + no_buffer_space, // ENOBUFS + no_child_process, // ECHILD + no_link, // ENOLINK + no_lock_available, // ENOLCK + no_message_available, // ENODATA + no_message, // ENOMSG + no_protocol_option, // ENOPROTOOPT + no_space_on_device, // ENOSPC + no_stream_resources, // ENOSR + no_such_device_or_address, // ENXIO + no_such_device, // ENODEV + no_such_file_or_directory, // ENOENT + no_such_process, // ESRCH + not_a_directory, // ENOTDIR + not_a_socket, // ENOTSOCK + not_a_stream, // ENOSTR + not_connected, // ENOTCONN + not_enough_memory, // ENOMEM + not_supported, // ENOTSUP + operation_canceled, // ECANCELED + operation_in_progress, // EINPROGRESS + operation_not_permitted, // EPERM + operation_not_supported, // EOPNOTSUPP + operation_would_block, // EWOULDBLOCK + owner_dead, // EOWNERDEAD + permission_denied, // EACCES + protocol_error, // EPROTO + protocol_not_supported, // EPROTONOSUPPORT + read_only_file_system, // EROFS + resource_deadlock_would_occur, // EDEADLK + resource_unavailable_try_again, // EAGAIN + result_out_of_range, // ERANGE + state_not_recoverable, // ENOTRECOVERABLE + stream_timeout, // ETIME + text_file_busy, // ETXTBSY + timed_out, // ETIMEDOUT + too_many_files_open_in_system, // ENFILE + too_many_files_open, // EMFILE + too_many_links, // EMLINK + too_many_symbolic_link_levels, // ELOOP + value_too_large, // EOVERFLOW + wrong_protocol_type // EPROTOTYPE +}; + +template <> struct is_error_condition_enum<errc> + : true_type { } + +error_code make_error_code(errc e) noexcept; +error_condition make_error_condition(errc e) noexcept; + +// Comparison operators: +bool operator==(const error_code& lhs, const error_code& rhs) noexcept; +bool operator==(const error_code& lhs, const error_condition& rhs) noexcept; +bool operator==(const error_condition& lhs, const error_code& rhs) noexcept; +bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept; +bool operator!=(const error_code& lhs, const error_code& rhs) noexcept; +bool operator!=(const error_code& lhs, const error_condition& rhs) noexcept; +bool operator!=(const error_condition& lhs, const error_code& rhs) noexcept; +bool operator!=(const error_condition& lhs, const error_condition& rhs) noexcept; + +template <> struct hash<std::error_code>; + +} // std + +*/ + +#include <__config> +#include <cerrno> +#include <type_traits> +#include <stdexcept> +#include <__functional_base> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// is_error_code_enum + +template <class _Tp> +struct _LIBCPP_VISIBLE is_error_code_enum + : public false_type {}; + +// is_error_condition_enum + +template <class _Tp> +struct _LIBCPP_VISIBLE is_error_condition_enum + : public false_type {}; + +// Some error codes are not present on all platforms, so we provide equivalents +// for them: + +//enum class errc +_LIBCPP_DECLARE_STRONG_ENUM(errc) +{ + address_family_not_supported = EAFNOSUPPORT, + address_in_use = EADDRINUSE, + address_not_available = EADDRNOTAVAIL, + already_connected = EISCONN, + argument_list_too_long = E2BIG, + argument_out_of_domain = EDOM, + bad_address = EFAULT, + bad_file_descriptor = EBADF, + bad_message = EBADMSG, + broken_pipe = EPIPE, + connection_aborted = ECONNABORTED, + connection_already_in_progress = EALREADY, + connection_refused = ECONNREFUSED, + connection_reset = ECONNRESET, + cross_device_link = EXDEV, + destination_address_required = EDESTADDRREQ, + device_or_resource_busy = EBUSY, + directory_not_empty = ENOTEMPTY, + executable_format_error = ENOEXEC, + file_exists = EEXIST, + file_too_large = EFBIG, + filename_too_long = ENAMETOOLONG, + function_not_supported = ENOSYS, + host_unreachable = EHOSTUNREACH, + identifier_removed = EIDRM, + illegal_byte_sequence = EILSEQ, + inappropriate_io_control_operation = ENOTTY, + interrupted = EINTR, + invalid_argument = EINVAL, + invalid_seek = ESPIPE, + io_error = EIO, + is_a_directory = EISDIR, + message_size = EMSGSIZE, + network_down = ENETDOWN, + network_reset = ENETRESET, + network_unreachable = ENETUNREACH, + no_buffer_space = ENOBUFS, + no_child_process = ECHILD, + no_link = ENOLINK, + no_lock_available = ENOLCK, +#ifdef ENODATA + no_message_available = ENODATA, +#else + no_message_available = ENOMSG, +#endif + no_message = ENOMSG, + no_protocol_option = ENOPROTOOPT, + no_space_on_device = ENOSPC, +#ifdef ENOSR + no_stream_resources = ENOSR, +#else + no_stream_resources = ENOMEM, +#endif + no_such_device_or_address = ENXIO, + no_such_device = ENODEV, + no_such_file_or_directory = ENOENT, + no_such_process = ESRCH, + not_a_directory = ENOTDIR, + not_a_socket = ENOTSOCK, +#ifdef ENOSTR + not_a_stream = ENOSTR, +#else + not_a_stream = EINVAL, +#endif + not_connected = ENOTCONN, + not_enough_memory = ENOMEM, + not_supported = ENOTSUP, + operation_canceled = ECANCELED, + operation_in_progress = EINPROGRESS, + operation_not_permitted = EPERM, + operation_not_supported = EOPNOTSUPP, + operation_would_block = EWOULDBLOCK, + owner_dead = EOWNERDEAD, + permission_denied = EACCES, + protocol_error = EPROTO, + protocol_not_supported = EPROTONOSUPPORT, + read_only_file_system = EROFS, + resource_deadlock_would_occur = EDEADLK, + resource_unavailable_try_again = EAGAIN, + result_out_of_range = ERANGE, + state_not_recoverable = ENOTRECOVERABLE, +#ifdef ETIME + stream_timeout = ETIME, +#else + stream_timeout = ETIMEDOUT, +#endif + text_file_busy = ETXTBSY, + timed_out = ETIMEDOUT, + too_many_files_open_in_system = ENFILE, + too_many_files_open = EMFILE, + too_many_links = EMLINK, + too_many_symbolic_link_levels = ELOOP, + value_too_large = EOVERFLOW, + wrong_protocol_type = EPROTOTYPE +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc) + +template <> +struct _LIBCPP_VISIBLE is_error_condition_enum<errc> + : true_type { }; + +#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS +template <> +struct _LIBCPP_VISIBLE is_error_condition_enum<errc::_> + : true_type { }; +#endif + +class error_condition; +class error_code; + +// class error_category + +class __do_message; + +class _LIBCPP_VISIBLE error_category +{ +public: + virtual ~error_category() _NOEXCEPT; + +private: + error_category() _NOEXCEPT; + error_category(const error_category&);// = delete; + error_category& operator=(const error_category&);// = delete; + +public: + virtual const char* name() const _NOEXCEPT = 0; + virtual error_condition default_error_condition(int __ev) const _NOEXCEPT; + virtual bool equivalent(int __code, const error_condition& __condition) const _NOEXCEPT; + virtual bool equivalent(const error_code& __code, int __condition) const _NOEXCEPT; + virtual string message(int __ev) const = 0; + + _LIBCPP_ALWAYS_INLINE + bool operator==(const error_category& __rhs) const _NOEXCEPT {return this == &__rhs;} + + _LIBCPP_ALWAYS_INLINE + bool operator!=(const error_category& __rhs) const _NOEXCEPT {return !(*this == __rhs);} + + _LIBCPP_ALWAYS_INLINE + bool operator< (const error_category& __rhs) const _NOEXCEPT {return this < &__rhs;} + + friend class __do_message; +}; + +class _LIBCPP_HIDDEN __do_message + : public error_category +{ +public: + virtual string message(int ev) const; +}; + +const error_category& generic_category() _NOEXCEPT; +const error_category& system_category() _NOEXCEPT; + +class _LIBCPP_VISIBLE error_condition +{ + int __val_; + const error_category* __cat_; +public: + _LIBCPP_ALWAYS_INLINE + error_condition() _NOEXCEPT : __val_(0), __cat_(&generic_category()) {} + + _LIBCPP_ALWAYS_INLINE + error_condition(int __val, const error_category& __cat) _NOEXCEPT + : __val_(__val), __cat_(&__cat) {} + + template <class _Ep> + _LIBCPP_ALWAYS_INLINE + error_condition(_Ep __e, + typename enable_if<is_error_condition_enum<_Ep>::value>::type* = 0 + ) _NOEXCEPT + {*this = make_error_condition(__e);} + + _LIBCPP_ALWAYS_INLINE + void assign(int __val, const error_category& __cat) _NOEXCEPT + { + __val_ = __val; + __cat_ = &__cat; + } + + template <class _Ep> + _LIBCPP_ALWAYS_INLINE + typename enable_if + < + is_error_condition_enum<_Ep>::value, + error_condition& + >::type + operator=(_Ep __e) _NOEXCEPT + {*this = make_error_condition(__e); return *this;} + + _LIBCPP_ALWAYS_INLINE + void clear() _NOEXCEPT + { + __val_ = 0; + __cat_ = &generic_category(); + } + + _LIBCPP_ALWAYS_INLINE + int value() const _NOEXCEPT {return __val_;} + + _LIBCPP_ALWAYS_INLINE + const error_category& category() const _NOEXCEPT {return *__cat_;} + string message() const; + + _LIBCPP_ALWAYS_INLINE + _LIBCPP_EXPLICIT + operator bool() const _NOEXCEPT {return __val_ != 0;} +}; + +inline _LIBCPP_INLINE_VISIBILITY +error_condition +make_error_condition(errc __e) _NOEXCEPT +{ + return error_condition(static_cast<int>(__e), generic_category()); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const error_condition& __x, const error_condition& __y) _NOEXCEPT +{ + return __x.category() < __y.category() + || (__x.category() == __y.category() && __x.value() < __y.value()); +} + +// error_code + +class _LIBCPP_VISIBLE error_code +{ + int __val_; + const error_category* __cat_; +public: + _LIBCPP_ALWAYS_INLINE + error_code() _NOEXCEPT : __val_(0), __cat_(&system_category()) {} + + _LIBCPP_ALWAYS_INLINE + error_code(int __val, const error_category& __cat) _NOEXCEPT + : __val_(__val), __cat_(&__cat) {} + + template <class _Ep> + _LIBCPP_ALWAYS_INLINE + error_code(_Ep __e, + typename enable_if<is_error_code_enum<_Ep>::value>::type* = 0 + ) _NOEXCEPT + {*this = make_error_code(__e);} + + _LIBCPP_ALWAYS_INLINE + void assign(int __val, const error_category& __cat) _NOEXCEPT + { + __val_ = __val; + __cat_ = &__cat; + } + + template <class _Ep> + _LIBCPP_ALWAYS_INLINE + typename enable_if + < + is_error_code_enum<_Ep>::value, + error_code& + >::type + operator=(_Ep __e) _NOEXCEPT + {*this = make_error_code(__e); return *this;} + + _LIBCPP_ALWAYS_INLINE + void clear() _NOEXCEPT + { + __val_ = 0; + __cat_ = &system_category(); + } + + _LIBCPP_ALWAYS_INLINE + int value() const _NOEXCEPT {return __val_;} + + _LIBCPP_ALWAYS_INLINE + const error_category& category() const _NOEXCEPT {return *__cat_;} + + _LIBCPP_ALWAYS_INLINE + error_condition default_error_condition() const _NOEXCEPT + {return __cat_->default_error_condition(__val_);} + + string message() const; + + _LIBCPP_ALWAYS_INLINE + _LIBCPP_EXPLICIT + operator bool() const _NOEXCEPT {return __val_ != 0;} +}; + +inline _LIBCPP_INLINE_VISIBILITY +error_code +make_error_code(errc __e) _NOEXCEPT +{ + return error_code(static_cast<int>(__e), generic_category()); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const error_code& __x, const error_code& __y) _NOEXCEPT +{ + return __x.category() < __y.category() + || (__x.category() == __y.category() && __x.value() < __y.value()); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const error_code& __x, const error_code& __y) _NOEXCEPT +{ + return __x.category() == __y.category() && __x.value() == __y.value(); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const error_code& __x, const error_condition& __y) _NOEXCEPT +{ + return __x.category().equivalent(__x.value(), __y) + || __y.category().equivalent(__x, __y.value()); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const error_condition& __x, const error_code& __y) _NOEXCEPT +{ + return __y == __x; +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const error_condition& __x, const error_condition& __y) _NOEXCEPT +{ + return __x.category() == __y.category() && __x.value() == __y.value(); +} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const error_code& __x, const error_code& __y) _NOEXCEPT +{return !(__x == __y);} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const error_code& __x, const error_condition& __y) _NOEXCEPT +{return !(__x == __y);} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const error_condition& __x, const error_code& __y) _NOEXCEPT +{return !(__x == __y);} + +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const error_condition& __x, const error_condition& __y) _NOEXCEPT +{return !(__x == __y);} + +template <> +struct _LIBCPP_VISIBLE hash<error_code> + : public unary_function<error_code, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const error_code& __ec) const _NOEXCEPT + { + return static_cast<size_t>(__ec.value()); + } +}; + +// system_error + +class _LIBCPP_VISIBLE system_error + : public runtime_error +{ + error_code __ec_; +public: + system_error(error_code __ec, const string& __what_arg); + system_error(error_code __ec, const char* __what_arg); + system_error(error_code __ec); + system_error(int __ev, const error_category& __ecat, const string& __what_arg); + system_error(int __ev, const error_category& __ecat, const char* __what_arg); + system_error(int __ev, const error_category& __ecat); + ~system_error() _NOEXCEPT; + + _LIBCPP_ALWAYS_INLINE + const error_code& code() const _NOEXCEPT {return __ec_;} + +private: + static string __init(const error_code&, string); +}; + +void __throw_system_error(int ev, const char* what_arg); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_SYSTEM_ERROR diff --git a/contrib/libc++/include/tgmath.h b/contrib/libc++/include/tgmath.h new file mode 100644 index 0000000..fbe1e82 --- /dev/null +++ b/contrib/libc++/include/tgmath.h @@ -0,0 +1,29 @@ +// -*- C++ -*- +//===-------------------------- tgmath.h ----------------------------------===// +// +// 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_TGMATH_H +#define _LIBCPP_TGMATH_H + +/* + tgmath.h synopsis + +#include <complex.h> +#include <math.h> + +*/ + +#include <complex.h> +#include <math.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#endif // _LIBCPP_TGMATH_H diff --git a/contrib/libc++/include/thread b/contrib/libc++/include/thread new file mode 100644 index 0000000..23b1915 --- /dev/null +++ b/contrib/libc++/include/thread @@ -0,0 +1,447 @@ +// -*- C++ -*- +//===--------------------------- thread -----------------------------------===// +// +// 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_THREAD +#define _LIBCPP_THREAD + +/* + + thread synopsis + +#define __STDCPP_THREADS__ __cplusplus + +namespace std +{ + +class thread +{ +public: + class id; + typedef pthread_t native_handle_type; + + thread(); + template <class F, class ...Args> explicit thread(F&& f, Args&&... args); + ~thread(); + + thread(const thread&) = delete; + thread(thread&& t); + + thread& operator=(const thread&) = delete; + thread& operator=(thread&& t); + + void swap(thread& t); + + bool joinable() const; + void join(); + void detach(); + id get_id() const; + native_handle_type native_handle(); + + static unsigned hardware_concurrency(); +}; + +void swap(thread& x, thread& y); + +class thread::id +{ +public: + id(); +}; + +bool operator==(thread::id x, thread::id y); +bool operator!=(thread::id x, thread::id y); +bool operator< (thread::id x, thread::id y); +bool operator<=(thread::id x, thread::id y); +bool operator> (thread::id x, thread::id y); +bool operator>=(thread::id x, thread::id y); + +template<class charT, class traits> +basic_ostream<charT, traits>& +operator<<(basic_ostream<charT, traits>& out, thread::id id); + +namespace this_thread +{ + +thread::id get_id(); + +void yield(); + +template <class Clock, class Duration> +void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); + +template <class Rep, class Period> +void sleep_for(const chrono::duration<Rep, Period>& rel_time); + +} // this_thread + +} // std + +*/ + +#include <__config> +#include <iosfwd> +#include <__functional_base> +#include <type_traits> +#include <cstddef> +#include <functional> +#include <memory> +#include <system_error> +#include <chrono> +#include <__mutex_base> +#ifndef _LIBCPP_HAS_NO_VARIADICS +#include <tuple> +#endif +#include <pthread.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#define __STDCPP_THREADS__ __cplusplus + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Tp> +class __thread_specific_ptr +{ + pthread_key_t __key_; + + __thread_specific_ptr(const __thread_specific_ptr&); + __thread_specific_ptr& operator=(const __thread_specific_ptr&); + + static void __at_thread_exit(void*); +public: + typedef _Tp* pointer; + + __thread_specific_ptr(); + ~__thread_specific_ptr(); + + _LIBCPP_INLINE_VISIBILITY + pointer get() const {return static_cast<_Tp*>(pthread_getspecific(__key_));} + _LIBCPP_INLINE_VISIBILITY + pointer operator*() const {return *get();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return get();} + pointer release(); + void reset(pointer __p = nullptr); +}; + +template <class _Tp> +void +__thread_specific_ptr<_Tp>::__at_thread_exit(void* __p) +{ + delete static_cast<pointer>(__p); +} + +template <class _Tp> +__thread_specific_ptr<_Tp>::__thread_specific_ptr() +{ + int __ec = pthread_key_create(&__key_, &__thread_specific_ptr::__at_thread_exit); + if (__ec) + throw system_error(error_code(__ec, system_category()), + "__thread_specific_ptr construction failed"); +} + +template <class _Tp> +__thread_specific_ptr<_Tp>::~__thread_specific_ptr() +{ + pthread_key_delete(__key_); +} + +template <class _Tp> +typename __thread_specific_ptr<_Tp>::pointer +__thread_specific_ptr<_Tp>::release() +{ + pointer __p = get(); + pthread_setspecific(__key_, 0); + return __p; +} + +template <class _Tp> +void +__thread_specific_ptr<_Tp>::reset(pointer __p) +{ + pointer __p_old = get(); + pthread_setspecific(__key_, __p); + delete __p_old; +} + +class thread; +class __thread_id; + +namespace this_thread +{ + +__thread_id get_id(); + +} // this_thread + +class _LIBCPP_VISIBLE __thread_id; +template<> struct _LIBCPP_VISIBLE hash<__thread_id>; + +class _LIBCPP_VISIBLE __thread_id +{ + // FIXME: pthread_t is a pointer on Darwin but a long on Linux. + // NULL is the no-thread value on Darwin. Someone needs to check + // on other platforms. We assume 0 works everywhere for now. + pthread_t __id_; + +public: + _LIBCPP_INLINE_VISIBILITY + __thread_id() : __id_(0) {} + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(__thread_id __x, __thread_id __y) + {return __x.__id_ == __y.__id_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(__thread_id __x, __thread_id __y) + {return !(__x == __y);} + friend _LIBCPP_INLINE_VISIBILITY + bool operator< (__thread_id __x, __thread_id __y) + {return __x.__id_ < __y.__id_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator<=(__thread_id __x, __thread_id __y) + {return !(__y < __x);} + friend _LIBCPP_INLINE_VISIBILITY + bool operator> (__thread_id __x, __thread_id __y) + {return __y < __x ;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator>=(__thread_id __x, __thread_id __y) + {return !(__x < __y);} + + template<class _CharT, class _Traits> + friend + _LIBCPP_INLINE_VISIBILITY + basic_ostream<_CharT, _Traits>& + operator<<(basic_ostream<_CharT, _Traits>& __os, __thread_id __id) + {return __os << __id.__id_;} + +private: + _LIBCPP_INLINE_VISIBILITY + __thread_id(pthread_t __id) : __id_(__id) {} + + friend __thread_id this_thread::get_id(); + friend class _LIBCPP_VISIBLE thread; + friend struct _LIBCPP_VISIBLE hash<__thread_id>; +}; + +template<> +struct _LIBCPP_VISIBLE hash<__thread_id> + : public unary_function<__thread_id, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(__thread_id __v) const + { + return hash<pthread_t>()(__v.__id_); + } +}; + +namespace this_thread +{ + +inline _LIBCPP_INLINE_VISIBILITY +__thread_id +get_id() +{ + return pthread_self(); +} + +} // this_thread + +class _LIBCPP_VISIBLE thread +{ + pthread_t __t_; + + thread(const thread&); + thread& operator=(const thread&); +public: + typedef __thread_id id; + typedef pthread_t native_handle_type; + + _LIBCPP_INLINE_VISIBILITY + thread() : __t_(0) {} +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _Fp, class ..._Args, + class = typename enable_if + < + !is_same<typename decay<_Fp>::type, thread>::value + >::type + > + explicit thread(_Fp&& __f, _Args&&... __args); +#else // _LIBCPP_HAS_NO_VARIADICS + template <class _Fp> explicit thread(_Fp __f); +#endif + ~thread(); + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + thread(thread&& __t) : __t_(__t.__t_) {__t.__t_ = 0;} + thread& operator=(thread&& __t); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + void swap(thread& __t) {_VSTD::swap(__t_, __t.__t_);} + + _LIBCPP_INLINE_VISIBILITY + bool joinable() const {return __t_ != 0;} + void join(); + void detach(); + _LIBCPP_INLINE_VISIBILITY + id get_id() const {return __t_;} + _LIBCPP_INLINE_VISIBILITY + native_handle_type native_handle() {return __t_;} + + static unsigned hardware_concurrency(); +}; + +class __assoc_sub_state; + +class _LIBCPP_HIDDEN __thread_struct_imp; + +class __thread_struct +{ + __thread_struct_imp* __p_; + + __thread_struct(const __thread_struct&); + __thread_struct& operator=(const __thread_struct&); +public: + __thread_struct(); + ~__thread_struct(); + + void notify_all_at_thread_exit(condition_variable*, mutex*); + void __make_ready_at_thread_exit(__assoc_sub_state*); +}; + +__thread_specific_ptr<__thread_struct>& __thread_local_data(); + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Fp, class ..._Args, size_t ..._Indices> +inline _LIBCPP_INLINE_VISIBILITY +void +__threaad_execute(tuple<_Fp, _Args...>& __t, __tuple_indices<_Indices...>) +{ + __invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...); +} + +template <class _Fp> +void* +__thread_proxy(void* __vp) +{ + __thread_local_data().reset(new __thread_struct); + std::unique_ptr<_Fp> __p(static_cast<_Fp*>(__vp)); + typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 1>::type _Index; + __threaad_execute(*__p, _Index()); + return nullptr; +} + +template <class _Fp, class ..._Args, + class + > +thread::thread(_Fp&& __f, _Args&&... __args) +{ + typedef tuple<typename decay<_Fp>::type, typename decay<_Args>::type...> _Gp; + _VSTD::unique_ptr<_Gp> __p(new _Gp(__decay_copy(_VSTD::forward<_Fp>(__f)), + __decay_copy(_VSTD::forward<_Args>(__args))...)); + int __ec = pthread_create(&__t_, 0, &__thread_proxy<_Gp>, __p.get()); + if (__ec == 0) + __p.release(); + else + __throw_system_error(__ec, "thread constructor failed"); +} + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Fp> +void* +__thread_proxy(void* __vp) +{ + __thread_local_data().reset(new __thread_struct); + std::unique_ptr<_Fp> __p(static_cast<_Fp*>(__vp)); + (*__p)(); + return nullptr; +} + +template <class _Fp> +thread::thread(_Fp __f) +{ + std::unique_ptr<_Fp> __p(new _Fp(__f)); + int __ec = pthread_create(&__t_, 0, &__thread_proxy<_Fp>, __p.get()); + if (__ec == 0) + __p.release(); + else + __throw_system_error(__ec, "thread constructor failed"); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +inline _LIBCPP_INLINE_VISIBILITY +thread& +thread::operator=(thread&& __t) +{ + if (__t_ != 0) + terminate(); + __t_ = __t.__t_; + __t.__t_ = 0; + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +inline _LIBCPP_INLINE_VISIBILITY +void swap(thread& __x, thread& __y) {__x.swap(__y);} + +namespace this_thread +{ + +void sleep_for(const chrono::nanoseconds& ns); + +template <class _Rep, class _Period> +void +sleep_for(const chrono::duration<_Rep, _Period>& __d) +{ + using namespace chrono; + nanoseconds __ns = duration_cast<nanoseconds>(__d); + if (__ns < __d) + ++__ns; + sleep_for(__ns); +} + +template <class _Clock, class _Duration> +void +sleep_until(const chrono::time_point<_Clock, _Duration>& __t) +{ + using namespace chrono; + mutex __mut; + condition_variable __cv; + unique_lock<mutex> __lk(__mut); + while (_Clock::now() < __t) + __cv.wait_until(__lk, __t); +} + +template <class _Duration> +inline _LIBCPP_INLINE_VISIBILITY +void +sleep_until(const chrono::time_point<chrono::steady_clock, _Duration>& __t) +{ + using namespace chrono; + sleep_for(__t - steady_clock::now()); +} + +inline _LIBCPP_INLINE_VISIBILITY +void yield() {sched_yield();} + +} // this_thread + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_THREAD diff --git a/contrib/libc++/include/tuple b/contrib/libc++/include/tuple new file mode 100644 index 0000000..2bdb05f --- /dev/null +++ b/contrib/libc++/include/tuple @@ -0,0 +1,1008 @@ +// -*- C++ -*- +//===--------------------------- tuple ------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_TUPLE +#define _LIBCPP_TUPLE + +/* + tuple synopsis + +namespace std +{ + +template <class... T> +class tuple { +public: + constexpr tuple(); + explicit tuple(const T&...); + template <class... U> + explicit tuple(U&&...); + tuple(const tuple&) = default; + tuple(tuple&&) = default; + template <class... U> + tuple(const tuple<U...>&); + template <class... U> + tuple(tuple<U...>&&); + template <class U1, class U2> + tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 + template <class U1, class U2> + tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 + + // allocator-extended constructors + template <class Alloc> + tuple(allocator_arg_t, const Alloc& a); + template <class Alloc> + tuple(allocator_arg_t, const Alloc& a, const T&...); + template <class Alloc, class... U> + tuple(allocator_arg_t, const Alloc& a, U&&...); + template <class Alloc> + tuple(allocator_arg_t, const Alloc& a, const tuple&); + template <class Alloc> + tuple(allocator_arg_t, const Alloc& a, tuple&&); + template <class Alloc, class... U> + tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); + template <class Alloc, class... U> + tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); + template <class Alloc, class U1, class U2> + tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); + template <class Alloc, class U1, class U2> + tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); + + tuple& operator=(const tuple&); + tuple& + operator=(tuple&&) noexcept(AND(is_nothrow_move_assignable<T>::value ...)); + template <class... U> + tuple& operator=(const tuple<U...>&); + template <class... U> + tuple& operator=(tuple<U...>&&); + template <class U1, class U2> + tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 + template <class U1, class U2> + tuple& operator=(pair<U1, U2>&&); //iffsizeof...(T) == 2 + + void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); +}; + +const unspecified ignore; + +template <class... T> tuple<V...> make_tuple(T&&...); +template <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; +template <class... T> tuple<T&...> tie(T&...) noexcept; +template <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); + +// 20.4.1.4, tuple helper classes: +template <class T> class tuple_size; // undefined +template <class... T> class tuple_size<tuple<T...>>; +template <intsize_t I, class T> class tuple_element; // undefined +template <intsize_t I, class... T> class tuple_element<I, tuple<T...>>; + +// 20.4.1.5, element access: +template <intsize_t I, class... T> + typename tuple_element<I, tuple<T...>>::type& + get(tuple<T...>&) noexcept; +template <intsize_t I, class... T> + typename tuple_element<I, tuple<T...>>::type const& + get(const tuple<T...>&) noexcept; +template <intsize_t I, class... T> + typename tuple_element<I, tuple<T...>>::type&& + get(tuple<T...>&&) noexcept; + +// 20.4.1.6, relational operators: +template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); +template<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); +template<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); +template<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); +template<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); +template<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); + +template <class... Types, class Alloc> + struct uses_allocator<tuple<Types...>, Alloc>; + +template <class... Types> + void + swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y))); + +} // std + +*/ + +#include <__config> +#include <__tuple> +#include <cstddef> +#include <type_traits> +#include <__functional_base> +#include <utility> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// allocator_arg_t + +struct _LIBCPP_VISIBLE allocator_arg_t { }; + +extern const allocator_arg_t allocator_arg; + +// uses_allocator + +template <class _Tp> +struct __has_allocator_type +{ +private: + struct __two {char _; char __;}; + template <class _Up> static __two __test(...); + template <class _Up> static char __test(typename _Up::allocator_type* = 0); +public: + static const bool value = sizeof(__test<_Tp>(0)) == 1; +}; + +template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value> +struct __uses_allocator + : public integral_constant<bool, + is_convertible<_Alloc, typename _Tp::allocator_type>::value> +{ +}; + +template <class _Tp, class _Alloc> +struct __uses_allocator<_Tp, _Alloc, false> + : public false_type +{ +}; + +template <class _Tp, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator + : public __uses_allocator<_Tp, _Alloc> +{ +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// uses-allocator construction + +template <class _Tp, class _Alloc, class ..._Args> +struct __uses_alloc_ctor_imp +{ + static const bool __ua = uses_allocator<_Tp, _Alloc>::value; + static const bool __ic = + is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value; + static const int value = __ua ? 2 - __ic : 0; +}; + +template <class _Tp, class _Alloc, class ..._Args> +struct __uses_alloc_ctor + : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value> + {}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// tuple_size + +template <class ..._Tp> +class _LIBCPP_VISIBLE tuple_size<tuple<_Tp...> > + : public integral_constant<size_t, sizeof...(_Tp)> +{ +}; + +// tuple_element + +template <size_t _Ip, class ..._Tp> +class _LIBCPP_VISIBLE tuple_element<_Ip, tuple<_Tp...> > +{ +public: + typedef typename tuple_element<_Ip, __tuple_types<_Tp...> >::type type; +}; + +// __tuple_leaf + +template <size_t _Ip, class _Hp, bool=is_empty<_Hp>::value +#if __has_feature(is_final) + && !__is_final(_Hp) +#endif + > +class __tuple_leaf; + +template <size_t _Ip, class _Hp, bool _Ep> +inline _LIBCPP_INLINE_VISIBILITY +void swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) + _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) +{ + swap(__x.get(), __y.get()); +} + +template <size_t _Ip, class _Hp, bool> +class __tuple_leaf +{ + _Hp value; + + __tuple_leaf& operator=(const __tuple_leaf&); +public: + _LIBCPP_INLINE_VISIBILITY __tuple_leaf() : value() + {static_assert(!is_reference<_Hp>::value, + "Attempted to default construct a reference element in a tuple");} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 0>, const _Alloc&) + : value() + {static_assert(!is_reference<_Hp>::value, + "Attempted to default construct a reference element in a tuple");} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) + : value(allocator_arg_t(), __a) + {static_assert(!is_reference<_Hp>::value, + "Attempted to default construct a reference element in a tuple");} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) + : value(__a) + {static_assert(!is_reference<_Hp>::value, + "Attempted to default construct a reference element in a tuple");} + + template <class _Tp, + class = typename enable_if<is_constructible<_Hp, _Tp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(_Tp&& __t) + : value(_VSTD::forward<_Tp>(__t)) + {static_assert(!is_reference<_Hp>::value || + (is_lvalue_reference<_Hp>::value && + (is_lvalue_reference<_Tp>::value || + is_same<typename remove_reference<_Tp>::type, + reference_wrapper< + typename remove_reference<_Hp>::type + > + >::value)) || + (is_rvalue_reference<_Hp>::value && + !is_lvalue_reference<_Tp>::value), + "Attempted to construct a reference element in a tuple with an rvalue");} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) + : value(_VSTD::forward<_Tp>(__t)) + {static_assert(!is_lvalue_reference<_Hp>::value || + (is_lvalue_reference<_Hp>::value && + (is_lvalue_reference<_Tp>::value || + is_same<typename remove_reference<_Tp>::type, + reference_wrapper< + typename remove_reference<_Hp>::type + > + >::value)), + "Attempted to construct a reference element in a tuple with an rvalue");} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) + : value(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) + {static_assert(!is_lvalue_reference<_Hp>::value || + (is_lvalue_reference<_Hp>::value && + (is_lvalue_reference<_Tp>::value || + is_same<typename remove_reference<_Tp>::type, + reference_wrapper< + typename remove_reference<_Hp>::type + > + >::value)), + "Attempted to construct a reference element in a tuple with an rvalue");} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) + : value(_VSTD::forward<_Tp>(__t), __a) + {static_assert(!is_lvalue_reference<_Hp>::value || + (is_lvalue_reference<_Hp>::value && + (is_lvalue_reference<_Tp>::value || + is_same<typename remove_reference<_Tp>::type, + reference_wrapper< + typename remove_reference<_Hp>::type + > + >::value)), + "Attempted to construct a reference element in a tuple with an rvalue");} + + __tuple_leaf(const __tuple_leaf& __t) + : value(__t.get()) + {static_assert(!is_rvalue_reference<_Hp>::value, "Can not copy a tuple with rvalue reference member");} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t) + : value(__t.get()) {} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf& + operator=(_Tp&& __t) + { + value = _VSTD::forward<_Tp>(__t); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) + { + _VSTD::swap(*this, __t); + return 0; + } + + _LIBCPP_INLINE_VISIBILITY _Hp& get() {return value;} + _LIBCPP_INLINE_VISIBILITY const _Hp& get() const {return value;} +}; + +template <size_t _Ip, class _Hp> +class __tuple_leaf<_Ip, _Hp, true> + : private _Hp +{ + + __tuple_leaf& operator=(const __tuple_leaf&); +public: + _LIBCPP_INLINE_VISIBILITY __tuple_leaf() {} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) + : _Hp(allocator_arg_t(), __a) {} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) + : _Hp(__a) {} + + template <class _Tp, + class = typename enable_if<is_constructible<_Hp, _Tp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(_Tp&& __t) + : _Hp(_VSTD::forward<_Tp>(__t)) {} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) + : _Hp(_VSTD::forward<_Tp>(__t)) {} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) + : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} + + template <class _Tp, class _Alloc> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) + : _Hp(_VSTD::forward<_Tp>(__t), __a) {} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + explicit __tuple_leaf(const __tuple_leaf<_Ip, _Tp>& __t) + : _Hp(__t.get()) {} + + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + __tuple_leaf& + operator=(_Tp&& __t) + { + _Hp::operator=(_VSTD::forward<_Tp>(__t)); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + int + swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) + { + _VSTD::swap(*this, __t); + return 0; + } + + _LIBCPP_INLINE_VISIBILITY _Hp& get() {return static_cast<_Hp&>(*this);} + _LIBCPP_INLINE_VISIBILITY const _Hp& get() const {return static_cast<const _Hp&>(*this);} +}; + +template <class ..._Tp> +_LIBCPP_INLINE_VISIBILITY +void __swallow(_Tp&&...) {} + +template <bool ...> struct __all; + +template <> +struct __all<> +{ + static const bool value = true; +}; + +template <bool _B0, bool ... _Bp> +struct __all<_B0, _Bp...> +{ + static const bool value = _B0 && __all<_Bp...>::value; +}; + +// __tuple_impl + +template<class _Indx, class ..._Tp> struct __tuple_impl; + +template<size_t ..._Indx, class ..._Tp> +struct __tuple_impl<__tuple_indices<_Indx...>, _Tp...> + : public __tuple_leaf<_Indx, _Tp>... +{ + template <size_t ..._Uf, class ..._Tf, + size_t ..._Ul, class ..._Tl, class ..._Up> + _LIBCPP_INLINE_VISIBILITY + explicit + __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, + __tuple_indices<_Ul...>, __tuple_types<_Tl...>, + _Up&&... __u) : + __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., + __tuple_leaf<_Ul, _Tl>()... + {} + + template <class _Alloc, size_t ..._Uf, class ..._Tf, + size_t ..._Ul, class ..._Tl, class ..._Up> + _LIBCPP_INLINE_VISIBILITY + explicit + __tuple_impl(allocator_arg_t, const _Alloc& __a, + __tuple_indices<_Uf...>, __tuple_types<_Tf...>, + __tuple_indices<_Ul...>, __tuple_types<_Tl...>, + _Up&&... __u) : + __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, + _VSTD::forward<_Up>(__u))..., + __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... + {} + + template <class _Tuple, + class = typename enable_if + < + __tuple_convertible<_Tuple, tuple<_Tp...> >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + __tuple_impl(_Tuple&& __t) + : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, + typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... + {} + + template <class _Alloc, class _Tuple, + class = typename enable_if + < + __tuple_convertible<_Tuple, tuple<_Tp...> >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) + : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, + typename __make_tuple_types<_Tuple>::type>::type>(), __a, + _VSTD::forward<typename tuple_element<_Indx, + typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... + {} + + template <class _Tuple> + _LIBCPP_INLINE_VISIBILITY + typename enable_if + < + __tuple_assignable<_Tuple, tuple<_Tp...> >::value, + __tuple_impl& + >::type + operator=(_Tuple&& __t) + { + __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx, + typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __tuple_impl& + operator=(const __tuple_impl& __t) + { + __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + void swap(__tuple_impl& __t) + _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) + { + __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); + } +}; + +template <class ..._Tp> +class _LIBCPP_VISIBLE tuple +{ + typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> base; + + base base_; + + template <size_t _Jp, class ..._Up> friend + typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; + template <size_t _Jp, class ..._Up> friend + const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; + template <size_t _Jp, class ..._Up> friend + typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; +public: + + _LIBCPP_INLINE_VISIBILITY + explicit tuple(const _Tp& ... __t) + : base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), + typename __make_tuple_indices<0>::type(), + typename __make_tuple_types<tuple, 0>::type(), + __t... + ) {} + + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) + : base_(allocator_arg_t(), __a, + typename __make_tuple_indices<sizeof...(_Tp)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), + typename __make_tuple_indices<0>::type(), + typename __make_tuple_types<tuple, 0>::type(), + __t... + ) {} + + template <class ..._Up, + class = typename enable_if + < + sizeof...(_Up) <= sizeof...(_Tp) && + __tuple_convertible + < + tuple<_Up...>, + typename __make_tuple_types<tuple, + sizeof...(_Up) < sizeof...(_Tp) ? + sizeof...(_Up) : + sizeof...(_Tp)>::type + >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + explicit + tuple(_Up&&... __u) + : base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), + typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), + _VSTD::forward<_Up>(__u)...) {} + + template <class _Alloc, class ..._Up, + class = typename enable_if + < + sizeof...(_Up) <= sizeof...(_Tp) && + __tuple_convertible + < + tuple<_Up...>, + typename __make_tuple_types<tuple, + sizeof...(_Up) < sizeof...(_Tp) ? + sizeof...(_Up) : + sizeof...(_Tp)>::type + >::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) + : base_(allocator_arg_t(), __a, + typename __make_tuple_indices<sizeof...(_Up)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), + typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), + typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), + _VSTD::forward<_Up>(__u)...) {} + + template <class _Tuple, + class = typename enable_if + < + __tuple_convertible<_Tuple, tuple>::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + tuple(_Tuple&& __t) + : base_(_VSTD::forward<_Tuple>(__t)) {} + + template <class _Alloc, class _Tuple, + class = typename enable_if + < + __tuple_convertible<_Tuple, tuple>::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) + : base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {} + + template <class _Tuple, + class = typename enable_if + < + __tuple_assignable<_Tuple, tuple>::value + >::type + > + _LIBCPP_INLINE_VISIBILITY + tuple& + operator=(_Tuple&& __t) + { + base_.operator=(_VSTD::forward<_Tuple>(__t)); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) + {base_.swap(__t.base_);} +}; + +template <> +class _LIBCPP_VISIBLE tuple<> +{ +public: + _LIBCPP_INLINE_VISIBILITY + tuple() {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc&) {} + template <class _Alloc> + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc&, const tuple&) {} + template <class _Up> + _LIBCPP_INLINE_VISIBILITY + tuple(array<_Up, 0>) {} + template <class _Alloc, class _Up> + _LIBCPP_INLINE_VISIBILITY + tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) {} + _LIBCPP_INLINE_VISIBILITY + void swap(tuple&) _NOEXCEPT {} +}; + +template <class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __all<__is_swappable<_Tp>::value...>::value, + void +>::type +swap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) + _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) + {__t.swap(__u);} + +// get + +template <size_t _Ip, class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(tuple<_Tp...>& __t) _NOEXCEPT +{ + typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; + return static_cast<__tuple_leaf<_Ip, type>&>(__t.base_).get(); +} + +template <size_t _Ip, class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY +const typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(const tuple<_Tp...>& __t) _NOEXCEPT +{ + typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; + return static_cast<const __tuple_leaf<_Ip, type>&>(__t.base_).get(); +} + +template <size_t _Ip, class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(tuple<_Tp...>&& __t) _NOEXCEPT +{ + typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; + return static_cast<type&&>( + static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get()); +} + +// tie + +template <class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY +tuple<_Tp&...> +tie(_Tp&... __t) +{ + return tuple<_Tp&...>(__t...); +} + +template <class _Up> +struct __ignore_t +{ + template <class _Tp> + _LIBCPP_INLINE_VISIBILITY + const __ignore_t& operator=(_Tp&&) const {return *this;} +}; + +namespace { const __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); } + +template <class _Tp> class reference_wrapper; + +template <class _Tp> +struct ___make_tuple_return +{ + typedef _Tp type; +}; + +template <class _Tp> +struct ___make_tuple_return<reference_wrapper<_Tp> > +{ + typedef _Tp& type; +}; + +template <class _Tp> +struct __make_tuple_return +{ + typedef typename ___make_tuple_return<typename decay<_Tp>::type>::type type; +}; + +template <class... _Tp> +inline _LIBCPP_INLINE_VISIBILITY +tuple<typename __make_tuple_return<_Tp>::type...> +make_tuple(_Tp&&... __t) +{ + return tuple<typename __make_tuple_return<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); +} + +template <class... _Tp> +inline _LIBCPP_INLINE_VISIBILITY +tuple<_Tp&&...> +forward_as_tuple(_Tp&&... __t) +{ + return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); +} + +template <size_t _Ip> +struct __tuple_equal +{ + template <class _Tp, class _Up> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Up& __y) + { + return __tuple_equal<_Ip - 1>()(__x, __y) && get<_Ip-1>(__x) == get<_Ip-1>(__y); + } +}; + +template <> +struct __tuple_equal<0> +{ + template <class _Tp, class _Up> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp&, const _Up&) + { + return true; + } +}; + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return __tuple_equal<sizeof...(_Tp)>()(__x, __y); +} + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return !(__x == __y); +} + +template <size_t _Ip> +struct __tuple_less +{ + template <class _Tp, class _Up> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Up& __y) + { + return __tuple_less<_Ip-1>()(__x, __y) || + (!__tuple_less<_Ip-1>()(__y, __x) && get<_Ip-1>(__x) < get<_Ip-1>(__y)); + } +}; + +template <> +struct __tuple_less<0> +{ + template <class _Tp, class _Up> + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp&, const _Up&) + { + return false; + } +}; + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return __tuple_less<sizeof...(_Tp)>()(__x, __y); +} + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return __y < __x; +} + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return !(__x < __y); +} + +template <class ..._Tp, class ..._Up> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) +{ + return !(__y < __x); +} + +// tuple_cat + +template <class _Tp, class _Up> struct __tuple_cat_type; + +template <class ..._Ttypes, class ..._Utypes> +struct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > +{ + typedef tuple<_Ttypes..., _Utypes...> type; +}; + +template <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> +struct __tuple_cat_return_1 +{ +}; + +template <class ..._Types, class _Tuple0> +struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> +{ + typedef typename __tuple_cat_type<tuple<_Types...>, + typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type>::type + type; +}; + +template <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> +struct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> + : public __tuple_cat_return_1< + typename __tuple_cat_type< + tuple<_Types...>, + typename __make_tuple_types<typename remove_reference<_Tuple0>::type>::type + >::type, + __tuple_like<typename remove_reference<_Tuple1>::type>::value, + _Tuple1, _Tuples...> +{ +}; + +template <class ..._Tuples> struct __tuple_cat_return; + +template <class _Tuple0, class ..._Tuples> +struct __tuple_cat_return<_Tuple0, _Tuples...> + : public __tuple_cat_return_1<tuple<>, + __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0, + _Tuples...> +{ +}; + +template <> +struct __tuple_cat_return<> +{ + typedef tuple<> type; +}; + +inline _LIBCPP_INLINE_VISIBILITY +tuple<> +tuple_cat() +{ + return tuple<>(); +} + +template <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> +struct __tuple_cat_return_ref_imp; + +template <class ..._Types, size_t ..._I0, class _Tuple0> +struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> +{ + typedef typename remove_reference<_Tuple0>::type _T0; + typedef tuple<_Types..., typename __apply_cv<_Tuple0, + typename tuple_element<_I0, _T0>::type>::type&&...> type; +}; + +template <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> +struct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, + _Tuple0, _Tuple1, _Tuples...> + : public __tuple_cat_return_ref_imp< + tuple<_Types..., typename __apply_cv<_Tuple0, + typename tuple_element<_I0, + typename remove_reference<_Tuple0>::type>::type>::type&&...>, + typename __make_tuple_indices<tuple_size<typename + remove_reference<_Tuple1>::type>::value>::type, + _Tuple1, _Tuples...> +{ +}; + +template <class _Tuple0, class ..._Tuples> +struct __tuple_cat_return_ref + : public __tuple_cat_return_ref_imp<tuple<>, + typename __make_tuple_indices< + tuple_size<typename remove_reference<_Tuple0>::type>::value + >::type, _Tuple0, _Tuples...> +{ +}; + +template <class _Types, class _I0, class _J0> +struct __tuple_cat; + +template <class ..._Types, size_t ..._I0, size_t ..._J0> +struct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > +{ + template <class _Tuple0> + _LIBCPP_INLINE_VISIBILITY + typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type + operator()(tuple<_Types...> __t, _Tuple0&& __t0) + { + return _VSTD::forward_as_tuple(_VSTD::forward<_Types>(get<_I0>(__t))..., + get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); + } + + template <class _Tuple0, class _Tuple1, class ..._Tuples> + _LIBCPP_INLINE_VISIBILITY + typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type + operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) + { + typedef typename remove_reference<_Tuple0>::type _T0; + typedef typename remove_reference<_Tuple1>::type _T1; + return __tuple_cat< + tuple<_Types..., typename __apply_cv<_Tuple0, typename tuple_element<_J0, _T0>::type>::type&&...>, + typename __make_tuple_indices<sizeof ...(_Types) + tuple_size<_T0>::value>::type, + typename __make_tuple_indices<tuple_size<_T1>::value>::type>() + (_VSTD::forward_as_tuple( + _VSTD::forward<_Types>(get<_I0>(__t))..., + get<_J0>(_VSTD::forward<_Tuple0>(__t0))... + ), + _VSTD::forward<_Tuple1>(__t1), + _VSTD::forward<_Tuples>(__tpls)...); + } +}; + +template <class _Tuple0, class... _Tuples> +inline _LIBCPP_INLINE_VISIBILITY +typename __tuple_cat_return<_Tuple0, _Tuples...>::type +tuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) +{ + typedef typename remove_reference<_Tuple0>::type _T0; + return __tuple_cat<tuple<>, __tuple_indices<>, + typename __make_tuple_indices<tuple_size<_T0>::value>::type>() + (tuple<>(), _VSTD::forward<_Tuple0>(__t0), + _VSTD::forward<_Tuples>(__tpls)...); +} + +template <class ..._Tp, class _Alloc> +struct _LIBCPP_VISIBLE uses_allocator<tuple<_Tp...>, _Alloc> + : true_type {}; + +template <class _T1, class _T2> +template <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> +inline _LIBCPP_INLINE_VISIBILITY +pair<_T1, _T2>::pair(piecewise_construct_t, + tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, + __tuple_indices<_I1...>, __tuple_indices<_I2...>) + : first(_VSTD::forward<_Args1>(get<_I1>( __first_args))...), + second(_VSTD::forward<_Args2>(get<_I2>(__second_args))...) +{ +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_TUPLE diff --git a/contrib/libc++/include/type_traits b/contrib/libc++/include/type_traits new file mode 100644 index 0000000..13129f3 --- /dev/null +++ b/contrib/libc++/include/type_traits @@ -0,0 +1,3128 @@ +// -*- C++ -*- +//===------------------------ type_traits ---------------------------------===// +// +// 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_TYPE_TRAITS +#define _LIBCPP_TYPE_TRAITS + +/* + type_traits synopsis + +namespace std +{ + + // helper class: + template <class T, T v> struct integral_constant; + typedef integral_constant<bool, true> true_type; + typedef integral_constant<bool, false> false_type; + + // helper traits + template <bool, class T = void> struct enable_if; + template <bool, class T, class F> struct conditional; + + // Primary classification traits: + template <class T> struct is_void; + template <class T> struct is_integral; + template <class T> struct is_floating_point; + template <class T> struct is_array; + template <class T> struct is_pointer; + template <class T> struct is_lvalue_reference; + template <class T> struct is_rvalue_reference; + template <class T> struct is_member_object_pointer; + template <class T> struct is_member_function_pointer; + template <class T> struct is_enum; + template <class T> struct is_union; + template <class T> struct is_class; + template <class T> struct is_function; + + // Secondary classification traits: + template <class T> struct is_reference; + template <class T> struct is_arithmetic; + template <class T> struct is_fundamental; + template <class T> struct is_member_pointer; + template <class T> struct is_scalar; + template <class T> struct is_object; + template <class T> struct is_compound; + + // Const-volatile properties and transformations: + template <class T> struct is_const; + template <class T> struct is_volatile; + template <class T> struct remove_const; + template <class T> struct remove_volatile; + template <class T> struct remove_cv; + template <class T> struct add_const; + template <class T> struct add_volatile; + template <class T> struct add_cv; + + // Reference transformations: + template <class T> struct remove_reference; + template <class T> struct add_lvalue_reference; + template <class T> struct add_rvalue_reference; + + // Pointer transformations: + template <class T> struct remove_pointer; + template <class T> struct add_pointer; + + // Integral properties: + template <class T> struct is_signed; + template <class T> struct is_unsigned; + template <class T> struct make_signed; + template <class T> struct make_unsigned; + + // Array properties and transformations: + template <class T> struct rank; + template <class T, unsigned I = 0> struct extent; + template <class T> struct remove_extent; + template <class T> struct remove_all_extents; + + // Member introspection: + template <class T> struct is_pod; + template <class T> struct is_trivial; + template <class T> struct is_trivially_copyable; + template <class T> struct is_standard_layout; + template <class T> struct is_literal_type; + template <class T> struct is_empty; + template <class T> struct is_polymorphic; + template <class T> struct is_abstract; + + template <class T, class... Args> struct is_constructible; + template <class T> struct is_default_constructible; + template <class T> struct is_copy_constructible; + template <class T> struct is_move_constructible; + template <class T, class U> struct is_assignable; + template <class T> struct is_copy_assignable; + template <class T> struct is_move_assignable; + template <class T> struct is_destructible; + + template <class T, class... Args> struct is_trivially_constructible; + template <class T> struct is_trivially_default_constructible; + template <class T> struct is_trivially_copy_constructible; + template <class T> struct is_trivially_move_constructible; + template <class T, class U> struct is_trivially_assignable; + template <class T> struct is_trivially_copy_assignable; + template <class T> struct is_trivially_move_assignable; + template <class T> struct is_trivially_destructible; + + template <class T, class... Args> struct is_nothrow_constructible; + template <class T> struct is_nothrow_default_constructible; + template <class T> struct is_nothrow_copy_constructible; + template <class T> struct is_nothrow_move_constructible; + template <class T, class U> struct is_nothrow_assignable; + template <class T> struct is_nothrow_copy_assignable; + template <class T> struct is_nothrow_move_assignable; + template <class T> struct is_nothrow_destructible; + + template <class T> struct has_virtual_destructor; + + // Relationships between types: + template <class T, class U> struct is_same; + template <class Base, class Derived> struct is_base_of; + template <class From, class To> struct is_convertible; + + // Alignment properties and transformations: + template <class T> struct alignment_of; + template <size_t Len, size_t Align = most_stringent_alignment_requirement> + struct aligned_storage; + + template <class T> struct decay; + template <class... T> struct common_type; + template <class T> struct underlying_type; + template <class> class result_of; // undefined + template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)>; + +} // std + +*/ +#include <__config> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <bool _Bp, class _If, class _Then> + struct _LIBCPP_VISIBLE conditional {typedef _If type;}; +template <class _If, class _Then> + struct _LIBCPP_VISIBLE conditional<false, _If, _Then> {typedef _Then type;}; + +template <bool, class _Tp = void> struct _LIBCPP_VISIBLE enable_if {}; +template <class _Tp> struct _LIBCPP_VISIBLE enable_if<true, _Tp> {typedef _Tp type;}; + +struct __two {char _[2];}; + +// helper class: + +template <class _Tp, _Tp __v> +struct _LIBCPP_VISIBLE integral_constant +{ + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant type; + _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_HAS_NO_CONSTEXPR + constexpr +#endif + operator value_type() +#ifdef _LIBCPP_HAS_NO_CONSTEXPR + const +#endif + {return value;} +}; + +template <class _Tp, _Tp __v> +constexpr _Tp integral_constant<_Tp, __v>::value; + +typedef integral_constant<bool, true> true_type; +typedef integral_constant<bool, false> false_type; + +// is_const + +template <class _Tp> struct _LIBCPP_VISIBLE is_const : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_const<_Tp const> : public true_type {}; + +// is_volatile + +template <class _Tp> struct _LIBCPP_VISIBLE is_volatile : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_volatile<_Tp volatile> : public true_type {}; + +// remove_const + +template <class _Tp> struct _LIBCPP_VISIBLE remove_const {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_const<const _Tp> {typedef _Tp type;}; + +// remove_volatile + +template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_volatile<volatile _Tp> {typedef _Tp type;}; + +// remove_cv + +template <class _Tp> struct _LIBCPP_VISIBLE remove_cv +{typedef typename remove_volatile<typename remove_const<_Tp>::type>::type type;}; + +// is_void + +template <class _Tp> struct __is_void : public false_type {}; +template <> struct __is_void<void> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_void + : public __is_void<typename remove_cv<_Tp>::type> {}; + +// __is_nullptr_t + +template <class _Tp> struct ____is_nullptr_t : public false_type {}; +template <> struct ____is_nullptr_t<nullptr_t> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE __is_nullptr_t + : public ____is_nullptr_t<typename remove_cv<_Tp>::type> {}; + +// is_integral + +template <class _Tp> struct __is_integral : public false_type {}; +template <> struct __is_integral<bool> : public true_type {}; +template <> struct __is_integral<char> : public true_type {}; +template <> struct __is_integral<signed char> : public true_type {}; +template <> struct __is_integral<unsigned char> : public true_type {}; +template <> struct __is_integral<wchar_t> : public true_type {}; +#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __is_integral<char16_t> : public true_type {}; +template <> struct __is_integral<char32_t> : public true_type {}; +#endif // _LIBCPP_HAS_NO_UNICODE_CHARS +template <> struct __is_integral<short> : public true_type {}; +template <> struct __is_integral<unsigned short> : public true_type {}; +template <> struct __is_integral<int> : public true_type {}; +template <> struct __is_integral<unsigned int> : public true_type {}; +template <> struct __is_integral<long> : public true_type {}; +template <> struct __is_integral<unsigned long> : public true_type {}; +template <> struct __is_integral<long long> : public true_type {}; +template <> struct __is_integral<unsigned long long> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_integral + : public __is_integral<typename remove_cv<_Tp>::type> {}; + +// is_floating_point + +template <class _Tp> struct __is_floating_point : public false_type {}; +template <> struct __is_floating_point<float> : public true_type {}; +template <> struct __is_floating_point<double> : public true_type {}; +template <> struct __is_floating_point<long double> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_floating_point + : public __is_floating_point<typename remove_cv<_Tp>::type> {}; + +// is_array + +template <class _Tp> struct _LIBCPP_VISIBLE is_array + : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_array<_Tp[]> + : public true_type {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE is_array<_Tp[_Np]> + : public true_type {}; + +// is_pointer + +template <class _Tp> struct __is_pointer : public false_type {}; +template <class _Tp> struct __is_pointer<_Tp*> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_pointer + : public __is_pointer<typename remove_cv<_Tp>::type> {}; + +// is_reference + +template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_lvalue_reference<_Tp&> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference : public false_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE is_rvalue_reference<_Tp&&> : public true_type {}; +#endif + +template <class _Tp> struct _LIBCPP_VISIBLE is_reference : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&> : public true_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE is_reference<_Tp&&> : public true_type {}; +#endif + +#if defined(__clang__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#define _LIBCPP_HAS_TYPE_TRAITS +#endif + +// is_union + +#if __has_feature(is_union) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_union + : public integral_constant<bool, __is_union(_Tp)> {}; + +#else + +template <class _Tp> struct __libcpp_union : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_union + : public __libcpp_union<typename remove_cv<_Tp>::type> {}; + +#endif + +// is_class + +#if __has_feature(is_class) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_class + : public integral_constant<bool, __is_class(_Tp)> {}; + +#else + +namespace __is_class_imp +{ +template <class _Tp> char __test(int _Tp::*); +template <class _Tp> __two __test(...); +} + +template <class _Tp> struct _LIBCPP_VISIBLE is_class + : public integral_constant<bool, sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && !is_union<_Tp>::value> {}; + +#endif + +// is_same + +template <class _Tp, class _Up> struct _LIBCPP_VISIBLE is_same : public false_type {}; +template <class _Tp> struct _LIBCPP_VISIBLE is_same<_Tp, _Tp> : public true_type {}; + +// is_function + +namespace __is_function_imp +{ +template <class _Tp> char __test(_Tp*); +template <class _Tp> __two __test(...); +template <class _Tp> _Tp& __source(); +} + +template <class _Tp, bool = is_class<_Tp>::value || + is_union<_Tp>::value || + is_void<_Tp>::value || + is_reference<_Tp>::value || + is_same<_Tp, nullptr_t>::value > +struct __is_function + : public integral_constant<bool, sizeof(__is_function_imp::__test<_Tp>(__is_function_imp::__source<_Tp>())) == 1> + {}; +template <class _Tp> struct __is_function<_Tp, true> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_function + : public __is_function<_Tp> {}; + +// is_member_function_pointer + +template <class _Tp> struct __is_member_function_pointer : public false_type {}; +template <class _Tp, class _Up> struct __is_member_function_pointer<_Tp _Up::*> : public is_function<_Tp> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_function_pointer + : public __is_member_function_pointer<typename remove_cv<_Tp>::type> {}; + +// is_member_pointer + +template <class _Tp> struct __is_member_pointer : public false_type {}; +template <class _Tp, class _Up> struct __is_member_pointer<_Tp _Up::*> : public true_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_pointer + : public __is_member_pointer<typename remove_cv<_Tp>::type> {}; + +// is_member_object_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE is_member_object_pointer + : public integral_constant<bool, is_member_pointer<_Tp>::value && + !is_member_function_pointer<_Tp>::value> {}; + +// is_enum + +#if __has_feature(is_enum) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_enum + : public integral_constant<bool, __is_enum(_Tp)> {}; + +#else + +template <class _Tp> struct _LIBCPP_VISIBLE is_enum + : public integral_constant<bool, !is_void<_Tp>::value && + !is_integral<_Tp>::value && + !is_floating_point<_Tp>::value && + !is_array<_Tp>::value && + !is_pointer<_Tp>::value && + !is_reference<_Tp>::value && + !is_member_pointer<_Tp>::value && + !is_union<_Tp>::value && + !is_class<_Tp>::value && + !is_function<_Tp>::value > {}; + +#endif + +// is_arithmetic + +template <class _Tp> struct _LIBCPP_VISIBLE is_arithmetic + : public integral_constant<bool, is_integral<_Tp>::value || + is_floating_point<_Tp>::value> {}; + +// is_fundamental + +template <class _Tp> struct _LIBCPP_VISIBLE is_fundamental + : public integral_constant<bool, is_void<_Tp>::value || + __is_nullptr_t<_Tp>::value || + is_arithmetic<_Tp>::value> {}; + +// is_scalar + +template <class _Tp> struct _LIBCPP_VISIBLE is_scalar + : public integral_constant<bool, is_arithmetic<_Tp>::value || + is_member_pointer<_Tp>::value || + is_pointer<_Tp>::value || + __is_nullptr_t<_Tp>::value || + is_enum<_Tp>::value > {}; + +template <> struct _LIBCPP_VISIBLE is_scalar<nullptr_t> : public true_type {}; + +// is_object + +template <class _Tp> struct _LIBCPP_VISIBLE is_object + : public integral_constant<bool, is_scalar<_Tp>::value || + is_array<_Tp>::value || + is_union<_Tp>::value || + is_class<_Tp>::value > {}; + +// is_compound + +template <class _Tp> struct _LIBCPP_VISIBLE is_compound + : public integral_constant<bool, !is_fundamental<_Tp>::value> {}; + +// add_const + +template <class _Tp, bool = is_reference<_Tp>::value || + is_function<_Tp>::value || + is_const<_Tp>::value > +struct __add_const {typedef _Tp type;}; + +template <class _Tp> +struct __add_const<_Tp, false> {typedef const _Tp type;}; + +template <class _Tp> struct _LIBCPP_VISIBLE add_const + {typedef typename __add_const<_Tp>::type type;}; + +// add_volatile + +template <class _Tp, bool = is_reference<_Tp>::value || + is_function<_Tp>::value || + is_volatile<_Tp>::value > +struct __add_volatile {typedef _Tp type;}; + +template <class _Tp> +struct __add_volatile<_Tp, false> {typedef volatile _Tp type;}; + +template <class _Tp> struct _LIBCPP_VISIBLE add_volatile + {typedef typename __add_volatile<_Tp>::type type;}; + +// add_cv + +template <class _Tp> struct _LIBCPP_VISIBLE add_cv + {typedef typename add_const<typename add_volatile<_Tp>::type>::type type;}; + +// remove_reference + +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&> {typedef _Tp type;}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> struct _LIBCPP_VISIBLE remove_reference<_Tp&&> {typedef _Tp type;}; +#endif + +// add_lvalue_reference + +template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference {typedef _Tp& type;}; +template <class _Tp> struct _LIBCPP_VISIBLE add_lvalue_reference<_Tp&> {typedef _Tp& type;}; // for older compiler +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<void> {typedef void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const void> {typedef const void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<volatile void> {typedef volatile void type;}; +template <> struct _LIBCPP_VISIBLE add_lvalue_reference<const volatile void> {typedef const volatile void type;}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> struct _LIBCPP_VISIBLE add_rvalue_reference {typedef _Tp&& type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<void> {typedef void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const void> {typedef const void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<volatile void> {typedef volatile void type;}; +template <> struct _LIBCPP_VISIBLE add_rvalue_reference<const volatile void> {typedef const volatile void type;}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +typename add_rvalue_reference<_Tp>::type +declval() _NOEXCEPT; + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +typename add_lvalue_reference<_Tp>::type +declval(); + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +struct __any +{ + __any(...); +}; + +// remove_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp*> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* volatile> {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_pointer<_Tp* const volatile> {typedef _Tp type;}; + +// add_pointer + +template <class _Tp> struct _LIBCPP_VISIBLE add_pointer + {typedef typename remove_reference<_Tp>::type* type;}; + +// is_signed + +template <class _Tp, bool = is_integral<_Tp>::value> +struct ___is_signed : public integral_constant<bool, _Tp(-1) < _Tp(0)> {}; + +template <class _Tp> +struct ___is_signed<_Tp, false> : public true_type {}; // floating point + +template <class _Tp, bool = is_arithmetic<_Tp>::value> +struct __is_signed : public ___is_signed<_Tp> {}; + +template <class _Tp> struct __is_signed<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_signed : public __is_signed<_Tp> {}; + +// is_unsigned + +template <class _Tp, bool = is_integral<_Tp>::value> +struct ___is_unsigned : public integral_constant<bool, _Tp(0) < _Tp(-1)> {}; + +template <class _Tp> +struct ___is_unsigned<_Tp, false> : public false_type {}; // floating point + +template <class _Tp, bool = is_arithmetic<_Tp>::value> +struct __is_unsigned : public ___is_unsigned<_Tp> {}; + +template <class _Tp> struct __is_unsigned<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_unsigned : public __is_unsigned<_Tp> {}; + +// rank + +template <class _Tp> struct _LIBCPP_VISIBLE rank + : public integral_constant<size_t, 0> {}; +template <class _Tp> struct _LIBCPP_VISIBLE rank<_Tp[]> + : public integral_constant<size_t, rank<_Tp>::value + 1> {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE rank<_Tp[_Np]> + : public integral_constant<size_t, rank<_Tp>::value + 1> {}; + +// extent + +template <class _Tp, unsigned _Ip = 0> struct _LIBCPP_VISIBLE extent + : public integral_constant<size_t, 0> {}; +template <class _Tp> struct _LIBCPP_VISIBLE extent<_Tp[], 0> + : public integral_constant<size_t, 0> {}; +template <class _Tp, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[], _Ip> + : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE extent<_Tp[_Np], 0> + : public integral_constant<size_t, _Np> {}; +template <class _Tp, size_t _Np, unsigned _Ip> struct _LIBCPP_VISIBLE extent<_Tp[_Np], _Ip> + : public integral_constant<size_t, extent<_Tp, _Ip-1>::value> {}; + +// remove_extent + +template <class _Tp> struct _LIBCPP_VISIBLE remove_extent + {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_extent<_Tp[]> + {typedef _Tp type;}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_extent<_Tp[_Np]> + {typedef _Tp type;}; + +// remove_all_extents + +template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents + {typedef _Tp type;}; +template <class _Tp> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[]> + {typedef typename remove_all_extents<_Tp>::type type;}; +template <class _Tp, size_t _Np> struct _LIBCPP_VISIBLE remove_all_extents<_Tp[_Np]> + {typedef typename remove_all_extents<_Tp>::type type;}; + +// is_abstract + +namespace __is_abstract_imp +{ +template <class _Tp> char __test(_Tp (*)[1]); +template <class _Tp> __two __test(...); +} + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_abstract : public integral_constant<bool, sizeof(__is_abstract_imp::__test<_Tp>(0)) != 1> {}; + +template <class _Tp> struct __libcpp_abstract<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_abstract : public __libcpp_abstract<_Tp> {}; + +// is_convertible + +#if __has_feature(is_convertible_to) + +template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible + : public integral_constant<bool, __is_convertible_to(_T1, _T2)> {}; + +#else // __has_feature(is_convertible_to) + +namespace __is_convertible_imp +{ +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> char __test(const volatile typename remove_reference<_Tp>::type&&); +#else +template <class _Tp> char __test(_Tp); +#endif +template <class _Tp> __two __test(...); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _Tp> _Tp&& __source(); +#else +template <class _Tp> typename remove_reference<_Tp>::type& __source(); +#endif + +template <class _Tp, bool _IsArray = is_array<_Tp>::value, + bool _IsFunction = is_function<_Tp>::value, + bool _IsVoid = is_void<_Tp>::value> + struct __is_array_function_or_void {enum {value = 0};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, true, false, false> {enum {value = 1};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, false, true, false> {enum {value = 2};}; +template <class _Tp> struct __is_array_function_or_void<_Tp, false, false, true> {enum {value = 3};}; +} + +template <class _Tp, + unsigned = __is_convertible_imp::__is_array_function_or_void<typename remove_reference<_Tp>::type>::value> +struct __is_convertible_check +{ + static const size_t __v = 0; +}; + +template <class _Tp> +struct __is_convertible_check<_Tp, 0> +{ + static const size_t __v = sizeof(_Tp); +}; + +template <class _T1, class _T2, + unsigned _T1_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T1>::value, + unsigned _T2_is_array_function_or_void = __is_convertible_imp::__is_array_function_or_void<_T2>::value> +struct __is_convertible + : public integral_constant<bool, + sizeof(__is_convertible_imp::__test<_T2>(__is_convertible_imp::__source<_T1>())) == 1 + > +{}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 0> : false_type {}; + +template <class _T1> struct __is_convertible<_T1, const _T1&, 1, 0> : true_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _T1> struct __is_convertible<_T1, _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, const _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, volatile _T1&&, 1, 0> : true_type {}; +template <class _T1> struct __is_convertible<_T1, const volatile _T1&&, 1, 0> : true_type {}; +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2*, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* volatile, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*volatile>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2* const volatile, 1, 0> + : public integral_constant<bool, __is_convertible<typename remove_all_extents<_T1>::type*, _T2*const volatile>::value> {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 0> : public false_type {}; +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +template <class _T1> struct __is_convertible<_T1, _T1&&, 2, 0> : public true_type {}; +#endif +template <class _T1> struct __is_convertible<_T1, _T1*, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*const, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*volatile, 2, 0> : public true_type {}; +template <class _T1> struct __is_convertible<_T1, _T1*const volatile, 2, 0> : public true_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 0> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 1> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 1> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 2> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 2> : public false_type {}; + +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 0, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 1, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 2, 3> : public false_type {}; +template <class _T1, class _T2> struct __is_convertible<_T1, _T2, 3, 3> : public true_type {}; + +template <class _T1, class _T2> struct _LIBCPP_VISIBLE is_convertible + : public __is_convertible<_T1, _T2> +{ + static const size_t __complete_check1 = __is_convertible_check<_T1>::__v; + static const size_t __complete_check2 = __is_convertible_check<_T2>::__v; +}; + +#endif // __has_feature(is_convertible_to) + +// is_base_of + +#ifdef _LIBCP_HAS_IS_BASE_OF + +template <class _Bp, class _Dp> +struct _LIBCPP_VISIBLE is_base_of + : public integral_constant<bool, __is_base_of(_Bp, _Dp)> {}; + +#else // __has_feature(is_base_of) + +#error is_base_of not implemented. + +#endif // __has_feature(is_base_of) + +// is_empty + +#if __has_feature(is_empty) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_empty + : public integral_constant<bool, __is_empty(_Tp)> {}; + +#else // __has_feature(is_empty) + +template <class _Tp> +struct __is_empty1 + : public _Tp +{ + double _; +}; + +struct __is_empty2 +{ + double _; +}; + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_empty : public integral_constant<bool, sizeof(__is_empty1<_Tp>) == sizeof(__is_empty2)> {}; + +template <class _Tp> struct __libcpp_empty<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_empty : public __libcpp_empty<_Tp> {}; + +#endif // __has_feature(is_empty) + +// is_polymorphic + +#if __has_feature(is_polymorphic) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_polymorphic + : public integral_constant<bool, __is_polymorphic(_Tp)> {}; + +#else + +template <class _Tp> struct __is_polymorphic1 : public _Tp {}; +template <class _Tp> struct __is_polymorphic2 : public _Tp {virtual ~__is_polymorphic2() throw();}; + +template <class _Tp, bool = is_class<_Tp>::value> +struct __libcpp_polymorphic + : public integral_constant<bool, sizeof(__is_polymorphic1<_Tp>) == sizeof(__is_polymorphic2<_Tp>)> {}; + +template <class _Tp> struct __libcpp_polymorphic<_Tp, false> : public false_type {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_polymorphic + : public __libcpp_polymorphic<_Tp> {}; + +#endif // __has_feature(is_polymorphic) + +// has_virtual_destructor + +#if __has_feature(has_virtual_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor + : public integral_constant<bool, __has_virtual_destructor(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct _LIBCPP_VISIBLE has_virtual_destructor + : public false_type {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// alignment_of + +template <class _Tp> struct __alignment_of {_Tp _;}; + +template <class _Tp> struct _LIBCPP_VISIBLE alignment_of + : public integral_constant<size_t, __alignof__(__alignment_of<typename remove_all_extents<_Tp>::type>)> {}; + +// aligned_storage + +template <class _Hp, class _Tp> +struct __type_list +{ + typedef _Hp _Head; + typedef _Tp _Tail; +}; + +struct __nat +{ +#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS + __nat() = delete; + __nat(const __nat&) = delete; + __nat& operator=(const __nat&) = delete; + ~__nat() = delete; +#endif +}; + +template <class _Tp> +struct __align_type +{ + static const size_t value = alignment_of<_Tp>::value; + typedef _Tp type; +}; + +struct __struct_double {long double _;}; +struct __struct_double4 {double _[4];}; + +typedef + __type_list<__align_type<unsigned char>, + __type_list<__align_type<unsigned short>, + __type_list<__align_type<unsigned int>, + __type_list<__align_type<unsigned long>, + __type_list<__align_type<unsigned long long>, + __type_list<__align_type<double>, + __type_list<__align_type<long double>, + __type_list<__align_type<__struct_double>, + __type_list<__align_type<__struct_double4>, + __type_list<__align_type<int*>, + __nat + > > > > > > > > > > __all_types; + +template <class _TL, size_t _Align> struct __find_pod; + +template <class _Hp, size_t _Align> +struct __find_pod<__type_list<_Hp, __nat>, _Align> +{ + typedef typename conditional< + _Align == _Hp::value, + typename _Hp::type, + void + >::type type; +}; + +template <class _Hp, class _Tp, size_t _Align> +struct __find_pod<__type_list<_Hp, _Tp>, _Align> +{ + typedef typename conditional< + _Align == _Hp::value, + typename _Hp::type, + typename __find_pod<_Tp, _Align>::type + >::type type; +}; + +template <class _TL, size_t _Len> struct __find_max_align; + +template <class _Hp, size_t _Len> +struct __find_max_align<__type_list<_Hp, __nat>, _Len> : public integral_constant<size_t, _Hp::value> {}; + +template <size_t _Len, size_t _A1, size_t _A2> +struct __select_align +{ +private: + static const size_t __min = _A2 < _A1 ? _A2 : _A1; + static const size_t __max = _A1 < _A2 ? _A2 : _A1; +public: + static const size_t value = _Len < __max ? __min : __max; +}; + +template <class _Hp, class _Tp, size_t _Len> +struct __find_max_align<__type_list<_Hp, _Tp>, _Len> + : public integral_constant<size_t, __select_align<_Len, _Hp::value, __find_max_align<_Tp, _Len>::value>::value> {}; + +template <size_t _Len, const size_t _Align = __find_max_align<__all_types, _Len>::value> +struct _LIBCPP_VISIBLE aligned_storage +{ + typedef typename __find_pod<__all_types, _Align>::type _Aligner; + static_assert(!is_void<_Aligner>::value, ""); + union type + { + _Aligner __align; + unsigned char __data[_Len]; + }; +}; + +#define _CREATE_ALIGNED_STORAGE_SPECIALIZATION(n) \ +template <size_t _Len>\ +struct _LIBCPP_VISIBLE aligned_storage<_Len, n>\ +{\ + struct _ALIGNAS(n) type\ + {\ + unsigned char _[_Len];\ + };\ +} + +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x8); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x10); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x20); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x40); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x80); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x100); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x200); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x400); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x800); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x1000); +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x2000); +// MSDN says that MSVC does not support alignment beyond 8192 (=0x2000) +#if !defined(_MSC_VER) +_CREATE_ALIGNED_STORAGE_SPECIALIZATION(0x4000); +#endif // !_MSC_VER + +#undef _CREATE_ALIGNED_STORAGE_SPECIALIZATION + +// __promote + +template <class _A1, class _A2 = void, class _A3 = void, + bool = (is_arithmetic<_A1>::value || is_void<_A1>::value) && + (is_arithmetic<_A2>::value || is_void<_A2>::value) && + (is_arithmetic<_A3>::value || is_void<_A3>::value)> +class __promote {}; + +template <class _A1, class _A2, class _A3> +class __promote<_A1, _A2, _A3, true> +{ +private: + typedef typename __promote<_A1>::type __type1; + typedef typename __promote<_A2>::type __type2; + typedef typename __promote<_A3>::type __type3; +public: + typedef decltype(__type1() + __type2() + __type3()) type; +}; + +template <class _A1, class _A2> +class __promote<_A1, _A2, void, true> +{ +private: + typedef typename __promote<_A1>::type __type1; + typedef typename __promote<_A2>::type __type2; +public: + typedef decltype(__type1() + __type2()) type; +}; + +template <class _A1> +class __promote<_A1, void, void, true> +{ +public: + typedef typename conditional<is_arithmetic<_A1>::value, + typename conditional<is_integral<_A1>::value, double, _A1>::type, + void + >::type type; +}; + +#ifdef _LIBCPP_STORE_AS_OPTIMIZATION + +// __transform + +template <class _Tp, size_t = sizeof(_Tp), bool = is_scalar<_Tp>::value> struct __transform {typedef _Tp type;}; +template <class _Tp> struct __transform<_Tp, 1, true> {typedef unsigned char type;}; +template <class _Tp> struct __transform<_Tp, 2, true> {typedef unsigned short type;}; +template <class _Tp> struct __transform<_Tp, 4, true> {typedef unsigned int type;}; +template <class _Tp> struct __transform<_Tp, 8, true> {typedef unsigned long long type;}; + +#endif // _LIBCPP_STORE_AS_OPTIMIZATION + +// make_signed / make_unsigned + +typedef + __type_list<signed char, + __type_list<signed short, + __type_list<signed int, + __type_list<signed long, + __type_list<signed long long, + __nat + > > > > > __signed_types; + +typedef + __type_list<unsigned char, + __type_list<unsigned short, + __type_list<unsigned int, + __type_list<unsigned long, + __type_list<unsigned long long, + __nat + > > > > > __unsigned_types; + +template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first; + +template <class _Hp, class _Tp, size_t _Size> +struct __find_first<__type_list<_Hp, _Tp>, _Size, true> +{ + typedef _Hp type; +}; + +template <class _Hp, class _Tp, size_t _Size> +struct __find_first<__type_list<_Hp, _Tp>, _Size, false> +{ + typedef typename __find_first<_Tp, _Size>::type type; +}; + +template <class _Tp, class _Up, bool = is_const<typename remove_reference<_Tp>::type>::value, + bool = is_volatile<typename remove_reference<_Tp>::type>::value> +struct __apply_cv +{ + typedef _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, true, false> +{ + typedef const _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, false, true> +{ + typedef volatile _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp, _Up, true, true> +{ + typedef const volatile _Up type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, false, false> +{ + typedef _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, true, false> +{ + typedef const _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, false, true> +{ + typedef volatile _Up& type; +}; + +template <class _Tp, class _Up> +struct __apply_cv<_Tp&, _Up, true, true> +{ + typedef const volatile _Up& type; +}; + +template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> +struct __make_signed {}; + +template <class _Tp> +struct __make_signed<_Tp, true> +{ + typedef typename __find_first<__signed_types, sizeof(_Tp)>::type type; +}; + +template <> struct __make_signed<bool, true> {}; +template <> struct __make_signed< signed short, true> {typedef short type;}; +template <> struct __make_signed<unsigned short, true> {typedef short type;}; +template <> struct __make_signed< signed int, true> {typedef int type;}; +template <> struct __make_signed<unsigned int, true> {typedef int type;}; +template <> struct __make_signed< signed long, true> {typedef long type;}; +template <> struct __make_signed<unsigned long, true> {typedef long type;}; +template <> struct __make_signed< signed long long, true> {typedef long long type;}; +template <> struct __make_signed<unsigned long long, true> {typedef long long type;}; + +template <class _Tp> +struct _LIBCPP_VISIBLE make_signed +{ + typedef typename __apply_cv<_Tp, typename __make_signed<typename remove_cv<_Tp>::type>::type>::type type; +}; + +template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> +struct __make_unsigned {}; + +template <class _Tp> +struct __make_unsigned<_Tp, true> +{ + typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; +}; + +template <> struct __make_unsigned<bool, true> {}; +template <> struct __make_unsigned< signed short, true> {typedef unsigned short type;}; +template <> struct __make_unsigned<unsigned short, true> {typedef unsigned short type;}; +template <> struct __make_unsigned< signed int, true> {typedef unsigned int type;}; +template <> struct __make_unsigned<unsigned int, true> {typedef unsigned int type;}; +template <> struct __make_unsigned< signed long, true> {typedef unsigned long type;}; +template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;}; +template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;}; +template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;}; + +template <class _Tp> +struct _LIBCPP_VISIBLE make_unsigned +{ + typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type; +}; + +#ifdef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Up = void, class V = void> +struct _LIBCPP_VISIBLE common_type +{ +public: + typedef typename common_type<typename common_type<_Tp, _Up>::type, V>::type type; +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE common_type<_Tp, void, void> +{ +public: + typedef _Tp type; +}; + +template <class _Tp, class _Up> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up, void> +{ +private: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + static _Tp&& __t(); + static _Up&& __u(); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + static _Tp __t(); + static _Up __u(); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +public: + typedef typename remove_reference<decltype(true ? __t() : __u())>::type type; +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class ..._Tp> struct common_type; + +template <class _Tp> +struct _LIBCPP_VISIBLE common_type<_Tp> +{ + typedef _Tp type; +}; + +template <class _Tp, class _Up> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up> +{ +private: + static _Tp&& __t(); + static _Up&& __u(); + static bool __f(); +public: + typedef typename remove_reference<decltype(__f() ? __t() : __u())>::type type; +}; + +template <class _Tp, class _Up, class ..._Vp> +struct _LIBCPP_VISIBLE common_type<_Tp, _Up, _Vp...> +{ + typedef typename common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_assignable + +template <class _Tp, class _Arg> +decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>(), true_type())) +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_assignable_test(_Tp&&, _Arg&&); +#else +__is_assignable_test(_Tp, _Arg&); +#endif + +template <class _Arg> +false_type +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_assignable_test(__any, _Arg&&); +#else +__is_assignable_test(__any, _Arg&); +#endif + +template <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value> +struct __is_assignable_imp + : public common_type + < + decltype(__is_assignable_test(declval<_Tp>(), declval<_Arg>())) + >::type {}; + +template <class _Tp, class _Arg> +struct __is_assignable_imp<_Tp, _Arg, true> + : public false_type +{ +}; + +template <class _Tp, class _Arg> +struct is_assignable + : public __is_assignable_imp<_Tp, _Arg> {}; + +// is_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_copy_assignable + : public is_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> {}; + +// is_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_move_assignable +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_rvalue_reference<_Tp>::type> {}; +#else + : public is_copy_assignable<_Tp> {}; +#endif + +// is_destructible + +template <class _Tp> +struct __destructible_test +{ + _Tp __t; +}; + +template <class _Tp> +decltype((_VSTD::declval<__destructible_test<_Tp> >().~__destructible_test<_Tp>(), true_type())) +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +__is_destructible_test(_Tp&&); +#else +__is_destructible_test(_Tp&); +#endif + +false_type +__is_destructible_test(__any); + +template <class _Tp, bool = is_void<_Tp>::value || is_abstract<_Tp>::value> +struct __destructible_imp + : public common_type + < + decltype(__is_destructible_test(declval<_Tp>())) + >::type {}; + +template <class _Tp> +struct __destructible_imp<_Tp, true> + : public false_type {}; + +template <class _Tp> +struct is_destructible + : public __destructible_imp<_Tp> {}; + +// move + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename remove_reference<_Tp>::type&& +move(_Tp&& __t) _NOEXCEPT +{ + typedef typename remove_reference<_Tp>::type _Up; + return static_cast<_Up&&>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type& __t) _NOEXCEPT +{ + return static_cast<_Tp&&>(__t); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp&& +forward(typename std::remove_reference<_Tp>::type&& __t) _NOEXCEPT +{ + static_assert(!std::is_lvalue_reference<_Tp>::value, + "Can not forward an rvalue as an lvalue."); + return static_cast<_Tp&&>(__t); +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +class __rv +{ + typedef typename remove_reference<_Tp>::type _Trr; + _Trr& t_; +public: + _LIBCPP_INLINE_VISIBILITY + _Trr* operator->() {return &t_;} + _LIBCPP_INLINE_VISIBILITY + explicit __rv(_Trr& __t) : t_(__t) {} +}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + _Tp& +>::type +move(_Tp& __t) +{ + return __t; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + const _Tp& +>::type +move(const _Tp& __t) +{ + return __t; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +move(_Tp& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + typename add_lvalue_reference<_Tp>::type +>::type +forward(_Up& __t) +{ + return __t; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_convertible<_Tp, __rv<_Tp> >::value, + typename add_lvalue_reference<_Tp>::type +>::type +forward(const _Up& __t) +{ + return __t; +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +forward(_Up& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +template <class _Tp, class _Up> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + is_convertible<_Tp, __rv<_Tp> >::value, + _Tp +>::type +forward(const _Up& __t) +{ + return _Tp(__rv<_Tp>(__t)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct _LIBCPP_VISIBLE decay +{ +private: + typedef typename remove_reference<_Tp>::type _Up; +public: + typedef typename conditional + < + is_array<_Up>::value, + typename remove_extent<_Up>::type*, + typename conditional + < + is_function<_Up>::value, + typename add_pointer<_Up>::type, + typename remove_cv<_Up>::type + >::type + >::type type; +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename decay<_Tp>::type +__decay_copy(_Tp&& __t) +{ + return _VSTD::forward<_Tp>(__t); +} + +#else + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +typename decay<_Tp>::type +__decay_copy(const _Tp& __t) +{ + return _VSTD::forward<_Tp>(__t); +} + +#endif + +template <class _MP, bool _IsMemberFuctionPtr, bool _IsMemberObjectPtr> +struct __member_pointer_traits_imp +{ +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; +}; + +#if __has_feature(cxx_reference_qualified_functions) + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> +{ + typedef _Class& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false> +{ + typedef _Class const& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false> +{ + typedef _Class volatile& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false> +{ + typedef _Class const volatile& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> +{ + typedef _Class&& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false> +{ + typedef _Class const&& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false> +{ + typedef _Class volatile&& _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class ..._Param> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false> +{ + typedef _Class const volatile&& _ClassType; + typedef _Rp _ReturnType; +}; + +#endif // __has_feature(cxx_reference_qualified_functions) + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _Rp, class _Class, class _P0, class _P1, class _P2> +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Rp, class _Class> +struct __member_pointer_traits_imp<_Rp _Class::*, false, true> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template <class _MP> +struct __member_pointer_traits + : public __member_pointer_traits_imp<_MP, + is_member_function_pointer<_MP>::value, + is_member_object_pointer<_MP>::value> +{ +// typedef ... _ClassType; +// typedef ... _ReturnType; +}; + +// result_of + +template <class _Callable> class result_of; + +template <class _Fn, bool, bool> +class __result_of +{ +}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Fn, class ..._ArgTypes> +class __result_of<_Fn(_ArgTypes...), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; +}; + +template <class _MP, class _Tp, bool _IsMemberFunctionPtr> +struct __result_of_mp; + +// member function pointer + +template <class _MP, class _Tp> +struct __result_of_mp<_MP, _Tp, true> + : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> +{ +}; + +// member data pointer + +template <class _MP, class _Tp, bool> +struct __result_of_mdp; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, false> +{ + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type&& type; +}; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _Rp>::type&& type; +}; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mp<_Rp _Class::*, _Tp, false> + : public __result_of_mdp<_Rp _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class ..._ArgTypes> +class __result_of<_Fn(_Tp, _ArgTypes...), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +// result_of + +template <class _Fn, class ..._ArgTypes> +class _LIBCPP_VISIBLE result_of<_Fn(_ArgTypes...)> + : public __result_of<_Fn(_ArgTypes...), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Fn> +class __result_of<_Fn(), true, false> +{ +public: + typedef decltype(declval<_Fn>()()) type; +}; + +template <class _Fn, class _A0> +class __result_of<_Fn(_A0), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>())) type; +}; + +template <class _Fn, class _A0, class _A1> +class __result_of<_Fn(_A0, _A1), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>())) type; +}; + +template <class _Fn, class _A0, class _A1, class _A2> +class __result_of<_Fn(_A0, _A1, _A2), true, false> +{ +public: + typedef decltype(declval<_Fn>()(declval<_A0>(), declval<_A1>(), declval<_A2>())) type; +}; + +template <class _MP, class _Tp, bool _IsMemberFunctionPtr> +struct __result_of_mp; + +// member function pointer + +template <class _MP, class _Tp> +struct __result_of_mp<_MP, _Tp, true> + : public common_type<typename __member_pointer_traits<_MP>::_ReturnType> +{ +}; + +// member data pointer + +template <class _MP, class _Tp, bool> +struct __result_of_mdp; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, false> +{ + typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _Rp>::type& type; +}; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mdp<_Rp _Class::*, _Tp, true> +{ + typedef typename __apply_cv<_Tp, _Rp>::type& type; +}; + +template <class _Rp, class _Class, class _Tp> +struct __result_of_mp<_Rp _Class::*, _Tp, false> + : public __result_of_mdp<_Rp _Class::*, _Tp, + is_base_of<_Class, typename remove_reference<_Tp>::type>::value> +{ +}; + + + +template <class _Fn, class _Tp> +class __result_of<_Fn(_Tp), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0> +class __result_of<_Fn(_Tp, _A0), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0, class _A1> +class __result_of<_Fn(_Tp, _A0, _A1), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +template <class _Fn, class _Tp, class _A0, class _A1, class _A2> +class __result_of<_Fn(_Tp, _A0, _A1, _A2), false, true> // _Fn must be member pointer + : public __result_of_mp<typename remove_reference<_Fn>::type, + _Tp, + is_member_function_pointer<typename remove_reference<_Fn>::type>::value> +{ +}; + +// result_of + +template <class _Fn> +class _LIBCPP_VISIBLE result_of<_Fn()> + : public __result_of<_Fn(), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0> +class _LIBCPP_VISIBLE result_of<_Fn(_A0)> + : public __result_of<_Fn(_A0), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0, class _A1> +class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1)> + : public __result_of<_Fn(_A0, _A1), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +template <class _Fn, class _A0, class _A1, class _A2> +class _LIBCPP_VISIBLE result_of<_Fn(_A0, _A1, _A2)> + : public __result_of<_Fn(_A0, _A1, _A2), + is_class<typename remove_reference<_Fn>::type>::value || + is_function<typename remove_reference<_Fn>::type>::value, + is_member_pointer<typename remove_reference<_Fn>::type>::value + > +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// template <class T, class... Args> struct is_constructible; + +// main is_constructible test + +template <class _Tp, class ..._Args> +decltype(_VSTD::move(_Tp(_VSTD::declval<_Args>()...)), true_type()) +__is_constructible_test(_Tp&&, _Args&& ...); + +template <class ..._Args> +false_type +__is_constructible_test(__any, _Args&& ...); + +template <bool, class _Tp, class... _Args> +struct __is_constructible // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible_test(declval<_Tp>(), declval<_Args>()...)) + >::type + {}; + +// function types are not constructible + +template <class _Rp, class... _A1, class... _A2> +struct __is_constructible<false, _Rp(_A1...), _A2...> + : public false_type + {}; + +// handle scalars and reference types + +// Scalars are default constructible, references are not + +template <class _Tp> +struct __is_constructible<true, _Tp> + : public is_scalar<_Tp> + {}; + +// Scalars and references are constructible from one arg if that arg is +// implicitly convertible to the scalar or reference. + +template <class _Tp> +struct __is_constructible_ref +{ + true_type static __(_Tp); + false_type static __(...); +}; + +template <class _Tp, class _A0> +struct __is_constructible<true, _Tp, _A0> + : public common_type + < + decltype(__is_constructible_ref<_Tp>::__(declval<_A0>())) + >::type + {}; + +// Scalars and references are not constructible from multiple args. + +template <class _Tp, class _A0, class ..._Args> +struct __is_constructible<true, _Tp, _A0, _Args...> + : public false_type + {}; + +// Treat scalars and reference types separately + +template <bool, class _Tp, class... _Args> +struct __is_constructible_void_check + : public __is_constructible<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _Args...> + {}; + +// If any of T or Args is void, is_constructible should be false + +template <class _Tp, class... _Args> +struct __is_constructible_void_check<true, _Tp, _Args...> + : public false_type + {}; + +template <class ..._Args> struct __contains_void; + +template <> struct __contains_void<> : false_type {}; + +template <class _A0, class ..._Args> +struct __contains_void<_A0, _Args...> +{ + static const bool value = is_void<_A0>::value || + __contains_void<_Args...>::value; +}; + +// is_constructible entry point + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_constructible + : public __is_constructible_void_check<__contains_void<_Tp, _Args...>::value + || is_abstract<_Tp>::value, + _Tp, _Args...> + {}; + +// Array types are default constructible if their element type +// is default constructible + +template <class _Ap, size_t _Np> +struct __is_constructible<false, _Ap[_Np]> + : public is_constructible<typename remove_all_extents<_Ap>::type> + {}; + +// Otherwise array types are not constructible by this syntax + +template <class _Ap, size_t _Np, class ..._Args> +struct __is_constructible<false, _Ap[_Np], _Args...> + : public false_type + {}; + +// Incomplete array types are not constructible + +template <class _Ap, class ..._Args> +struct __is_constructible<false, _Ap[], _Args...> + : public false_type + {}; + +#else // _LIBCPP_HAS_NO_VARIADICS + +// template <class T> struct is_constructible0; + +// main is_constructible0 test + +template <class _Tp> +decltype((_Tp(), true_type())) +__is_constructible0_test(_Tp&); + +false_type +__is_constructible0_test(__any); + +template <class _Tp, class _A0> +decltype((_Tp(_VSTD::declval<_A0>()), true_type())) +__is_constructible1_test(_Tp&, _A0&); + +template <class _A0> +false_type +__is_constructible1_test(__any, _A0&); + +template <class _Tp, class _A0, class _A1> +decltype((_Tp(_VSTD::declval<_A0>(), _VSTD::declval<_A1>()), true_type())) +__is_constructible2_test(_Tp&, _A0&, _A1&); + +template <class _A0, class _A1> +false_type +__is_constructible2_test(__any, _A0&, _A1&); + +template <bool, class _Tp> +struct __is_constructible0_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible0_test(declval<_Tp&>())) + >::type + {}; + +template <bool, class _Tp, class _A0> +struct __is_constructible1_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible1_test(declval<_Tp&>(), declval<_A0&>())) + >::type + {}; + +template <bool, class _Tp, class _A0, class _A1> +struct __is_constructible2_imp // false, _Tp is not a scalar + : public common_type + < + decltype(__is_constructible2_test(declval<_Tp&>(), declval<_A0>(), declval<_A1>())) + >::type + {}; + +// handle scalars and reference types + +// Scalars are default constructible, references are not + +template <class _Tp> +struct __is_constructible0_imp<true, _Tp> + : public is_scalar<_Tp> + {}; + +template <class _Tp, class _A0> +struct __is_constructible1_imp<true, _Tp, _A0> + : public is_convertible<_A0, _Tp> + {}; + +template <class _Tp, class _A0, class _A1> +struct __is_constructible2_imp<true, _Tp, _A0, _A1> + : public false_type + {}; + +// Treat scalars and reference types separately + +template <bool, class _Tp> +struct __is_constructible0_void_check + : public __is_constructible0_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp> + {}; + +template <bool, class _Tp, class _A0> +struct __is_constructible1_void_check + : public __is_constructible1_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _A0> + {}; + +template <bool, class _Tp, class _A0, class _A1> +struct __is_constructible2_void_check + : public __is_constructible2_imp<is_scalar<_Tp>::value || is_reference<_Tp>::value, + _Tp, _A0, _A1> + {}; + +// If any of T or Args is void, is_constructible should be false + +template <class _Tp> +struct __is_constructible0_void_check<true, _Tp> + : public false_type + {}; + +template <class _Tp, class _A0> +struct __is_constructible1_void_check<true, _Tp, _A0> + : public false_type + {}; + +template <class _Tp, class _A0, class _A1> +struct __is_constructible2_void_check<true, _Tp, _A0, _A1> + : public false_type + {}; + +// is_constructible entry point + +namespace __is_construct +{ + +struct __nat {}; + +} + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_constructible + : public __is_constructible2_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value + || is_void<_A0>::value + || is_void<_A1>::value, + _Tp, _A0, _A1> + {}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_constructible<_Tp, __is_construct::__nat, __is_construct::__nat> + : public __is_constructible0_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value, + _Tp> + {}; + +template <class _Tp, class _A0> +struct _LIBCPP_VISIBLE is_constructible<_Tp, _A0, __is_construct::__nat> + : public __is_constructible1_void_check<is_void<_Tp>::value + || is_abstract<_Tp>::value + || is_function<_Tp>::value + || is_void<_A0>::value, + _Tp, _A0> + {}; + +// Array types are default constructible if their element type +// is default constructible + +template <class _Ap, size_t _Np> +struct __is_constructible0_imp<false, _Ap[_Np]> + : public is_constructible<typename remove_all_extents<_Ap>::type> + {}; + +template <class _Ap, size_t _Np, class _A0> +struct __is_constructible1_imp<false, _Ap[_Np], _A0> + : public false_type + {}; + +template <class _Ap, size_t _Np, class _A0, class _A1> +struct __is_constructible2_imp<false, _Ap[_Np], _A0, _A1> + : public false_type + {}; + +// Incomplete array types are not constructible + +template <class _Ap> +struct __is_constructible0_imp<false, _Ap[]> + : public false_type + {}; + +template <class _Ap, class _A0> +struct __is_constructible1_imp<false, _Ap[], _A0> + : public false_type + {}; + +template <class _Ap, class _A0, class _A1> +struct __is_constructible2_imp<false, _Ap[], _A0, _A1> + : public false_type + {}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_default_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_default_constructible + : public is_constructible<_Tp> + {}; + +// is_copy_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_copy_constructible + : public is_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_move_constructible + +template <class _Tp> +struct _LIBCPP_VISIBLE is_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_copy_constructible<_Tp> +#endif + {}; + +// is_trivially_constructible + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +#if __has_feature(is_trivially_constructible) + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_trivially_constructible + : integral_constant<bool, __is_trivially_constructible(_Tp, _Args...)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_trivially_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp> +#if __has_feature(has_trivial_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_trivial_constructor(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&&> +#else +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp> +#endif + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +#endif // !__has_feature(is_trivially_constructible) + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_trivially_constructible + : false_type +{ +}; + +#if __has_feature(is_trivially_constructible) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, const _Tp&)> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, + __is_construct::__nat> + : integral_constant<bool, __is_trivially_constructible(_Tp, _Tp&)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat, + __is_construct::__nat> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp, + __is_construct::__nat> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&, + __is_construct::__nat> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&, + __is_construct::__nat> + : integral_constant<bool, is_scalar<_Tp>::value> +{ +}; + +#endif // !__has_feature(is_trivially_constructible) + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_trivially_default_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_default_constructible + : public is_trivially_constructible<_Tp> + {}; + +// is_trivially_copy_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_constructible + : public is_trivially_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_trivially_move_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_trivially_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_trivially_copy_constructible<_Tp> +#endif + {}; + +// is_trivially_assignable + +#if __has_feature(is_trivially_constructible) + +template <class _Tp, class _Arg> +struct is_trivially_assignable + : integral_constant<bool, __is_trivially_assignable(_Tp, _Arg)> +{ +}; + +#else // !__has_feature(is_trivially_constructible) + +template <class _Tp, class _Arg> +struct is_trivially_assignable + : public false_type {}; + +template <class _Tp> +struct is_trivially_assignable<_Tp&, _Tp> + : integral_constant<bool, is_scalar<_Tp>::value> {}; + +template <class _Tp> +struct is_trivially_assignable<_Tp&, _Tp&> + : integral_constant<bool, is_scalar<_Tp>::value> {}; + +template <class _Tp> +struct is_trivially_assignable<_Tp&, const _Tp&> + : integral_constant<bool, is_scalar<_Tp>::value> {}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct is_trivially_assignable<_Tp&, _Tp&&> + : integral_constant<bool, is_scalar<_Tp>::value> {}; + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // !__has_feature(is_trivially_constructible) + +// is_trivially_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copy_assignable + : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_trivially_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_move_assignable + : public is_trivially_assignable<typename add_lvalue_reference<_Tp>::type, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + typename add_rvalue_reference<_Tp>::type> +#else + typename add_lvalue_reference<_Tp>::type> +#endif + {}; + +// is_trivially_destructible + +#if __has_feature(has_trivial_destructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible + : public integral_constant<bool, __has_trivial_destructor(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct __libcpp_trivial_destructor + : public integral_constant<bool, is_scalar<_Tp>::value || + is_reference<_Tp>::value> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_destructible + : public __libcpp_trivial_destructor<typename remove_all_extents<_Tp>::type> {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// is_nothrow_constructible + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp, class... _Args> struct __is_nothrow_constructible; + +template <class _Tp, class... _Args> +struct __is_nothrow_constructible<true, _Tp, _Args...> + : public integral_constant<bool, noexcept(_Tp(declval<_Args>()...))> +{ +}; + +template <class _Tp, class... _Args> +struct __is_nothrow_constructible<false, _Tp, _Args...> + : public false_type +{ +}; + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : __is_nothrow_constructible<is_constructible<_Tp, _Args...>::value, _Tp, _Args...> +{ +}; + +template <class _Tp, size_t _Ns> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp[_Ns]> + : __is_nothrow_constructible<is_constructible<_Tp>::value, _Tp> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp, class... _Args> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp> +#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_constructor(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&&> +#else +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp> +#endif +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +#endif // __has_feature(cxx_noexcept) + +#else // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _A0 = __is_construct::__nat, + class _A1 = __is_construct::__nat> +struct _LIBCPP_VISIBLE is_nothrow_constructible + : false_type +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, __is_construct::__nat, + __is_construct::__nat> +#if __has_feature(has_nothrow_constructor) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_constructor(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, const _Tp&, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_constructible<_Tp, _Tp&, + __is_construct::__nat> +#if __has_feature(has_nothrow_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_copy(_Tp)> +#else + : integral_constant<bool, is_scalar<_Tp>::value> +#endif +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +// is_nothrow_default_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_default_constructible + : public is_nothrow_constructible<_Tp> + {}; + +// is_nothrow_copy_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_constructible + : public is_nothrow_constructible<_Tp, const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_nothrow_move_constructible + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_constructible +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + : public is_nothrow_constructible<_Tp, typename add_rvalue_reference<_Tp>::type> +#else + : public is_nothrow_copy_constructible<_Tp> +#endif + {}; + +// is_nothrow_assignable + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp, class _Arg> struct __is_nothrow_assignable; + +template <class _Tp, class _Arg> +struct __is_nothrow_assignable<false, _Tp, _Arg> + : public false_type +{ +}; + +template <class _Tp, class _Arg> +struct __is_nothrow_assignable<true, _Tp, _Arg> + : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>()) > +{ +}; + +template <class _Tp, class _Arg> +struct _LIBCPP_VISIBLE is_nothrow_assignable + : public __is_nothrow_assignable<is_assignable<_Tp, _Arg>::value, _Tp, _Arg> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp, class _Arg> +struct _LIBCPP_VISIBLE is_nothrow_assignable + : public false_type {}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, _Tp&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_assignable<_Tp&, const _Tp&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct is_nothrow_assignable<_Tp&, _Tp&&> +#if __has_feature(has_nothrow_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + : integral_constant<bool, __has_nothrow_assign(_Tp)> {}; +#else + : integral_constant<bool, is_scalar<_Tp>::value> {}; +#endif + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // __has_feature(cxx_noexcept) + +// is_nothrow_copy_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_copy_assignable + : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, + const typename add_lvalue_reference<_Tp>::type> + {}; + +// is_nothrow_move_assignable + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_move_assignable + : public is_nothrow_assignable<typename add_lvalue_reference<_Tp>::type, +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + typename add_rvalue_reference<_Tp>::type> +#else + typename add_lvalue_reference<_Tp>::type> +#endif + {}; + +// is_nothrow_destructible + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp> struct __is_nothrow_destructible; + +template <class _Tp> +struct __is_nothrow_destructible<false, _Tp> + : public false_type +{ +}; + +template <class _Tp> +struct __is_nothrow_destructible<true, _Tp> + : public integral_constant<bool, noexcept(_VSTD::declval<_Tp>().~_Tp()) > +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible + : public __is_nothrow_destructible<is_destructible<_Tp>::value, _Tp> +{ +}; + +template <class _Tp, size_t _Ns> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp[_Ns]> + : public is_nothrow_destructible<_Tp> +{ +}; + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&> + : public true_type +{ +}; + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +struct _LIBCPP_VISIBLE is_nothrow_destructible<_Tp&&> + : public true_type +{ +}; + +#endif + +#else + +template <class _Tp> struct __libcpp_nothrow_destructor + : public integral_constant<bool, is_scalar<_Tp>::value || + is_reference<_Tp>::value> {}; + +template <class _Tp> struct _LIBCPP_VISIBLE is_nothrow_destructible + : public __libcpp_nothrow_destructor<typename remove_all_extents<_Tp>::type> {}; + +#endif + +// is_pod + +#if __has_feature(is_pod) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) + +template <class _Tp> struct _LIBCPP_VISIBLE is_pod + : public integral_constant<bool, __is_pod(_Tp)> {}; + +#else // _LIBCPP_HAS_TYPE_TRAITS + +template <class _Tp> struct _LIBCPP_VISIBLE is_pod + : public integral_constant<bool, is_trivially_default_constructible<_Tp>::value && + is_trivially_copy_constructible<_Tp>::value && + is_trivially_copy_assignable<_Tp>::value && + is_trivially_destructible<_Tp>::value> {}; + +#endif // _LIBCPP_HAS_TYPE_TRAITS + +// is_literal_type; + +template <class _Tp> struct _LIBCPP_VISIBLE is_literal_type +#if __has_feature(is_literal) + : public integral_constant<bool, __is_literal(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value || + is_reference<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_standard_layout; + +template <class _Tp> struct _LIBCPP_VISIBLE is_standard_layout +#if __has_feature(is_standard_layout) + : public integral_constant<bool, __is_standard_layout(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_trivially_copyable; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivially_copyable +#if __has_feature(is_trivially_copyable) + : public integral_constant<bool, __is_trivially_copyable(_Tp)> +#else + : integral_constant<bool, is_scalar<typename remove_all_extents<_Tp>::type>::value> +#endif + {}; + +// is_trivial; + +template <class _Tp> struct _LIBCPP_VISIBLE is_trivial +#if __has_feature(is_trivial) + : public integral_constant<bool, __is_trivial(_Tp)> +#else + : integral_constant<bool, is_trivially_copyable<_Tp>::value && + is_trivially_default_constructible<_Tp>::value> +#endif + {}; + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +// Check for complete types + +template <class ..._Tp> struct __check_complete; + +template <> +struct __check_complete<> +{ +}; + +template <class _Hp, class _T0, class ..._Tp> +struct __check_complete<_Hp, _T0, _Tp...> + : private __check_complete<_Hp>, + private __check_complete<_T0, _Tp...> +{ +}; + +template <class _Hp> +struct __check_complete<_Hp, _Hp> + : private __check_complete<_Hp> +{ +}; + +template <class _Tp> +struct __check_complete<_Tp> +{ + static_assert(sizeof(_Tp) > 0, "Type must be complete."); +}; + +template <class _Tp> +struct __check_complete<_Tp&> + : private __check_complete<_Tp> +{ +}; + +template <class _Tp> +struct __check_complete<_Tp&&> + : private __check_complete<_Tp> +{ +}; + +template <class _Rp, class ..._Param> +struct __check_complete<_Rp (*)(_Param...)> + : private __check_complete<_Param...> +{ +}; + +template <class _Rp, class ..._Param> +struct __check_complete<_Rp (_Param...)> + : private __check_complete<_Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...)> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile> + : private __check_complete<_Class, _Param...> +{ +}; + +#if __has_feature(cxx_reference_qualified_functions) + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) &> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) &&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +template <class _Rp, class _Class, class ..._Param> +struct __check_complete<_Rp (_Class::*)(_Param...) const volatile&&> + : private __check_complete<_Class, _Param...> +{ +}; + +#endif + +template <class _Rp, class _Class> +struct __check_complete<_Rp _Class::*> + : private __check_complete<_Class> +{ +}; + +// __invoke forward declarations + +// fall back - none of the bullets + +template <class ..._Args> +auto +__invoke(__any, _Args&& ...__args) + -> __nat; + +// bullets 1 and 2 + +template <class _Fp, class _A0, class ..._Args> +auto +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...)); + +template <class _Fp, class _A0, class ..._Args> +auto +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...)); + +// bullets 3 and 4 + +template <class _Fp, class _A0> +auto +__invoke(_Fp&& __f, _A0&& __a0) + -> decltype(_VSTD::forward<_A0>(__a0).*__f); + +template <class _Fp, class _A0> +auto +__invoke(_Fp&& __f, _A0&& __a0) + -> decltype((*_VSTD::forward<_A0>(__a0)).*__f); + +// bullet 5 + +template <class _Fp, class ..._Args> +auto +__invoke(_Fp&& __f, _Args&& ...__args) + -> decltype(_VSTD::forward<_Fp>(__f)(_VSTD::forward<_Args>(__args)...)); + +// __invokable + +template <class _Fp, class ..._Args> +struct __invokable_imp + : private __check_complete<_Fp, _Args...> +{ + typedef decltype( + __invoke(_VSTD::declval<_Fp>(), _VSTD::declval<_Args>()...) + ) type; + static const bool value = !is_same<type, __nat>::value; +}; + +template <class _Fp, class ..._Args> +struct __invokable + : public integral_constant<bool, + __invokable_imp<_Fp, _Args...>::value> +{ +}; + +// __invoke_of + +template <bool _Invokable, class _Fp, class ..._Args> +struct __invoke_of_imp // false +{ +}; + +template <class _Fp, class ..._Args> +struct __invoke_of_imp<true, _Fp, _Args...> +{ + typedef typename __invokable_imp<_Fp, _Args...>::type type; +}; + +template <class _Fp, class ..._Args> +struct __invoke_of + : public __invoke_of_imp<__invokable<_Fp, _Args...>::value, _Fp, _Args...> +{ +}; + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE +typename enable_if +< + is_move_constructible<_Tp>::value && + is_move_assignable<_Tp>::value +>::type +#else +void +#endif +swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value && + is_nothrow_move_assignable<_Tp>::value) +{ + _Tp __t(_VSTD::move(__x)); + __x = _VSTD::move(__y); + __y = _VSTD::move(__t); +} + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +void +iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) + // _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b))) + _NOEXCEPT_(_NOEXCEPT_(swap(*_VSTD::declval<_ForwardIterator1>(), + *_VSTD::declval<_ForwardIterator2>()))) +{ + swap(*__a, *__b); +} + +// __swappable + +namespace __detail +{ + +using _VSTD::swap; +__nat swap(__any, __any); + +template <class _Tp> +struct __swappable +{ + typedef decltype(swap(_VSTD::declval<_Tp&>(), _VSTD::declval<_Tp&>())) type; + static const bool value = !is_same<type, __nat>::value; +}; + +} // __detail + +template <class _Tp> +struct __is_swappable + : public integral_constant<bool, __detail::__swappable<_Tp>::value> +{ +}; + +#if __has_feature(cxx_noexcept) + +template <bool, class _Tp> +struct __is_nothrow_swappable_imp + : public integral_constant<bool, noexcept(swap(_VSTD::declval<_Tp&>(), + _VSTD::declval<_Tp&>()))> +{ +}; + +template <class _Tp> +struct __is_nothrow_swappable_imp<false, _Tp> + : public false_type +{ +}; + +template <class _Tp> +struct __is_nothrow_swappable + : public __is_nothrow_swappable_imp<__is_swappable<_Tp>::value, _Tp> +{ +}; + +#else // __has_feature(cxx_noexcept) + +template <class _Tp> +struct __is_nothrow_swappable + : public false_type +{ +}; + +#endif // __has_feature(cxx_noexcept) + +#ifdef _LIBCXX_UNDERLYING_TYPE + +template <class _Tp> +struct underlying_type +{ + typedef _LIBCXX_UNDERLYING_TYPE(_Tp) type; +}; + +#else // _LIBCXX_UNDERLYING_TYPE + +template <class _Tp, bool _Support = false> +struct underlying_type +{ + static_assert(_Support, "The underyling_type trait requires compiler " + "support. Either no such support exists or " + "libc++ does not know how to use it."); +}; + +#endif // _LIBCXX_UNDERLYING_TYPE + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_TYPE_TRAITS diff --git a/contrib/libc++/include/typeindex b/contrib/libc++/include/typeindex new file mode 100644 index 0000000..398b528 --- /dev/null +++ b/contrib/libc++/include/typeindex @@ -0,0 +1,103 @@ +// -*- C++ -*- +//===-------------------------- typeindex ---------------------------------===// +// +// 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_TYPEINDEX +#define _LIBCPP_TYPEINDEX + +/* + + typeindex synopsis + +namespace std +{ + +class type_index +{ +public: + type_index(const type_info& rhs) noexcept; + + bool operator==(const type_index& rhs) const noexcept; + bool operator!=(const type_index& rhs) const noexcept; + bool operator< (const type_index& rhs) const noexcept; + bool operator<=(const type_index& rhs) const noexcept; + bool operator> (const type_index& rhs) const noexcept; + bool operator>=(const type_index& rhs) const noexcept; + + size_t hash_code() const noexcept; + const char* name() const noexcept; +}; + +template <> +struct hash<type_index> + : public unary_function<type_index, size_t> +{ + size_t operator()(type_index index) const noexcept; +}; + +} // std + +*/ + +#include <__config> +#include <typeinfo> +#include <__functional_base> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_VISIBLE type_index +{ + const type_info* __t_; +public: + _LIBCPP_INLINE_VISIBILITY + type_index(const type_info& __y) _NOEXCEPT : __t_(&__y) {} + + _LIBCPP_INLINE_VISIBILITY + bool operator==(const type_index& __y) const _NOEXCEPT + {return *__t_ == *__y.__t_;} + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const type_index& __y) const _NOEXCEPT + {return *__t_ != *__y.__t_;} + _LIBCPP_INLINE_VISIBILITY + bool operator< (const type_index& __y) const _NOEXCEPT + {return __t_->before(*__y.__t_);} + _LIBCPP_INLINE_VISIBILITY + bool operator<=(const type_index& __y) const _NOEXCEPT + {return !__y.__t_->before(*__t_);} + _LIBCPP_INLINE_VISIBILITY + bool operator> (const type_index& __y) const _NOEXCEPT + {return __y.__t_->before(*__t_);} + _LIBCPP_INLINE_VISIBILITY + bool operator>=(const type_index& __y) const _NOEXCEPT + {return !__t_->before(*__y.__t_);} + + _LIBCPP_INLINE_VISIBILITY + size_t hash_code() const _NOEXCEPT {return __t_->hash_code();} + _LIBCPP_INLINE_VISIBILITY + const char* name() const _NOEXCEPT {return __t_->name();} +}; + +template <class _Tp> struct _LIBCPP_VISIBLE hash; + +template <> +struct _LIBCPP_VISIBLE hash<type_index> + : public unary_function<type_index, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(type_index __index) const _NOEXCEPT + {return __index.hash_code();} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_TYPEINDEX diff --git a/contrib/libc++/include/typeinfo b/contrib/libc++/include/typeinfo new file mode 100644 index 0000000..6ffee0f --- /dev/null +++ b/contrib/libc++/include/typeinfo @@ -0,0 +1,124 @@ +// -*- C++ -*- +//===-------------------------- typeinfo ----------------------------------===// +// +// 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_TYPEINFO +#define __LIBCPP_TYPEINFO + +/* + + typeinfo synopsis + +namespace std { + +class type_info +{ +public: + virtual ~type_info(); + + bool operator==(const type_info& rhs) const noexcept; + bool operator!=(const type_info& rhs) const noexcept; + + bool before(const type_info& rhs) const noexcept; + size_t hash_code() const noexcept; + const char* name() const noexcept; + + type_info(const type_info& rhs) = delete; + type_info& operator=(const type_info& rhs) = delete; +}; + +class bad_cast + : public exception +{ +public: + bad_cast() noexcept; + bad_cast(const bad_cast&) noexcept; + bad_cast& operator=(const bad_cast&) noexcept; + virtual const char* what() const noexcept; +}; + +class bad_typeid + : public exception +{ +public: + bad_typeid() noexcept; + bad_typeid(const bad_typeid&) noexcept; + bad_typeid& operator=(const bad_typeid&) noexcept; + virtual const char* what() const noexcept; +}; + +} // std + +*/ + +#include <__config> +#include <exception> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +namespace std // purposefully not using versioning namespace +{ + +class _LIBCPP_EXCEPTION_ABI type_info +{ + type_info& operator=(const type_info&); + type_info(const type_info&); +protected: + const char* __type_name; + + _LIBCPP_INLINE_VISIBILITY + explicit type_info(const char* __n) + : __type_name(__n) {} + +public: + virtual ~type_info(); + + _LIBCPP_INLINE_VISIBILITY + const char* name() const _NOEXCEPT {return __type_name;} + + _LIBCPP_INLINE_VISIBILITY + bool before(const type_info& __arg) const _NOEXCEPT + {return __type_name < __arg.__type_name;} + _LIBCPP_INLINE_VISIBILITY + size_t hash_code() const _NOEXCEPT + {return *reinterpret_cast<const size_t*>(&__type_name);} + + _LIBCPP_INLINE_VISIBILITY + bool operator==(const type_info& __arg) const _NOEXCEPT + {return __type_name == __arg.__type_name;} + _LIBCPP_INLINE_VISIBILITY + bool operator!=(const type_info& __arg) const _NOEXCEPT + {return !operator==(__arg);} + +}; + +class _LIBCPP_EXCEPTION_ABI bad_cast + : public exception +{ +public: + bad_cast() _NOEXCEPT; + virtual ~bad_cast() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXCEPTION_ABI bad_typeid + : public exception +{ +public: + bad_typeid() _NOEXCEPT; + virtual ~bad_typeid() _NOEXCEPT; + virtual const char* what() const _NOEXCEPT; +}; + +} // std + +#endif // __LIBCPP_TYPEINFO diff --git a/contrib/libc++/include/unordered_map b/contrib/libc++/include/unordered_map new file mode 100644 index 0000000..15243f6 --- /dev/null +++ b/contrib/libc++/include/unordered_map @@ -0,0 +1,1847 @@ +// -*- C++ -*- +//===-------------------------- unordered_map -----------------------------===// +// +// 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_UNORDERED_MAP +#define _LIBCPP_UNORDERED_MAP + +/* + + unordered_map synopsis + +#include <initializer_list> + +namespace std +{ + +template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, + class Alloc = allocator<pair<const Key, T>>> +class unordered_map +{ +public: + // types + typedef Key key_type; + typedef T mapped_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + typedef /unspecified/ local_iterator; + typedef /unspecified/ const_local_iterator; + + unordered_map() + noexcept( + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value && + is_nothrow_default_constructible<allocator_type>::value); + explicit unordered_map(size_type n, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + unordered_map(InputIterator f, InputIterator l, + size_type n = 0, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + explicit unordered_map(const allocator_type&); + unordered_map(const unordered_map&); + unordered_map(const unordered_map&, const Allocator&); + unordered_map(unordered_map&&) + noexcept( + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value && + is_nothrow_move_constructible<allocator_type>::value); + unordered_map(unordered_map&&, const Allocator&); + unordered_map(initializer_list<value_type>, size_type n = 0, + const hasher& hf = hasher(), const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + ~unordered_map(); + unordered_map& operator=(const unordered_map&); + unordered_map& operator=(unordered_map&&) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); + unordered_map& operator=(initializer_list<value_type>); + + allocator_type get_allocator() const noexcept; + + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + iterator begin() noexcept; + iterator end() noexcept; + const_iterator begin() const noexcept; + const_iterator end() const noexcept; + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + + template <class... Args> + pair<iterator, bool> emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + pair<iterator, bool> insert(const value_type& obj); + template <class P> + pair<iterator, bool> insert(P&& obj); + iterator insert(const_iterator hint, const value_type& obj); + template <class P> + iterator insert(const_iterator hint, P&& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type>); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(unordered_map&) + noexcept( + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value); + + hasher hash_function() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + mapped_type& operator[](const key_type& k); + mapped_type& operator[](key_type&& k); + + mapped_type& at(const key_type& k); + const mapped_type& at(const key_type& k) const; + + size_type bucket_count() const noexcept; + size_type max_bucket_count() const noexcept; + + size_type bucket_size(size_type n) const; + size_type bucket(const key_type& k) const; + + local_iterator begin(size_type n); + local_iterator end(size_type n); + const_local_iterator begin(size_type n) const; + const_local_iterator end(size_type n) const; + const_local_iterator cbegin(size_type n) const; + const_local_iterator cend(size_type n) const; + + float load_factor() const noexcept; + float max_load_factor() const noexcept; + void max_load_factor(float z); + void rehash(size_type n); + void reserve(size_type n); +}; + +template <class Key, class T, class Hash, class Pred, class Alloc> + void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x, + unordered_map<Key, T, Hash, Pred, Alloc>& y) + noexcept(noexcept(x.swap(y))); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator==(const unordered_map<Key, T, Hash, Pred, Alloc>& x, + const unordered_map<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator!=(const unordered_map<Key, T, Hash, Pred, Alloc>& x, + const unordered_map<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, + class Alloc = allocator<pair<const Key, T>>> +class unordered_multimap +{ +public: + // types + typedef Key key_type; + typedef T mapped_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + typedef /unspecified/ local_iterator; + typedef /unspecified/ const_local_iterator; + + unordered_multimap() + noexcept( + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value && + is_nothrow_default_constructible<allocator_type>::value); + explicit unordered_multimap(size_type n, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + unordered_multimap(InputIterator f, InputIterator l, + size_type n = 0, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + explicit unordered_multimap(const allocator_type&); + unordered_multimap(const unordered_multimap&); + unordered_multimap(const unordered_multimap&, const Allocator&); + unordered_multimap(unordered_multimap&&) + noexcept( + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value && + is_nothrow_move_constructible<allocator_type>::value); + unordered_multimap(unordered_multimap&&, const Allocator&); + unordered_multimap(initializer_list<value_type>, size_type n = 0, + const hasher& hf = hasher(), const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + ~unordered_multimap(); + unordered_multimap& operator=(const unordered_multimap&); + unordered_multimap& operator=(unordered_multimap&&) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); + unordered_multimap& operator=(initializer_list<value_type>); + + allocator_type get_allocator() const noexcept; + + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + iterator begin() noexcept; + iterator end() noexcept; + const_iterator begin() const noexcept; + const_iterator end() const noexcept; + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + + template <class... Args> + iterator emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + iterator insert(const value_type& obj); + template <class P> + iterator insert(P&& obj); + iterator insert(const_iterator hint, const value_type& obj); + template <class P> + iterator insert(const_iterator hint, P&& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type>); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(unordered_multimap&) + noexcept( + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value); + + hasher hash_function() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const noexcept; + size_type max_bucket_count() const noexcept; + + size_type bucket_size(size_type n) const; + size_type bucket(const key_type& k) const; + + local_iterator begin(size_type n); + local_iterator end(size_type n); + const_local_iterator begin(size_type n) const; + const_local_iterator end(size_type n) const; + const_local_iterator cbegin(size_type n) const; + const_local_iterator cend(size_type n) const; + + float load_factor() const noexcept; + float max_load_factor() const noexcept; + void max_load_factor(float z); + void rehash(size_type n); + void reserve(size_type n); +}; + +template <class Key, class T, class Hash, class Pred, class Alloc> + void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x, + unordered_multimap<Key, T, Hash, Pred, Alloc>& y) + noexcept(noexcept(x.swap(y))); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator==(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, + const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); + +template <class Key, class T, class Hash, class Pred, class Alloc> + bool + operator!=(const unordered_multimap<Key, T, Hash, Pred, Alloc>& x, + const unordered_multimap<Key, T, Hash, Pred, Alloc>& y); + +} // std + +*/ + +#include <__config> +#include <__hash_table> +#include <functional> +#include <stdexcept> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value +#if __has_feature(is_final) + && !__is_final(_Hash) +#endif + > +class __unordered_map_hasher + : private _Hash +{ + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp; +public: + _LIBCPP_INLINE_VISIBILITY + __unordered_map_hasher() + _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) + : _Hash() {} + _LIBCPP_INLINE_VISIBILITY + __unordered_map_hasher(const _Hash& __h) + _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) + : _Hash(__h) {} + _LIBCPP_INLINE_VISIBILITY + const _Hash& hash_function() const _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Pp& __x) const + {return static_cast<const _Hash&>(*this)(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Cp& __x) const + {return static_cast<const _Hash&>(*this)(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Key& __x) const + {return static_cast<const _Hash&>(*this)(__x);} +}; + +template <class _Key, class _Tp, class _Hash> +class __unordered_map_hasher<_Key, _Tp, _Hash, false> +{ + _Hash __hash_; + + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp; +public: + _LIBCPP_INLINE_VISIBILITY + __unordered_map_hasher() + _NOEXCEPT_(is_nothrow_default_constructible<_Hash>::value) + : __hash_() {} + _LIBCPP_INLINE_VISIBILITY + __unordered_map_hasher(const _Hash& __h) + _NOEXCEPT_(is_nothrow_copy_constructible<_Hash>::value) + : __hash_(__h) {} + _LIBCPP_INLINE_VISIBILITY + const _Hash& hash_function() const _NOEXCEPT {return __hash_;} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Pp& __x) const + {return __hash_(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Cp& __x) const + {return __hash_(__x.first);} + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const _Key& __x) const + {return __hash_(__x);} +}; + +template <class _Key, class _Tp, class _Pred, bool = is_empty<_Pred>::value +#if __has_feature(is_final) + && !__is_final(_Pred) +#endif + > +class __unordered_map_equal + : private _Pred +{ + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp; +public: + _LIBCPP_INLINE_VISIBILITY + __unordered_map_equal() + _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) + : _Pred() {} + _LIBCPP_INLINE_VISIBILITY + __unordered_map_equal(const _Pred& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) + : _Pred(__p) {} + _LIBCPP_INLINE_VISIBILITY + const _Pred& key_eq() const _NOEXCEPT {return *this;} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Pp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Key& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Pp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Key& __y) const + {return static_cast<const _Pred&>(*this)(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Cp& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const + {return static_cast<const _Pred&>(*this)(__x, __y);} +}; + +template <class _Key, class _Tp, class _Pred> +class __unordered_map_equal<_Key, _Tp, _Pred, false> +{ + _Pred __pred_; + + typedef pair<typename remove_const<_Key>::type, _Tp> _Pp; + typedef pair<const _Key, _Tp> _Cp; +public: + _LIBCPP_INLINE_VISIBILITY + __unordered_map_equal() + _NOEXCEPT_(is_nothrow_default_constructible<_Pred>::value) + : __pred_() {} + _LIBCPP_INLINE_VISIBILITY + __unordered_map_equal(const _Pred& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_Pred>::value) + : __pred_(__p) {} + _LIBCPP_INLINE_VISIBILITY + const _Pred& key_eq() const _NOEXCEPT {return __pred_;} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Pp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Cp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Pp& __x, const _Key& __y) const + {return __pred_(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Pp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Cp& __y) const + {return __pred_(__x.first, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Cp& __x, const _Key& __y) const + {return __pred_(__x.first, __y);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Pp& __y) const + {return __pred_(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Cp& __y) const + {return __pred_(__x, __y.first);} + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Key& __x, const _Key& __y) const + {return __pred_(__x, __y);} +}; + +template <class _Alloc> +class __hash_map_node_destructor +{ + typedef _Alloc allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::value_type::value_type value_type; +public: + typedef typename __alloc_traits::pointer pointer; +private: + typedef typename value_type::first_type first_type; + typedef typename value_type::second_type second_type; + + allocator_type& __na_; + + __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); + +public: + bool __first_constructed; + bool __second_constructed; + + _LIBCPP_INLINE_VISIBILITY + explicit __hash_map_node_destructor(allocator_type& __na) _NOEXCEPT + : __na_(__na), + __first_constructed(false), + __second_constructed(false) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) + _NOEXCEPT + : __na_(__x.__na_), + __first_constructed(__x.__value_constructed), + __second_constructed(__x.__value_constructed) + { + __x.__value_constructed = false; + } +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) + : __na_(__x.__na_), + __first_constructed(__x.__value_constructed), + __second_constructed(__x.__value_constructed) + { + const_cast<bool&>(__x.__value_constructed) = false; + } +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + if (__second_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second)); + if (__first_constructed) + __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } +}; + +template <class _HashIterator> +class _LIBCPP_VISIBLE __hash_map_iterator +{ + _HashIterator __i_; + + typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; + typedef const typename _HashIterator::value_type::first_type key_type; + typedef typename _HashIterator::value_type::second_type mapped_type; +public: + typedef forward_iterator_tag iterator_category; + typedef pair<key_type, mapped_type> value_type; + typedef typename _HashIterator::difference_type difference_type; + typedef value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<value_type> +#else + rebind<value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __hash_map_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __hash_map_iterator operator++(int) + { + __hash_map_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap; + template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_map_const_iterator; +}; + +template <class _HashIterator> +class _LIBCPP_VISIBLE __hash_map_const_iterator +{ + _HashIterator __i_; + + typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; + typedef const typename _HashIterator::value_type::first_type key_type; + typedef typename _HashIterator::value_type::second_type mapped_type; +public: + typedef forward_iterator_tag iterator_category; + typedef pair<key_type, mapped_type> value_type; + typedef typename _HashIterator::difference_type difference_type; + typedef const value_type& reference; + typedef typename __pointer_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind<const value_type> +#else + rebind<const value_type>::other +#endif + pointer; + + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator() _NOEXCEPT {} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator(_HashIterator __i) _NOEXCEPT : __i_(__i) {} + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator( + __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) + _NOEXCEPT + : __i_(__i.__i_) {} + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const {return *operator->();} + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const {return (pointer)__i_.operator->();} + + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator& operator++() {++__i_; return *this;} + _LIBCPP_INLINE_VISIBILITY + __hash_map_const_iterator operator++(int) + { + __hash_map_const_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) + {return __x.__i_ == __y.__i_;} + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) + {return __x.__i_ != __y.__i_;} + + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_map; + template <class, class, class, class, class> friend class _LIBCPP_VISIBLE unordered_multimap; + template <class> friend class _LIBCPP_VISIBLE __hash_const_iterator; + template <class> friend class _LIBCPP_VISIBLE __hash_const_local_iterator; +}; + +template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, + class _Alloc = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE unordered_map +{ +public: + // types + typedef _Key key_type; + typedef _Tp mapped_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher; + typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + + typedef __hash_table<__value_type, __hasher, + __key_equal, __allocator_type> __table; + + __table __table_; + + typedef typename __table::__node_pointer __node_pointer; + typedef typename __table::__node_const_pointer __node_const_pointer; + typedef typename __table::__node_traits __node_traits; + typedef typename __table::__node_allocator __node_allocator; + typedef typename __table::__node __node; + typedef __hash_map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + typedef allocator_traits<allocator_type> __alloc_traits; +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + + typedef __hash_map_iterator<typename __table::iterator> iterator; + typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; + typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; + typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; + + _LIBCPP_INLINE_VISIBILITY + unordered_map() + _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) + {} // = default; + explicit unordered_map(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_map(size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + unordered_map(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + unordered_map(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + unordered_map(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + explicit unordered_map(const allocator_type& __a); + unordered_map(const unordered_map& __u); + unordered_map(const unordered_map& __u, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_map(unordered_map&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); + unordered_map(unordered_map&& __u, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_map(initializer_list<value_type> __il); + unordered_map(initializer_list<value_type> __il, size_type __n, + const hasher& __hf = hasher(), const key_equal& __eql = key_equal()); + unordered_map(initializer_list<value_type> __il, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + // ~unordered_map() = default; + _LIBCPP_INLINE_VISIBILITY + unordered_map& operator=(const unordered_map& __u) + { + __table_ = __u.__table_; + return *this; + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_map& operator=(unordered_map&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); +#endif +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_map& operator=(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return __table_.end();} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> emplace() + {return __table_.__emplace_unique();} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> emplace(_A0&& __a0) + {return __table_.__emplace_unique(_VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + pair<iterator, bool> emplace(_A0&& __a0, _Args&&... __args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator) + {return __table_.__emplace_unique().first;} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator, _A0&& __a0) + {return __table_.__emplace_unique(_VSTD::forward<_A0>(__a0)).first;} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator, _A0&& __a0, _Args&&... __args) + {return emplace(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...).first;} +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(const value_type& __x) + {return __table_.__insert_unique(__x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(_Pp&& __x) + {return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) + {return insert(__x).first;} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, _Pp&& __x) + {return insert(_VSTD::forward<_Pp>(__x)).first;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __first, const_iterator __last) + {return __table_.erase(__first.__i_, __last.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(unordered_map& __u) + _NOEXCEPT_(__is_nothrow_swappable<__table>::value) + {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_function() const + {return __table_.hash_function().hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const + {return __table_.key_eq().key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_unique(__k);} + + mapped_type& operator[](const key_type& __k); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + mapped_type& operator[](key_type&& __k); +#endif + + mapped_type& at(const key_type& __k); + const mapped_type& at(const key_type& __k) const; + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_size(size_type __n) const + {return __table_.bucket_size(__n);} + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} + + _LIBCPP_INLINE_VISIBILITY + local_iterator begin(size_type __n) {return __table_.begin(__n);} + _LIBCPP_INLINE_VISIBILITY + local_iterator end(size_type __n) {return __table_.end(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator end(size_type __n) const {return __table_.cend(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} + + _LIBCPP_INLINE_VISIBILITY + float load_factor() const _NOEXCEPT {return __table_.load_factor();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} + _LIBCPP_INLINE_VISIBILITY + void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} + _LIBCPP_INLINE_VISIBILITY + void rehash(size_type __n) {__table_.rehash(__n);} + _LIBCPP_INLINE_VISIBILITY + void reserve(size_type __n) {__table_.reserve(__n);} + +private: +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0); +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + __node_holder __construct_node(const key_type& __k); +#endif +}; + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + const allocator_type& __a) + : __table_(__a) +{ +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + _InputIterator __first, _InputIterator __last) +{ + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + const unordered_map& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + const unordered_map& __u, const allocator_type& __a) + : __table_(__u.__table_, __a) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + unordered_map&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) + : __table_(_VSTD::move(__u.__table_)) +{ +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + unordered_map&& __u, const allocator_type& __a) + : __table_(_VSTD::move(__u.__table_), __a) +{ + if (__a != __u.get_allocator()) + { + iterator __i = __u.begin(); + while (__u.size() != 0) + __table_.__insert_unique( + _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_) + ); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + initializer_list<value_type> __il) +{ + insert(__il.begin(), __il.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_map&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) +{ + __table_ = _VSTD::move(__u.__table_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( + initializer_list<value_type> __il) +{ + __table_.__assign_unique(__il.begin(), __il.end()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, class... _Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0, + _Args&&... __args) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), + _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second), + _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__second_constructed = true; + return __h; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, + class // = typename enable_if<is_constructible<value_type, _A0>::value>::type + > +typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), + _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __h.get_deleter().__second_constructed = true; + return __h; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, class... _Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +pair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_A0&& __a0, _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); + __h.get_deleter().__second_constructed = true; + return _VSTD::move(__h); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_unique(*__first); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +_Tp& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) +{ + iterator __i = find(__k); + if (__i != end()) + return __i->second; + __node_holder __h = __construct_node(__k); + pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); + __h.release(); + return __r.first->second; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +_Tp& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) +{ + iterator __i = find(__k); + if (__i != end()) + return __i->second; + __node_holder __h = __construct_node(_VSTD::move(__k)); + pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); + __h.release(); + return __r.first->second; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +_Tp& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) +{ + iterator __i = find(__k); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__i == end()) + throw out_of_range("unordered_map::at: key not found"); +#endif // _LIBCPP_NO_EXCEPTIONS + return __i->second; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +const _Tp& +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::at(const key_type& __k) const +{ + const_iterator __i = find(__k); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__i == end()) + throw out_of_range("unordered_map::at: key not found"); +#endif // _LIBCPP_NO_EXCEPTIONS + return __i->second; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +bool +operator==(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); + __i != __ex; ++__i) + { + const_iterator __j = __y.find(__i->first); + if (__j == __ey || !(*__i == *__j)) + return false; + } + return true; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, + class _Alloc = allocator<pair<const _Key, _Tp> > > +class _LIBCPP_VISIBLE unordered_multimap +{ +public: + // types + typedef _Key key_type; + typedef _Tp mapped_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef pair<const key_type, mapped_type> value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef pair<key_type, mapped_type> __value_type; + typedef __unordered_map_hasher<key_type, mapped_type, hasher> __hasher; + typedef __unordered_map_equal<key_type, mapped_type, key_equal> __key_equal; + typedef typename allocator_traits<allocator_type>::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__value_type> +#else + rebind_alloc<__value_type>::other +#endif + __allocator_type; + + typedef __hash_table<__value_type, __hasher, + __key_equal, __allocator_type> __table; + + __table __table_; + + typedef typename __table::__node_traits __node_traits; + typedef typename __table::__node_allocator __node_allocator; + typedef typename __table::__node __node; + typedef __hash_map_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + typedef allocator_traits<allocator_type> __alloc_traits; +public: + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + + typedef __hash_map_iterator<typename __table::iterator> iterator; + typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; + typedef __hash_map_iterator<typename __table::local_iterator> local_iterator; + typedef __hash_map_const_iterator<typename __table::const_local_iterator> const_local_iterator; + + _LIBCPP_INLINE_VISIBILITY + unordered_multimap() + _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) + {} // = default; + explicit unordered_multimap(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_multimap(size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + unordered_multimap(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + unordered_multimap(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + unordered_multimap(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a); + explicit unordered_multimap(const allocator_type& __a); + unordered_multimap(const unordered_multimap& __u); + unordered_multimap(const unordered_multimap& __u, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_multimap(unordered_multimap&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); + unordered_multimap(unordered_multimap&& __u, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_multimap(initializer_list<value_type> __il); + unordered_multimap(initializer_list<value_type> __il, size_type __n, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_multimap(initializer_list<value_type> __il, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + // ~unordered_multimap() = default; + _LIBCPP_INLINE_VISIBILITY + unordered_multimap& operator=(const unordered_multimap& __u) + { + __table_ = __u.__table_; + return *this; + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_multimap& operator=(unordered_multimap&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); +#endif +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_multimap& operator=(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return __table_.end();} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator emplace() + {return __table_.__emplace_multi();} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator emplace(_A0&& __a0) + {return __table_.__emplace_multi(_VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + iterator emplace(_A0&& __a0, _Args&&... __args); + +#endif // _LIBCPP_HAS_NO_VARIADICS + + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p) + {return __table_.__emplace_hint_multi(__p.__i_);} + + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p, _A0&& __a0) + {return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_A0>(__a0));} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + iterator emplace_hint(const_iterator __p, _A0&& __a0, _Args&&... __args); +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(_Pp&& __x) + {return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, const value_type& __x) + {return __table_.__insert_multi(__p.__i_, __x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _Pp, + class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, _Pp&& __x) + {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __first, const_iterator __last) + {return __table_.erase(__first.__i_, __last.__i_);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(unordered_multimap& __u) + _NOEXCEPT_(__is_nothrow_swappable<__table>::value) + {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_function() const + {return __table_.hash_function().hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const + {return __table_.key_eq().key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_multi(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT + {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_size(size_type __n) const + {return __table_.bucket_size(__n);} + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} + + _LIBCPP_INLINE_VISIBILITY + local_iterator begin(size_type __n) {return __table_.begin(__n);} + _LIBCPP_INLINE_VISIBILITY + local_iterator end(size_type __n) {return __table_.end(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator end(size_type __n) const {return __table_.cend(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} + + _LIBCPP_INLINE_VISIBILITY + float load_factor() const _NOEXCEPT {return __table_.load_factor();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} + _LIBCPP_INLINE_VISIBILITY + void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} + _LIBCPP_INLINE_VISIBILITY + void rehash(size_type __n) {__table_.rehash(__n);} + _LIBCPP_INLINE_VISIBILITY + void reserve(size_type __n) {__table_.reserve(__n);} + +private: +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class _A0, class... _Args, + class = typename enable_if<is_constructible<key_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0, _Args&&... __args); + template <class _A0, + class = typename enable_if<is_constructible<value_type, _A0>::value>::type> + __node_holder __construct_node(_A0&& __a0); +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) +}; + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + _InputIterator __first, _InputIterator __last) +{ + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + const allocator_type& __a) + : __table_(__a) +{ +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + const unordered_multimap& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + const unordered_multimap& __u, const allocator_type& __a) + : __table_(__u.__table_, __a) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + unordered_multimap&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) + : __table_(_VSTD::move(__u.__table_)) +{ +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + unordered_multimap&& __u, const allocator_type& __a) + : __table_(_VSTD::move(__u.__table_), __a) +{ + if (__a != __u.get_allocator()) + { + iterator __i = __u.begin(); + while (__u.size() != 0) +{ + __table_.__insert_multi( + _VSTD::move(__u.__table_.remove((__i++).__i_)->__value_) + ); +} + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + initializer_list<value_type> __il) +{ + insert(__il.begin(), __il.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=(unordered_multimap&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) +{ + __table_ = _VSTD::move(__u.__table_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::operator=( + initializer_list<value_type> __il) +{ + __table_.__assign_multi(__il.begin(), __il.end()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, class... _Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node( + _A0&& __a0, _Args&&... __args) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), + _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second), + _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__second_constructed = true; + return __h; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, + class // = typename enable_if<is_constructible<value_type, _A0>::value>::type + > +typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(_A0&& __a0) +{ + __node_allocator& __na = __table_.__node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _VSTD::addressof(__h->__value_), + _VSTD::forward<_A0>(__a0)); + __h.get_deleter().__first_constructed = true; + __h.get_deleter().__second_constructed = true; + return __h; +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, class... _Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_A0&& __a0, _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + iterator __r = __table_.__node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _A0, class... _Args, + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type + > +typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace_hint( + const_iterator __p, _A0&& __a0, _Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_A0>(__a0), + _VSTD::forward<_Args>(__args)...); + iterator __r = __table_.__node_insert_multi(__p.__i_, __h.get()); + __h.release(); + return __r; +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_multi(*__first); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +bool +operator==(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + typedef pair<const_iterator, const_iterator> _EqRng; + for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) + { + _EqRng __xeq = __x.equal_range(__i->first); + _EqRng __yeq = __y.equal_range(__i->first); + if (_VSTD::distance(__xeq.first, __xeq.second) != + _VSTD::distance(__yeq.first, __yeq.second) || + !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) + return false; + __i = __xeq.second; + } + return true; +} + +template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, + const unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_UNORDERED_MAP diff --git a/contrib/libc++/include/unordered_set b/contrib/libc++/include/unordered_set new file mode 100644 index 0000000..279e907 --- /dev/null +++ b/contrib/libc++/include/unordered_set @@ -0,0 +1,1144 @@ +// -*- C++ -*- +//===-------------------------- unordered_set -----------------------------===// +// +// 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_UNORDERED_SET +#define _LIBCPP_UNORDERED_SET + +/* + + unordered_set synopsis + +#include <initializer_list> + +namespace std +{ + +template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, + class Alloc = allocator<Value>> +class unordered_set +{ +public: + // types + typedef Value key_type; + typedef key_type value_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + typedef /unspecified/ local_iterator; + typedef /unspecified/ const_local_iterator; + + unordered_set() + noexcept( + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value && + is_nothrow_default_constructible<allocator_type>::value); + explicit unordered_set(size_type n, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + unordered_set(InputIterator f, InputIterator l, + size_type n = 0, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + explicit unordered_set(const allocator_type&); + unordered_set(const unordered_set&); + unordered_set(const unordered_set&, const Allocator&); + unordered_set(unordered_set&&) + noexcept( + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value && + is_nothrow_move_constructible<allocator_type>::value); + unordered_set(unordered_set&&, const Allocator&); + unordered_set(initializer_list<value_type>, size_type n = 0, + const hasher& hf = hasher(), const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + ~unordered_set(); + unordered_set& operator=(const unordered_set&); + unordered_set& operator=(unordered_set&&) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); + unordered_set& operator=(initializer_list<value_type>); + + allocator_type get_allocator() const noexcept; + + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + iterator begin() noexcept; + iterator end() noexcept; + const_iterator begin() const noexcept; + const_iterator end() const noexcept; + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + + template <class... Args> + pair<iterator, bool> emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + pair<iterator, bool> insert(const value_type& obj); + pair<iterator, bool> insert(value_type&& obj); + iterator insert(const_iterator hint, const value_type& obj); + iterator insert(const_iterator hint, value_type&& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type>); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(unordered_set&) + noexcept( + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value); + + hasher hash_function() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const noexcept; + size_type max_bucket_count() const noexcept; + + size_type bucket_size(size_type n) const; + size_type bucket(const key_type& k) const; + + local_iterator begin(size_type n); + local_iterator end(size_type n); + const_local_iterator begin(size_type n) const; + const_local_iterator end(size_type n) const; + const_local_iterator cbegin(size_type n) const; + const_local_iterator cend(size_type n) const; + + float load_factor() const noexcept; + float max_load_factor() const noexcept; + void max_load_factor(float z); + void rehash(size_type n); + void reserve(size_type n); +}; + +template <class Value, class Hash, class Pred, class Alloc> + void swap(unordered_set<Value, Hash, Pred, Alloc>& x, + unordered_set<Value, Hash, Pred, Alloc>& y) + noexcept(noexcept(x.swap(y))); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator==(const unordered_set<Value, Hash, Pred, Alloc>& x, + const unordered_set<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x, + const unordered_set<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, + class Alloc = allocator<Value>> +class unordered_multiset +{ +public: + // types + typedef Value key_type; + typedef key_type value_type; + typedef Hash hasher; + typedef Pred key_equal; + typedef Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename allocator_traits<allocator_type>::pointer pointer; + typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; + typedef typename allocator_traits<allocator_type>::size_type size_type; + typedef typename allocator_traits<allocator_type>::difference_type difference_type; + + typedef /unspecified/ iterator; + typedef /unspecified/ const_iterator; + typedef /unspecified/ local_iterator; + typedef /unspecified/ const_local_iterator; + + unordered_multiset() + noexcept( + is_nothrow_default_constructible<hasher>::value && + is_nothrow_default_constructible<key_equal>::value && + is_nothrow_default_constructible<allocator_type>::value); + explicit unordered_multiset(size_type n, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + template <class InputIterator> + unordered_multiset(InputIterator f, InputIterator l, + size_type n = 0, const hasher& hf = hasher(), + const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + explicit unordered_multiset(const allocator_type&); + unordered_multiset(const unordered_multiset&); + unordered_multiset(const unordered_multiset&, const Allocator&); + unordered_multiset(unordered_multiset&&) + noexcept( + is_nothrow_move_constructible<hasher>::value && + is_nothrow_move_constructible<key_equal>::value && + is_nothrow_move_constructible<allocator_type>::value); + unordered_multiset(unordered_multiset&&, const Allocator&); + unordered_multiset(initializer_list<value_type>, size_type n = /see below/, + const hasher& hf = hasher(), const key_equal& eql = key_equal(), + const allocator_type& a = allocator_type()); + ~unordered_multiset(); + unordered_multiset& operator=(const unordered_multiset&); + unordered_multiset& operator=(unordered_multiset&&) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value && + is_nothrow_move_assignable<hasher>::value && + is_nothrow_move_assignable<key_equal>::value); + unordered_multiset& operator=(initializer_list<value_type>); + + allocator_type get_allocator() const noexcept; + + bool empty() const noexcept; + size_type size() const noexcept; + size_type max_size() const noexcept; + + iterator begin() noexcept; + iterator end() noexcept; + const_iterator begin() const noexcept; + const_iterator end() const noexcept; + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + + template <class... Args> + iterator emplace(Args&&... args); + template <class... Args> + iterator emplace_hint(const_iterator position, Args&&... args); + iterator insert(const value_type& obj); + iterator insert(value_type&& obj); + iterator insert(const_iterator hint, const value_type& obj); + iterator insert(const_iterator hint, value_type&& obj); + template <class InputIterator> + void insert(InputIterator first, InputIterator last); + void insert(initializer_list<value_type>); + + iterator erase(const_iterator position); + size_type erase(const key_type& k); + iterator erase(const_iterator first, const_iterator last); + void clear() noexcept; + + void swap(unordered_multiset&) + noexcept( + (!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) && + __is_nothrow_swappable<hasher>::value && + __is_nothrow_swappable<key_equal>::value); + + hasher hash_function() const; + key_equal key_eq() const; + + iterator find(const key_type& k); + const_iterator find(const key_type& k) const; + size_type count(const key_type& k) const; + pair<iterator, iterator> equal_range(const key_type& k); + pair<const_iterator, const_iterator> equal_range(const key_type& k) const; + + size_type bucket_count() const noexcept; + size_type max_bucket_count() const noexcept; + + size_type bucket_size(size_type n) const; + size_type bucket(const key_type& k) const; + + local_iterator begin(size_type n); + local_iterator end(size_type n); + const_local_iterator begin(size_type n) const; + const_local_iterator end(size_type n) const; + const_local_iterator cbegin(size_type n) const; + const_local_iterator cend(size_type n) const; + + float load_factor() const noexcept; + float max_load_factor() const noexcept; + void max_load_factor(float z); + void rehash(size_type n); + void reserve(size_type n); +}; + +template <class Value, class Hash, class Pred, class Alloc> + void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x, + unordered_multiset<Value, Hash, Pred, Alloc>& y) + noexcept(noexcept(x.swap(y))); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x, + const unordered_multiset<Value, Hash, Pred, Alloc>& y); + +template <class Value, class Hash, class Pred, class Alloc> + bool + operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x, + const unordered_multiset<Value, Hash, Pred, Alloc>& y); +} // std + +*/ + +#include <__config> +#include <__hash_table> +#include <functional> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, + class _Alloc = allocator<_Value> > +class _LIBCPP_VISIBLE unordered_set +{ +public: + // types + typedef _Value key_type; + typedef key_type value_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; + + __table __table_; + +public: + typedef typename __table::pointer pointer; + typedef typename __table::const_pointer const_pointer; + typedef typename __table::size_type size_type; + typedef typename __table::difference_type difference_type; + + typedef typename __table::const_iterator iterator; + typedef typename __table::const_iterator const_iterator; + typedef typename __table::const_local_iterator local_iterator; + typedef typename __table::const_local_iterator const_local_iterator; + + _LIBCPP_INLINE_VISIBILITY + unordered_set() + _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) + {} // = default; + explicit unordered_set(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + template <class _InputIterator> + unordered_set(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + unordered_set(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + unordered_set(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + explicit unordered_set(const allocator_type& __a); + unordered_set(const unordered_set& __u); + unordered_set(const unordered_set& __u, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_set(unordered_set&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); + unordered_set(unordered_set&& __u, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_set(initializer_list<value_type> __il); + unordered_set(initializer_list<value_type> __il, size_type __n, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_set(initializer_list<value_type> __il, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + // ~unordered_set() = default; + _LIBCPP_INLINE_VISIBILITY + unordered_set& operator=(const unordered_set& __u) + { + __table_ = __u.__table_; + return *this; + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_set& operator=(unordered_set&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); +#endif +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_set& operator=(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return __table_.end();} + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> emplace(_Args&&... __args) + {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);} + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator, _Args&&... __args) + {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;} +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(const value_type& __x) + {return __table_.__insert_unique(__x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + pair<iterator, bool> insert(value_type&& __x) + {return __table_.__insert_unique(_VSTD::move(__x));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, const value_type& __x) + {return insert(__x).first;} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator, value_type&& __x) + {return insert(_VSTD::move(__x)).first;} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __table_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __first, const_iterator __last) + {return __table_.erase(__first, __last);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(unordered_set& __u) + _NOEXCEPT_(__is_nothrow_swappable<__table>::value) + {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_function() const {return __table_.hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const {return __table_.key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_unique(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_unique(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} + + _LIBCPP_INLINE_VISIBILITY + local_iterator begin(size_type __n) {return __table_.begin(__n);} + _LIBCPP_INLINE_VISIBILITY + local_iterator end(size_type __n) {return __table_.end(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator end(size_type __n) const {return __table_.cend(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} + + _LIBCPP_INLINE_VISIBILITY + float load_factor() const _NOEXCEPT {return __table_.load_factor();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} + _LIBCPP_INLINE_VISIBILITY + void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} + _LIBCPP_INLINE_VISIBILITY + void rehash(size_type __n) {__table_.rehash(__n);} + _LIBCPP_INLINE_VISIBILITY + void reserve(size_type __n) {__table_.reserve(__n);} +}; + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + _InputIterator __first, _InputIterator __last) +{ + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + const allocator_type& __a) + : __table_(__a) +{ +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + const unordered_set& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + const unordered_set& __u, const allocator_type& __a) + : __table_(__u.__table_, __a) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + unordered_set&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) + : __table_(_VSTD::move(__u.__table_)) +{ +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + unordered_set&& __u, const allocator_type& __a) + : __table_(_VSTD::move(__u.__table_), __a) +{ + if (__a != __u.get_allocator()) + { + iterator __i = __u.begin(); + while (__u.size() != 0) + __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_)); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + initializer_list<value_type> __il) +{ + insert(__il.begin(), __il.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_set<_Value, _Hash, _Pred, _Alloc>& +unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) +{ + __table_ = _VSTD::move(__u.__table_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_set<_Value, _Hash, _Pred, _Alloc>& +unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=( + initializer_list<value_type> __il) +{ + __table_.__assign_unique(__il.begin(), __il.end()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_unique(*__first); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, + unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +bool +operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, + const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); + __i != __ex; ++__i) + { + const_iterator __j = __y.find(*__i); + if (__j == __ey || !(*__i == *__j)) + return false; + } + return true; +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x, + const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, + class _Alloc = allocator<_Value> > +class _LIBCPP_VISIBLE unordered_multiset +{ +public: + // types + typedef _Value key_type; + typedef key_type value_type; + typedef _Hash hasher; + typedef _Pred key_equal; + typedef _Alloc allocator_type; + typedef value_type& reference; + typedef const value_type& const_reference; + +private: + typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; + + __table __table_; + +public: + typedef typename __table::pointer pointer; + typedef typename __table::const_pointer const_pointer; + typedef typename __table::size_type size_type; + typedef typename __table::difference_type difference_type; + + typedef typename __table::const_iterator iterator; + typedef typename __table::const_iterator const_iterator; + typedef typename __table::const_local_iterator local_iterator; + typedef typename __table::const_local_iterator const_local_iterator; + + _LIBCPP_INLINE_VISIBILITY + unordered_multiset() + _NOEXCEPT_(is_nothrow_default_constructible<__table>::value) + {} // = default + explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_multiset(size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a); + template <class _InputIterator> + unordered_multiset(_InputIterator __first, _InputIterator __last); + template <class _InputIterator> + unordered_multiset(_InputIterator __first, _InputIterator __last, + size_type __n, const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + template <class _InputIterator> + unordered_multiset(_InputIterator __first, _InputIterator __last, + size_type __n , const hasher& __hf, + const key_equal& __eql, const allocator_type& __a); + explicit unordered_multiset(const allocator_type& __a); + unordered_multiset(const unordered_multiset& __u); + unordered_multiset(const unordered_multiset& __u, const allocator_type& __a); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_multiset(unordered_multiset&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value); + unordered_multiset(unordered_multiset&& __u, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_multiset(initializer_list<value_type> __il); + unordered_multiset(initializer_list<value_type> __il, size_type __n, + const hasher& __hf = hasher(), + const key_equal& __eql = key_equal()); + unordered_multiset(initializer_list<value_type> __il, size_type __n, + const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + // ~unordered_multiset() = default; + _LIBCPP_INLINE_VISIBILITY + unordered_multiset& operator=(const unordered_multiset& __u) + { + __table_ = __u.__table_; + return *this; + } +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + unordered_multiset& operator=(unordered_multiset&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); +#endif +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + unordered_multiset& operator=(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(__table_.__node_alloc());} + + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT {return __table_.size() == 0;} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __table_.size();} + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT {return __table_.max_size();} + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT {return __table_.end();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT {return __table_.begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT {return __table_.end();} + +#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace(_Args&&... __args) + {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);} + template <class... _Args> + _LIBCPP_INLINE_VISIBILITY + iterator emplace_hint(const_iterator __p, _Args&&... __args) + {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);} +#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) + _LIBCPP_INLINE_VISIBILITY + iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} +#endif + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, const value_type& __x) + {return __table_.__insert_multi(__p, __x);} +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __p, value_type&& __x) + {return __table_.__insert_multi(__p, _VSTD::move(__x));} +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + template <class _InputIterator> + void insert(_InputIterator __first, _InputIterator __last); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void insert(initializer_list<value_type> __il) + {insert(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __p) {return __table_.erase(__p);} + _LIBCPP_INLINE_VISIBILITY + size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + iterator erase(const_iterator __first, const_iterator __last) + {return __table_.erase(__first, __last);} + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__table_.clear();} + + _LIBCPP_INLINE_VISIBILITY + void swap(unordered_multiset& __u) + _NOEXCEPT_(__is_nothrow_swappable<__table>::value) + {__table_.swap(__u.__table_);} + + _LIBCPP_INLINE_VISIBILITY + hasher hash_function() const {return __table_.hash_function();} + _LIBCPP_INLINE_VISIBILITY + key_equal key_eq() const {return __table_.key_eq();} + + _LIBCPP_INLINE_VISIBILITY + iterator find(const key_type& __k) {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + const_iterator find(const key_type& __k) const {return __table_.find(__k);} + _LIBCPP_INLINE_VISIBILITY + size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<iterator, iterator> equal_range(const key_type& __k) + {return __table_.__equal_range_multi(__k);} + _LIBCPP_INLINE_VISIBILITY + pair<const_iterator, const_iterator> equal_range(const key_type& __k) const + {return __table_.__equal_range_multi(__k);} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();} + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();} + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);} + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const key_type& __k) const {return __table_.bucket(__k);} + + _LIBCPP_INLINE_VISIBILITY + local_iterator begin(size_type __n) {return __table_.begin(__n);} + _LIBCPP_INLINE_VISIBILITY + local_iterator end(size_type __n) {return __table_.end(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator end(size_type __n) const {return __table_.cend(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);} + _LIBCPP_INLINE_VISIBILITY + const_local_iterator cend(size_type __n) const {return __table_.cend(__n);} + + _LIBCPP_INLINE_VISIBILITY + float load_factor() const _NOEXCEPT {return __table_.load_factor();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();} + _LIBCPP_INLINE_VISIBILITY + void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);} + _LIBCPP_INLINE_VISIBILITY + void rehash(size_type __n) {__table_.rehash(__n);} + _LIBCPP_INLINE_VISIBILITY + void reserve(size_type __n) {__table_.reserve(__n);} +}; + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + size_type __n, const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + size_type __n, const hasher& __hf, const key_equal& __eql, + const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + _InputIterator __first, _InputIterator __last) +{ + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + _InputIterator __first, _InputIterator __last, size_type __n, + const hasher& __hf, const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__first, __last); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + const allocator_type& __a) + : __table_(__a) +{ +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + const unordered_multiset& __u) + : __table_(__u.__table_) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + const unordered_multiset& __u, const allocator_type& __a) + : __table_(__u.__table_, __a) +{ + __table_.rehash(__u.bucket_count()); + insert(__u.begin(), __u.end()); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + unordered_multiset&& __u) + _NOEXCEPT_(is_nothrow_move_constructible<__table>::value) + : __table_(_VSTD::move(__u.__table_)) +{ +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + unordered_multiset&& __u, const allocator_type& __a) + : __table_(_VSTD::move(__u.__table_), __a) +{ + if (__a != __u.get_allocator()) + { + iterator __i = __u.begin(); + while (__u.size() != 0) + __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_)); + } +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + initializer_list<value_type> __il) +{ + insert(__il.begin(), __il.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql) + : __table_(__hf, __eql) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( + initializer_list<value_type> __il, size_type __n, const hasher& __hf, + const key_equal& __eql, const allocator_type& __a) + : __table_(__hf, __eql, __a) +{ + __table_.rehash(__n); + insert(__il.begin(), __il.end()); +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +unordered_multiset<_Value, _Hash, _Pred, _Alloc>& +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( + unordered_multiset&& __u) + _NOEXCEPT_(is_nothrow_move_assignable<__table>::value) +{ + __table_ = _VSTD::move(__u.__table_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline +unordered_multiset<_Value, _Hash, _Pred, _Alloc>& +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=( + initializer_list<value_type> __il) +{ + __table_.__assign_multi(__il.begin(), __il.end()); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Value, class _Hash, class _Pred, class _Alloc> +template <class _InputIterator> +inline _LIBCPP_INLINE_VISIBILITY +void +unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, + _InputIterator __last) +{ + for (; __first != __last; ++__first) + __table_.__insert_multi(*__first); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +bool +operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) +{ + if (__x.size() != __y.size()) + return false; + typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator + const_iterator; + typedef pair<const_iterator, const_iterator> _EqRng; + for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) + { + _EqRng __xeq = __x.equal_range(*__i); + _EqRng __yeq = __y.equal_range(*__i); + if (_VSTD::distance(__xeq.first, __xeq.second) != + _VSTD::distance(__yeq.first, __yeq.second) || + !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) + return false; + __i = __xeq.second; + } + return true; +} + +template <class _Value, class _Hash, class _Pred, class _Alloc> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x, + const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y) +{ + return !(__x == __y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_UNORDERED_SET diff --git a/contrib/libc++/include/utility b/contrib/libc++/include/utility new file mode 100644 index 0000000..7facea3 --- /dev/null +++ b/contrib/libc++/include/utility @@ -0,0 +1,584 @@ +// -*- C++ -*- +//===-------------------------- utility -----------------------------------===// +// +// 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_UTILITY +#define _LIBCPP_UTILITY + +/* + utility synopsis + +namespace std +{ + +template <class T> + void + swap(T& a, T& b); + +namespace rel_ops +{ + template<class T> bool operator!=(const T&, const T&); + template<class T> bool operator> (const T&, const T&); + template<class T> bool operator<=(const T&, const T&); + template<class T> bool operator>=(const T&, const T&); +} + +template<class T> +void +swap(T& a, T& b) noexcept(is_nothrow_move_constructible<T>::value && + is_nothrow_move_assignable<T>::value); + +template <class T, size_t N> +void +swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); + +template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept; +template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; + +template <class T> typename remove_reference<T>::type&& move(T&&) noexcept; + +template <class T> + typename conditional + < + !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value, + const T&, + T&& + >::type + move_if_noexcept(T& x) noexcept; + +template <class T> typename add_rvalue_reference<T>::type declval() noexcept; + +template <class T1, class T2> +struct pair +{ + typedef T1 first_type; + typedef T2 second_type; + + T1 first; + T2 second; + + pair(const pair&) = default; + pair(pair&&) = default; + constexpr pair(); + pair(const T1& x, const T2& y); + template <class U, class V> pair(U&& x, V&& y); + template <class U, class V> pair(const pair<U, V>& p); + template <class U, class V> pair(pair<U, V>&& p); + template <class... Args1, class... Args2> + pair(piecewise_construct_t, tuple<Args1...> first_args, + tuple<Args2...> second_args); + + template <class U, class V> pair& operator=(const pair<U, V>& p); + pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value && + is_nothrow_move_assignable<T2>::value); + template <class U, class V> pair& operator=(pair<U, V>&& p); + + void swap(pair& p) noexcept(noexcept(swap(first, p.first)) && + noexcept(swap(second, p.second))); +}; + +template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&); +template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&); + +template <class T1, class T2> pair<V1, V2> make_pair(T1&&, T2&&); +template <class T1, class T2> +void +swap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y))); + +struct piecewise_construct_t { }; +constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t(); + +template <class T> class tuple_size; +template <size_t I, class T> class tuple_element; + +template <class T1, class T2> struct tuple_size<std::pair<T1, T2> >; +template <class T1, class T2> struct tuple_element<0, std::pair<T1, T2> >; +template <class T1, class T2> struct tuple_element<1, std::pair<T1, T2> >; + +template<size_t I, class T1, class T2> + typename tuple_element<I, std::pair<T1, T2> >::type& + get(std::pair<T1, T2>&) noexcept; + +template<size_t I, class T1, class T2> + const typename const tuple_element<I, std::pair<T1, T2> >::type& + get(const std::pair<T1, T2>&) noexcept; + +template<size_t I, class T1, class T2> + typename tuple_element<I, std::pair<T1, T2> >::type&& + get(std::pair<T1, T2>&&) noexcept; + +} // std + +*/ + +#include <__config> +#include <__tuple> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace rel_ops +{ + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const _Tp& __x, const _Tp& __y) +{ + return !(__x == __y); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const _Tp& __x, const _Tp& __y) +{ + return __y < __x; +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const _Tp& __x, const _Tp& __y) +{ + return !(__y < __x); +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const _Tp& __x, const _Tp& __y) +{ + return !(__x < __y); +} + +} // rel_ops + +// swap_ranges + +template <class _ForwardIterator1, class _ForwardIterator2> +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator2 +swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) +{ + for(; __first1 != __last1; ++__first1, ++__first2) + swap(*__first1, *__first2); + return __first2; +} + +template<class _Tp, size_t _Np> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) +{ + _VSTD::swap_ranges(__a, __a + _Np, __b); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +typename conditional +< + !is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, + const _Tp&, + _Tp&& +>::type +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES +const _Tp& +#endif +move_if_noexcept(_Tp& __x) _NOEXCEPT +{ + return _VSTD::move(__x); +} + +struct _LIBCPP_VISIBLE piecewise_construct_t { }; +//constexpr +extern const piecewise_construct_t piecewise_construct;// = piecewise_construct_t(); + +template <class _T1, class _T2> +struct _LIBCPP_VISIBLE pair +{ + typedef _T1 first_type; + typedef _T2 second_type; + + _T1 first; + _T2 second; + + // pair(const pair&) = default; + // pair(pair&&) = default; + + _LIBCPP_INLINE_VISIBILITY pair() : first(), second() {} + + _LIBCPP_INLINE_VISIBILITY pair(const _T1& __x, const _T2& __y) + : first(__x), second(__y) {} + + template<class _U1, class _U2> + _LIBCPP_INLINE_VISIBILITY + pair(const pair<_U1, _U2>& __p +#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE + ,typename enable_if<is_constructible<_T1, _U1>::value && + is_constructible<_T2, _U2>::value>::type* = 0 +#endif + ) + : first(__p.first), second(__p.second) {} + + _LIBCPP_INLINE_VISIBILITY + pair(const pair& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<first_type>::value && + is_nothrow_copy_constructible<second_type>::value) + : first(__p.first), + second(__p.second) + { + } + + _LIBCPP_INLINE_VISIBILITY + pair& operator=(const pair& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<first_type>::value && + is_nothrow_copy_assignable<second_type>::value) + { + first = __p.first; + second = __p.second; + return *this; + } + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class _U1, class _U2, + class = typename enable_if<is_constructible<first_type, _U1 >::value && + is_constructible<second_type, _U2>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair(_U1&& __u1, _U2&& __u2) + : first(_VSTD::forward<_U1>(__u1)), + second(_VSTD::forward<_U2>(__u2)) + {} + + template<class _U1, class _U2> + _LIBCPP_INLINE_VISIBILITY + pair(pair<_U1, _U2>&& __p, + typename enable_if<is_constructible<_T1, _U1>::value && + is_constructible<_T2, _U2>::value>::type* = 0) + : first(_VSTD::forward<_U1>(__p.first)), + second(_VSTD::forward<_U2>(__p.second)) {} + + _LIBCPP_INLINE_VISIBILITY + pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<first_type>::value && + is_nothrow_move_constructible<second_type>::value) + : first(_VSTD::forward<first_type>(__p.first)), + second(_VSTD::forward<second_type>(__p.second)) + { + } + + _LIBCPP_INLINE_VISIBILITY + pair& + operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable<first_type>::value && + is_nothrow_move_assignable<second_type>::value) + { + first = _VSTD::forward<first_type>(__p.first); + second = _VSTD::forward<second_type>(__p.second); + return *this; + } + +#ifndef _LIBCPP_HAS_NO_VARIADICS + + template<class _Tuple, + class = typename enable_if<__tuple_convertible<_Tuple, pair>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair(_Tuple&& __p) + : first(_VSTD::forward<typename tuple_element<0, + typename __make_tuple_types<_Tuple>::type>::type>(get<0>(__p))), + second(_VSTD::forward<typename tuple_element<1, + typename __make_tuple_types<_Tuple>::type>::type>(get<1>(__p))) + {} + + + + template <class... _Args1, class... _Args2> + _LIBCPP_INLINE_VISIBILITY + pair(piecewise_construct_t __pc, tuple<_Args1...> __first_args, + tuple<_Args2...> __second_args) + : pair(__pc, __first_args, __second_args, + typename __make_tuple_indices<sizeof...(_Args1)>::type(), + typename __make_tuple_indices<sizeof...(_Args2) >::type()) + {} + + template <class _Tuple, + class = typename enable_if<__tuple_assignable<_Tuple, pair>::value>::type> + _LIBCPP_INLINE_VISIBILITY + pair& + operator=(_Tuple&& __p) + { + typedef typename __make_tuple_types<_Tuple>::type _TupleRef; + typedef typename tuple_element<0, _TupleRef>::type _U0; + typedef typename tuple_element<1, _TupleRef>::type _U1; + first = _VSTD::forward<_U0>(_VSTD::get<0>(__p)); + second = _VSTD::forward<_U1>(_VSTD::get<1>(__p)); + return *this; + } + +#endif // _LIBCPP_HAS_NO_VARIADICS + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + void + swap(pair& __p) _NOEXCEPT_(__is_nothrow_swappable<first_type>::value && + __is_nothrow_swappable<second_type>::value) + { + _VSTD::iter_swap(&first, &__p.first); + _VSTD::iter_swap(&second, &__p.second); + } +private: + +#ifndef _LIBCPP_HAS_NO_VARIADICS + template <class... _Args1, class... _Args2, size_t... _I1, size_t... _I2> + _LIBCPP_INLINE_VISIBILITY + pair(piecewise_construct_t, + tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, + __tuple_indices<_I1...>, __tuple_indices<_I2...>); +#endif // _LIBCPP_HAS_NO_VARIADICS +}; + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return __x.first == __y.first && __x.second == __y.second; +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return !(__x == __y); +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator< (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return __x.first < __y.first || (!(__y.first < __x.first) && __x.second < __y.second); +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator> (const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return __y < __x; +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator>=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return !(__x < __y); +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator<=(const pair<_T1,_T2>& __x, const pair<_T1,_T2>& __y) +{ + return !(__y < __x); +} + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_swappable<_T1>::value && + __is_swappable<_T2>::value, + void +>::type +swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) + _NOEXCEPT_((__is_nothrow_swappable<_T1>::value && + __is_nothrow_swappable<_T2>::value)) +{ + __x.swap(__y); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> class reference_wrapper; + +template <class _Tp> +struct ___make_pair_return +{ + typedef _Tp type; +}; + +template <class _Tp> +struct ___make_pair_return<reference_wrapper<_Tp>> +{ + typedef _Tp& type; +}; + +template <class _Tp> +struct __make_pair_return +{ + typedef typename ___make_pair_return<typename decay<_Tp>::type>::type type; +}; + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> +make_pair(_T1&& __t1, _T2&& __t2) +{ + return pair<typename __make_pair_return<_T1>::type, typename __make_pair_return<_T2>::type> + (_VSTD::forward<_T1>(__t1), _VSTD::forward<_T2>(__t2)); +} + +#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _T1, class _T2> +inline _LIBCPP_INLINE_VISIBILITY +pair<_T1,_T2> +make_pair(_T1 __x, _T2 __y) +{ + return pair<_T1, _T2>(__x, __y); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _T1, class _T2> + class _LIBCPP_VISIBLE tuple_size<pair<_T1, _T2> > + : public integral_constant<size_t, 2> {}; + +template <class _T1, class _T2> + class _LIBCPP_VISIBLE tuple_size<const pair<_T1, _T2> > + : public integral_constant<size_t, 2> {}; + +template <class _T1, class _T2> +class _LIBCPP_VISIBLE tuple_element<0, pair<_T1, _T2> > +{ +public: + typedef _T1 type; +}; + +template <class _T1, class _T2> +class _LIBCPP_VISIBLE tuple_element<1, pair<_T1, _T2> > +{ +public: + typedef _T2 type; +}; + +template <class _T1, class _T2> +class _LIBCPP_VISIBLE tuple_element<0, const pair<_T1, _T2> > +{ +public: + typedef const _T1 type; +}; + +template <class _T1, class _T2> +class _LIBCPP_VISIBLE tuple_element<1, const pair<_T1, _T2> > +{ +public: + typedef const _T2 type; +}; + +template <size_t _Ip> struct __get_pair; + +template <> +struct __get_pair<0> +{ + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + _T1& + get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} + + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + const _T1& + get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.first;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + _T1&& + get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T1>(__p.first);} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +}; + +template <> +struct __get_pair<1> +{ + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + _T2& + get(pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} + + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + const _T2& + get(const pair<_T1, _T2>& __p) _NOEXCEPT {return __p.second;} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class _T1, class _T2> + static + _LIBCPP_INLINE_VISIBILITY + _T2&& + get(pair<_T1, _T2>&& __p) _NOEXCEPT {return _VSTD::forward<_T2>(__p.second);} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +}; + +template <size_t _Ip, class _T1, class _T2> +_LIBCPP_INLINE_VISIBILITY inline +typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(pair<_T1, _T2>& __p) _NOEXCEPT +{ + return __get_pair<_Ip>::get(__p); +} + +template <size_t _Ip, class _T1, class _T2> +_LIBCPP_INLINE_VISIBILITY inline +const typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(const pair<_T1, _T2>& __p) _NOEXCEPT +{ + return __get_pair<_Ip>::get(__p); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <size_t _Ip, class _T1, class _T2> +_LIBCPP_INLINE_VISIBILITY inline +typename tuple_element<_Ip, pair<_T1, _T2> >::type&& +get(pair<_T1, _T2>&& __p) _NOEXCEPT +{ + return __get_pair<_Ip>::get(_VSTD::move(__p)); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#endif // _LIBCPP_HAS_NO_VARIADICS + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_UTILITY diff --git a/contrib/libc++/include/valarray b/contrib/libc++/include/valarray new file mode 100644 index 0000000..3c0422a --- /dev/null +++ b/contrib/libc++/include/valarray @@ -0,0 +1,4775 @@ +// -*- C++ -*- +//===-------------------------- valarray ----------------------------------===// +// +// 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_VALARRAY +#define _LIBCPP_VALARRAY + +/* + valarray synopsis + +namespace std +{ + +template<class T> +class valarray +{ +public: + typedef T value_type; + + // construct/destroy: + valarray(); + explicit valarray(size_t n); + valarray(const value_type& x, size_t n); + valarray(const value_type* px, size_t n); + valarray(const valarray& v); + valarray(valarray&& v); + valarray(const slice_array<value_type>& sa); + valarray(const gslice_array<value_type>& ga); + valarray(const mask_array<value_type>& ma); + valarray(const indirect_array<value_type>& ia); + valarray(initializer_list<value_type> il); + ~valarray(); + + // assignment: + valarray& operator=(const valarray& v); + valarray& operator=(valarray&& v); + valarray& operator=(initializer_list<value_type> il); + valarray& operator=(const value_type& x); + valarray& operator=(const slice_array<value_type>& sa); + valarray& operator=(const gslice_array<value_type>& ga); + valarray& operator=(const mask_array<value_type>& ma); + valarray& operator=(const indirect_array<value_type>& ia); + + // element access: + const value_type& operator[](size_t i) const; + value_type& operator[](size_t i); + + // subset operations: + valarray operator[](slice s) const; + slice_array<value_type> operator[](slice s); + valarray operator[](const gslice& gs) const; + gslice_array<value_type> operator[](const gslice& gs); + valarray operator[](const valarray<bool>& vb) const; + mask_array<value_type> operator[](const valarray<bool>& vb); + valarray operator[](const valarray<size_t>& vs) const; + indirect_array<value_type> operator[](const valarray<size_t>& vs); + + // unary operators: + valarray operator+() const; + valarray operator-() const; + valarray operator~() const; + valarray<bool> operator!() const; + + // computed assignment: + valarray& operator*= (const value_type& x); + valarray& operator/= (const value_type& x); + valarray& operator%= (const value_type& x); + valarray& operator+= (const value_type& x); + valarray& operator-= (const value_type& x); + valarray& operator^= (const value_type& x); + valarray& operator&= (const value_type& x); + valarray& operator|= (const value_type& x); + valarray& operator<<=(const value_type& x); + valarray& operator>>=(const value_type& x); + + valarray& operator*= (const valarray& v); + valarray& operator/= (const valarray& v); + valarray& operator%= (const valarray& v); + valarray& operator+= (const valarray& v); + valarray& operator-= (const valarray& v); + valarray& operator^= (const valarray& v); + valarray& operator|= (const valarray& v); + valarray& operator&= (const valarray& v); + valarray& operator<<=(const valarray& v); + valarray& operator>>=(const valarray& v); + + // member functions: + void swap(valarray& v); + + size_t size() const; + + value_type sum() const; + value_type min() const; + value_type max() const; + + valarray shift (int i) const; + valarray cshift(int i) const; + valarray apply(value_type f(value_type)) const; + valarray apply(value_type f(const value_type&)) const; + void resize(size_t n, value_type x = value_type()); +}; + +class slice +{ +public: + slice(); + slice(size_t start, size_t size, size_t stride); + + size_t start() const; + size_t size() const; + size_t stride() const; +}; + +template <class T> +class slice_array +{ +public: + typedef T value_type; + + const slice_array& operator=(const slice_array& sa) const; + void operator= (const valarray<value_type>& v) const; + void operator*= (const valarray<value_type>& v) const; + void operator/= (const valarray<value_type>& v) const; + void operator%= (const valarray<value_type>& v) const; + void operator+= (const valarray<value_type>& v) const; + void operator-= (const valarray<value_type>& v) const; + void operator^= (const valarray<value_type>& v) const; + void operator&= (const valarray<value_type>& v) const; + void operator|= (const valarray<value_type>& v) const; + void operator<<=(const valarray<value_type>& v) const; + void operator>>=(const valarray<value_type>& v) const; + + void operator=(const value_type& x) const; + + slice_array() = delete; +}; + +class gslice +{ +public: + gslice(); + gslice(size_t start, const valarray<size_t>& size, + const valarray<size_t>& stride); + + size_t start() const; + valarray<size_t> size() const; + valarray<size_t> stride() const; +}; + +template <class T> +class gslice_array +{ +public: + typedef T value_type; + + void operator= (const valarray<value_type>& v) const; + void operator*= (const valarray<value_type>& v) const; + void operator/= (const valarray<value_type>& v) const; + void operator%= (const valarray<value_type>& v) const; + void operator+= (const valarray<value_type>& v) const; + void operator-= (const valarray<value_type>& v) const; + void operator^= (const valarray<value_type>& v) const; + void operator&= (const valarray<value_type>& v) const; + void operator|= (const valarray<value_type>& v) const; + void operator<<=(const valarray<value_type>& v) const; + void operator>>=(const valarray<value_type>& v) const; + + gslice_array(const gslice_array& ga); + ~gslice_array(); + const gslice_array& operator=(const gslice_array& ga) const; + void operator=(const value_type& x) const; + + gslice_array() = delete; +}; + +template <class T> +class mask_array +{ +public: + typedef T value_type; + + void operator= (const valarray<value_type>& v) const; + void operator*= (const valarray<value_type>& v) const; + void operator/= (const valarray<value_type>& v) const; + void operator%= (const valarray<value_type>& v) const; + void operator+= (const valarray<value_type>& v) const; + void operator-= (const valarray<value_type>& v) const; + void operator^= (const valarray<value_type>& v) const; + void operator&= (const valarray<value_type>& v) const; + void operator|= (const valarray<value_type>& v) const; + void operator<<=(const valarray<value_type>& v) const; + void operator>>=(const valarray<value_type>& v) const; + + mask_array(const mask_array& ma); + ~mask_array(); + const mask_array& operator=(const mask_array& ma) const; + void operator=(const value_type& x) const; + + mask_array() = delete; +}; + +template <class T> +class indirect_array +{ +public: + typedef T value_type; + + void operator= (const valarray<value_type>& v) const; + void operator*= (const valarray<value_type>& v) const; + void operator/= (const valarray<value_type>& v) const; + void operator%= (const valarray<value_type>& v) const; + void operator+= (const valarray<value_type>& v) const; + void operator-= (const valarray<value_type>& v) const; + void operator^= (const valarray<value_type>& v) const; + void operator&= (const valarray<value_type>& v) const; + void operator|= (const valarray<value_type>& v) const; + void operator<<=(const valarray<value_type>& v) const; + void operator>>=(const valarray<value_type>& v) const; + + indirect_array(const indirect_array& ia); + ~indirect_array(); + const indirect_array& operator=(const indirect_array& ia) const; + void operator=(const value_type& x) const; + + indirect_array() = delete; +}; + +template<class T> void swap(valarray<T>& x, valarray<T>& y); + +template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator* (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator* (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator% (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator% (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator- (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator- (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator& (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator& (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator| (const valarray<T>& x, const T& y); +template<class T> valarray<T> operator| (const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y); +template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y); + +template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y); +template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y); + +template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y); +template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y); + +template<class T> valarray<T> abs (const valarray<T>& x); +template<class T> valarray<T> acos (const valarray<T>& x); +template<class T> valarray<T> asin (const valarray<T>& x); +template<class T> valarray<T> atan (const valarray<T>& x); + +template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> atan2(const valarray<T>& x, const T& y); +template<class T> valarray<T> atan2(const T& x, const valarray<T>& y); + +template<class T> valarray<T> cos (const valarray<T>& x); +template<class T> valarray<T> cosh (const valarray<T>& x); +template<class T> valarray<T> exp (const valarray<T>& x); +template<class T> valarray<T> log (const valarray<T>& x); +template<class T> valarray<T> log10(const valarray<T>& x); + +template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y); +template<class T> valarray<T> pow(const valarray<T>& x, const T& y); +template<class T> valarray<T> pow(const T& x, const valarray<T>& y); + +template<class T> valarray<T> sin (const valarray<T>& x); +template<class T> valarray<T> sinh (const valarray<T>& x); +template<class T> valarray<T> sqrt (const valarray<T>& x); +template<class T> valarray<T> tan (const valarray<T>& x); +template<class T> valarray<T> tanh (const valarray<T>& x); + +template <class T> unspecified1 begin(valarray<T>& v); +template <class T> unspecified2 begin(const valarray<T>& v); +template <class T> unspecified1 end(valarray<T>& v); +template <class T> unspecified2 end(const valarray<T>& v); + +} // std + +*/ + +#include <__config> +#include <cstddef> +#include <cmath> +#include <initializer_list> +#include <algorithm> +#include <functional> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _Tp> class valarray; + +class _LIBCPP_VISIBLE slice +{ + size_t __start_; + size_t __size_; + size_t __stride_; +public: + _LIBCPP_INLINE_VISIBILITY + slice() + : __start_(0), + __size_(0), + __stride_(0) + {} + + _LIBCPP_INLINE_VISIBILITY + slice(size_t __start, size_t __size, size_t __stride) + : __start_(__start), + __size_(__size), + __stride_(__stride) + {} + + _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;} + _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;} + _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;} +}; + +template <class _Tp> class slice_array; +class gslice; +template <class _Tp> class gslice_array; +template <class _Tp> class mask_array; +template <class _Tp> class indirect_array; + +template <class _Tp> +_Tp* +begin(valarray<_Tp>& __v); + +template <class _Tp> +const _Tp* +begin(const valarray<_Tp>& __v); + +template <class _Tp> +_Tp* +end(valarray<_Tp>& __v); + +template <class _Tp> +const _Tp* +end(const valarray<_Tp>& __v); + +template <class _Op, class _A0> +struct _UnaryOp +{ + typedef typename _Op::result_type result_type; + typedef typename _A0::value_type value_type; + + _Op __op_; + _A0 __a0_; + + _LIBCPP_INLINE_VISIBILITY + _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {} + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +template <class _Op, class _A0, class _A1> +struct _BinaryOp +{ + typedef typename _Op::result_type result_type; + typedef typename _A0::value_type value_type; + + _Op __op_; + _A0 __a0_; + _A1 __a1_; + + _LIBCPP_INLINE_VISIBILITY + _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1) + : __op_(__op), __a0_(__a0), __a1_(__a1) {} + + _LIBCPP_INLINE_VISIBILITY + value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +template <class _Tp> +class __scalar_expr +{ +public: + typedef _Tp value_type; + typedef const _Tp& result_type; +private: + const value_type& __t_; + size_t __s_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {} + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t) const {return __t_;} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __s_;} +}; + +template <class _Tp> +struct __unary_plus : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return +__x;} +}; + +template <class _Tp> +struct __bit_not : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return ~__x;} +}; + +template <class _Tp> +struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x << __y;} +}; + +template <class _Tp> +struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x >> __y;} +}; + +template <class _Tp, class _Fp> +struct __apply_expr : unary_function<_Tp, _Tp> +{ +private: + _Fp __f_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __apply_expr(_Fp __f) : __f_(__f) {} + + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return __f_(__x);} +}; + +template <class _Tp> +struct __abs_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return abs(__x);} +}; + +template <class _Tp> +struct __acos_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return acos(__x);} +}; + +template <class _Tp> +struct __asin_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return asin(__x);} +}; + +template <class _Tp> +struct __atan_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return atan(__x);} +}; + +template <class _Tp> +struct __atan2_expr : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return atan2(__x, __y);} +}; + +template <class _Tp> +struct __cos_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return cos(__x);} +}; + +template <class _Tp> +struct __cosh_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return cosh(__x);} +}; + +template <class _Tp> +struct __exp_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return exp(__x);} +}; + +template <class _Tp> +struct __log_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return log(__x);} +}; + +template <class _Tp> +struct __log10_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return log10(__x);} +}; + +template <class _Tp> +struct __pow_expr : binary_function<_Tp, _Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return pow(__x, __y);} +}; + +template <class _Tp> +struct __sin_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return sin(__x);} +}; + +template <class _Tp> +struct __sinh_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return sinh(__x);} +}; + +template <class _Tp> +struct __sqrt_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return sqrt(__x);} +}; + +template <class _Tp> +struct __tan_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return tan(__x);} +}; + +template <class _Tp> +struct __tanh_expr : unary_function<_Tp, _Tp> +{ + _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return tanh(__x);} +}; + +template <class _ValExpr> +class __slice_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; +public: + typedef typename _RmExpr::value_type value_type; + typedef value_type result_type; + +private: + _ValExpr __expr_; + size_t __start_; + size_t __size_; + size_t __stride_; + + _LIBCPP_INLINE_VISIBILITY + __slice_expr(const slice& __sl, const _RmExpr& __e) + : __expr_(__e), + __start_(__sl.start()), + __size_(__sl.size()), + __stride_(__sl.stride()) + {} +public: + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const + {return __expr_[__start_ + __i * __stride_];} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __size_;} + + template <class> friend class _LIBCPP_VISIBLE valarray; +}; + +template <class _ValExpr> +class __mask_expr; + +template <class _ValExpr> +class __indirect_expr; + +template <class _ValExpr> +class __shift_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; +public: + typedef typename _RmExpr::value_type value_type; + typedef value_type result_type; + +private: + _ValExpr __expr_; + size_t __size_; + ptrdiff_t __ul_; + ptrdiff_t __sn_; + ptrdiff_t __n_; + static const ptrdiff_t _Np = static_cast<ptrdiff_t>( + sizeof(ptrdiff_t) * __CHAR_BIT__ - 1); + + _LIBCPP_INLINE_VISIBILITY + __shift_expr(int __n, const _RmExpr& __e) + : __expr_(__e), + __size_(__e.size()), + __n_(__n) + { + ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np); + __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np); + __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n); + } +public: + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __j) const + { + ptrdiff_t __i = static_cast<ptrdiff_t>(__j); + ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np; + return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m); + } + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __size_;} + + template <class> friend class __val_expr; +}; + +template <class _ValExpr> +class __cshift_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; +public: + typedef typename _RmExpr::value_type value_type; + typedef value_type result_type; + +private: + _ValExpr __expr_; + size_t __size_; + size_t __m_; + size_t __o1_; + size_t __o2_; + + _LIBCPP_INLINE_VISIBILITY + __cshift_expr(int __n, const _RmExpr& __e) + : __expr_(__e), + __size_(__e.size()) + { + __n %= static_cast<int>(__size_); + if (__n >= 0) + { + __m_ = __size_ - __n; + __o1_ = __n; + __o2_ = __n - __size_; + } + else + { + __m_ = -__n; + __o1_ = __n + __size_; + __o2_ = __n; + } + } +public: + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const + { + if (__i < __m_) + return __expr_[__i + __o1_]; + return __expr_[__i + __o2_]; + } + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __size_;} + + template <class> friend class __val_expr; +}; + +template<class _ValExpr> +class __val_expr; + +template<class _ValExpr> +struct __is_val_expr : false_type {}; + +template<class _ValExpr> +struct __is_val_expr<__val_expr<_ValExpr> > : true_type {}; + +template<class _Tp> +struct __is_val_expr<valarray<_Tp> > : true_type {}; + +template<class _Tp> +class _LIBCPP_VISIBLE valarray +{ +public: + typedef _Tp value_type; + typedef _Tp result_type; + +private: + value_type* __begin_; + value_type* __end_; + +public: + // construct/destroy: + _LIBCPP_INLINE_VISIBILITY + valarray() : __begin_(0), __end_(0) {} + explicit valarray(size_t __n); + valarray(const value_type& __x, size_t __n); + valarray(const value_type* __p, size_t __n); + valarray(const valarray& __v); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + valarray(valarray&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + valarray(initializer_list<value_type> __il); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + valarray(const slice_array<value_type>& __sa); + valarray(const gslice_array<value_type>& __ga); + valarray(const mask_array<value_type>& __ma); + valarray(const indirect_array<value_type>& __ia); + ~valarray(); + + // assignment: + valarray& operator=(const valarray& __v); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + valarray& operator=(valarray&& __v); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + valarray& operator=(initializer_list<value_type>); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + valarray& operator=(const value_type& __x); + valarray& operator=(const slice_array<value_type>& __sa); + valarray& operator=(const gslice_array<value_type>& __ga); + valarray& operator=(const mask_array<value_type>& __ma); + valarray& operator=(const indirect_array<value_type>& __ia); + template <class _ValExpr> + valarray& operator=(const __val_expr<_ValExpr>& __v); + + // element access: + _LIBCPP_INLINE_VISIBILITY + const value_type& operator[](size_t __i) const {return __begin_[__i];} + + _LIBCPP_INLINE_VISIBILITY + value_type& operator[](size_t __i) {return __begin_[__i];} + + // subset operations: + __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const; + slice_array<value_type> operator[](slice __s); + __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const; + gslice_array<value_type> operator[](const gslice& __gs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const; + gslice_array<value_type> operator[](gslice&& __gs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const; + mask_array<value_type> operator[](const valarray<bool>& __vb); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const; + mask_array<value_type> operator[](valarray<bool>&& __vb); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const; + indirect_array<value_type> operator[](const valarray<size_t>& __vs); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const; + indirect_array<value_type> operator[](valarray<size_t>&& __vs); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + // unary operators: + valarray operator+() const; + valarray operator-() const; + valarray operator~() const; + valarray<bool> operator!() const; + + // computed assignment: + valarray& operator*= (const value_type& __x); + valarray& operator/= (const value_type& __x); + valarray& operator%= (const value_type& __x); + valarray& operator+= (const value_type& __x); + valarray& operator-= (const value_type& __x); + valarray& operator^= (const value_type& __x); + valarray& operator&= (const value_type& __x); + valarray& operator|= (const value_type& __x); + valarray& operator<<=(const value_type& __x); + valarray& operator>>=(const value_type& __x); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator*= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator/= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator%= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator+= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator-= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator^= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator|= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator&= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator<<= (const _Expr& __v); + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + valarray& + >::type + operator>>= (const _Expr& __v); + + // member functions: + void swap(valarray& __v); + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return static_cast<size_t>(__end_ - __begin_);} + + value_type sum() const; + value_type min() const; + value_type max() const; + + valarray shift (int __i) const; + valarray cshift(int __i) const; + valarray apply(value_type __f(value_type)) const; + valarray apply(value_type __f(const value_type&)) const; + void resize(size_t __n, value_type __x = value_type()); + +private: + template <class> friend class _LIBCPP_VISIBLE valarray; + template <class> friend class _LIBCPP_VISIBLE slice_array; + template <class> friend class _LIBCPP_VISIBLE gslice_array; + template <class> friend class _LIBCPP_VISIBLE mask_array; + template <class> friend class __mask_expr; + template <class> friend class _LIBCPP_VISIBLE indirect_array; + template <class> friend class __indirect_expr; + template <class> friend class __val_expr; + + template <class _Up> + friend + _Up* + begin(valarray<_Up>& __v); + + template <class _Up> + friend + const _Up* + begin(const valarray<_Up>& __v); + + template <class _Up> + friend + _Up* + end(valarray<_Up>& __v); + + template <class _Up> + friend + const _Up* + end(const valarray<_Up>& __v); +}; + +template <class _Op, class _Tp> +struct _UnaryOp<_Op, valarray<_Tp> > +{ + typedef typename _Op::result_type result_type; + typedef _Tp value_type; + + _Op __op_; + const valarray<_Tp>& __a0_; + + _LIBCPP_INLINE_VISIBILITY + _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {} + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +template <class _Op, class _Tp, class _A1> +struct _BinaryOp<_Op, valarray<_Tp>, _A1> +{ + typedef typename _Op::result_type result_type; + typedef _Tp value_type; + + _Op __op_; + const valarray<_Tp>& __a0_; + _A1 __a1_; + + _LIBCPP_INLINE_VISIBILITY + _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1) + : __op_(__op), __a0_(__a0), __a1_(__a1) {} + + _LIBCPP_INLINE_VISIBILITY + value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +template <class _Op, class _A0, class _Tp> +struct _BinaryOp<_Op, _A0, valarray<_Tp> > +{ + typedef typename _Op::result_type result_type; + typedef _Tp value_type; + + _Op __op_; + _A0 __a0_; + const valarray<_Tp>& __a1_; + + _LIBCPP_INLINE_VISIBILITY + _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1) + : __op_(__op), __a0_(__a0), __a1_(__a1) {} + + _LIBCPP_INLINE_VISIBILITY + value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +template <class _Op, class _Tp> +struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > +{ + typedef typename _Op::result_type result_type; + typedef _Tp value_type; + + _Op __op_; + const valarray<_Tp>& __a0_; + const valarray<_Tp>& __a1_; + + _LIBCPP_INLINE_VISIBILITY + _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1) + : __op_(__op), __a0_(__a0), __a1_(__a1) {} + + _LIBCPP_INLINE_VISIBILITY + value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __a0_.size();} +}; + +// slice_array + +template <class _Tp> +class _LIBCPP_VISIBLE slice_array +{ +public: + typedef _Tp value_type; + +private: + value_type* __vp_; + size_t __size_; + size_t __stride_; + +public: + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator*=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator/=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator%=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator+=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator-=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator^=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator&=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator|=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator<<=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator>>=(const _Expr& __v) const; + + const slice_array& operator=(const slice_array& __sa) const; + + void operator=(const value_type& __x) const; + +private: + _LIBCPP_INLINE_VISIBILITY + slice_array(const slice& __sl, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), + __size_(__sl.size()), + __stride_(__sl.stride()) + {} + + template <class> friend class valarray; + template <class> friend class sliceExpr; +}; + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const slice_array<_Tp>& +slice_array<_Tp>::operator=(const slice_array& __sa) const +{ + value_type* __t = __vp_; + const value_type* __s = __sa.__vp_; + for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_) + *__t = *__s; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t = __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator*=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t *= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator/=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t /= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator%=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t %= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator+=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t += __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator-=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t -= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator^=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t ^= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator&=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t &= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator|=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t |= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator<<=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t <<= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +slice_array<_Tp>::operator>>=(const _Expr& __v) const +{ + value_type* __t = __vp_; + for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) + *__t >>= __v[__i]; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +slice_array<_Tp>::operator=(const value_type& __x) const +{ + value_type* __t = __vp_; + for (size_t __n = __size_; __n; --__n, __t += __stride_) + *__t = __x; +} + +// gslice + +class _LIBCPP_VISIBLE gslice +{ + valarray<size_t> __size_; + valarray<size_t> __stride_; + valarray<size_t> __1d_; + +public: + _LIBCPP_INLINE_VISIBILITY + gslice() {} + + _LIBCPP_INLINE_VISIBILITY + gslice(size_t __start, const valarray<size_t>& __size, + const valarray<size_t>& __stride) + : __size_(__size), + __stride_(__stride) + {__init(__start);} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + gslice(size_t __start, const valarray<size_t>& __size, + valarray<size_t>&& __stride) + : __size_(__size), + __stride_(move(__stride)) + {__init(__start);} + + _LIBCPP_INLINE_VISIBILITY + gslice(size_t __start, valarray<size_t>&& __size, + const valarray<size_t>& __stride) + : __size_(move(__size)), + __stride_(__stride) + {__init(__start);} + + _LIBCPP_INLINE_VISIBILITY + gslice(size_t __start, valarray<size_t>&& __size, + valarray<size_t>&& __stride) + : __size_(move(__size)), + __stride_(move(__stride)) + {__init(__start);} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +// gslice(const gslice&) = default; +// gslice(gslice&&) = default; +// gslice& operator=(const gslice&) = default; +// gslice& operator=(gslice&&) = default; + + _LIBCPP_INLINE_VISIBILITY + size_t start() const {return __1d_.size() ? __1d_[0] : 0;} + + _LIBCPP_INLINE_VISIBILITY + valarray<size_t> size() const {return __size_;} + + _LIBCPP_INLINE_VISIBILITY + valarray<size_t> stride() const {return __stride_;} + +private: + void __init(size_t __start); + + template <class> friend class gslice_array; + template <class> friend class valarray; + template <class> friend class __val_expr; +}; + +// gslice_array + +template <class _Tp> +class _LIBCPP_VISIBLE gslice_array +{ +public: + typedef _Tp value_type; + +private: + value_type* __vp_; + valarray<size_t> __1d_; + +public: + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator*=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator/=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator%=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator+=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator-=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator^=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator&=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator|=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator<<=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator>>=(const _Expr& __v) const; + + const gslice_array& operator=(const gslice_array& __ga) const; + + void operator=(const value_type& __x) const; + +// gslice_array(const gslice_array&) = default; +// gslice_array(gslice_array&&) = default; +// gslice_array& operator=(const gslice_array&) = default; +// gslice_array& operator=(gslice_array&&) = default; + +private: + _LIBCPP_INLINE_VISIBILITY + gslice_array(const gslice& __gs, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_)), + __1d_(__gs.__1d_) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + gslice_array(gslice&& __gs, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_)), + __1d_(move(__gs.__1d_)) + {} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class> friend class valarray; +}; + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] = __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator*=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] *= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator/=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] /= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator%=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] %= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator+=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] += __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator-=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] -= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator^=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] ^= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator&=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] &= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator|=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] |= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator<<=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] <<= __v[__j]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +gslice_array<_Tp>::operator>>=(const _Expr& __v) const +{ + typedef const size_t* _Ip; + size_t __j = 0; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) + __vp_[*__i] >>= __v[__j]; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const gslice_array<_Tp>& +gslice_array<_Tp>::operator=(const gslice_array& __ga) const +{ + typedef const size_t* _Ip; + const value_type* __s = __ga.__vp_; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; + __i != __e; ++__i, ++__j) + __vp_[*__i] = __s[*__j]; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +gslice_array<_Tp>::operator=(const value_type& __x) const +{ + typedef const size_t* _Ip; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) + __vp_[*__i] = __x; +} + +// mask_array + +template <class _Tp> +class _LIBCPP_VISIBLE mask_array +{ +public: + typedef _Tp value_type; + +private: + value_type* __vp_; + valarray<size_t> __1d_; + +public: + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator*=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator/=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator%=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator+=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator-=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator^=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator&=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator|=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator<<=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator>>=(const _Expr& __v) const; + + const mask_array& operator=(const mask_array& __ma) const; + + void operator=(const value_type& __x) const; + +// mask_array(const mask_array&) = default; +// mask_array(mask_array&&) = default; +// mask_array& operator=(const mask_array&) = default; +// mask_array& operator=(mask_array&&) = default; + +private: + _LIBCPP_INLINE_VISIBILITY + mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_)), + __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) + { + size_t __j = 0; + for (size_t __i = 0; __i < __vb.size(); ++__i) + if (__vb[__i]) + __1d_[__j++] = __i; + } + + template <class> friend class valarray; +}; + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] = __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator*=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] *= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator/=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] /= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator%=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] %= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator+=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] += __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator-=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] -= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator^=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] ^= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator&=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] &= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator|=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] |= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator<<=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] <<= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +mask_array<_Tp>::operator>>=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] >>= __v[__i]; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const mask_array<_Tp>& +mask_array<_Tp>::operator=(const mask_array& __ma) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]]; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +mask_array<_Tp>::operator=(const value_type& __x) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] = __x; +} + +template <class _ValExpr> +class __mask_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; +public: + typedef typename _RmExpr::value_type value_type; + typedef value_type result_type; + +private: + _ValExpr __expr_; + valarray<size_t> __1d_; + + _LIBCPP_INLINE_VISIBILITY + __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e) + : __expr_(__e), + __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) + { + size_t __j = 0; + for (size_t __i = 0; __i < __vb.size(); ++__i) + if (__vb[__i]) + __1d_[__j++] = __i; + } + +public: + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const + {return __expr_[__1d_[__i]];} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __1d_.size();} + + template <class> friend class valarray; +}; + +// indirect_array + +template <class _Tp> +class _LIBCPP_VISIBLE indirect_array +{ +public: + typedef _Tp value_type; + +private: + value_type* __vp_; + valarray<size_t> __1d_; + +public: + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator*=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator/=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator%=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator+=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator-=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator^=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator&=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator|=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator<<=(const _Expr& __v) const; + + template <class _Expr> + typename enable_if + < + __is_val_expr<_Expr>::value, + void + >::type + operator>>=(const _Expr& __v) const; + + const indirect_array& operator=(const indirect_array& __ia) const; + + void operator=(const value_type& __x) const; + +// indirect_array(const indirect_array&) = default; +// indirect_array(indirect_array&&) = default; +// indirect_array& operator=(const indirect_array&) = default; +// indirect_array& operator=(indirect_array&&) = default; + +private: + _LIBCPP_INLINE_VISIBILITY + indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_)), + __1d_(__ia) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v) + : __vp_(const_cast<value_type*>(__v.__begin_)), + __1d_(move(__ia)) + {} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + + template <class> friend class valarray; +}; + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] = __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator*=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] *= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator/=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] /= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator%=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] %= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator+=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] += __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator-=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] -= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator^=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] ^= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator&=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] &= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator|=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] |= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator<<=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] <<= __v[__i]; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + void +>::type +indirect_array<_Tp>::operator>>=(const _Expr& __v) const +{ + size_t __n = __1d_.size(); + for (size_t __i = 0; __i < __n; ++__i) + __vp_[__1d_[__i]] >>= __v[__i]; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const indirect_array<_Tp>& +indirect_array<_Tp>::operator=(const indirect_array& __ia) const +{ + typedef const size_t* _Ip; + const value_type* __s = __ia.__vp_; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; + __i != __e; ++__i, ++__j) + __vp_[*__i] = __s[*__j]; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +indirect_array<_Tp>::operator=(const value_type& __x) const +{ + typedef const size_t* _Ip; + for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) + __vp_[*__i] = __x; +} + +template <class _ValExpr> +class __indirect_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; +public: + typedef typename _RmExpr::value_type value_type; + typedef value_type result_type; + +private: + _ValExpr __expr_; + valarray<size_t> __1d_; + + _LIBCPP_INLINE_VISIBILITY + __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) + : __expr_(__e), + __1d_(__ia) + {} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY + __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e) + : __expr_(__e), + __1d_(move(__ia)) + {} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +public: + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const + {return __expr_[__1d_[__i]];} + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __1d_.size();} + + template <class> friend class _LIBCPP_VISIBLE valarray; +}; + +template<class _ValExpr> +class __val_expr +{ + typedef typename remove_reference<_ValExpr>::type _RmExpr; + + _ValExpr __expr_; +public: + typedef typename _RmExpr::value_type value_type; + typedef typename _RmExpr::result_type result_type; + + _LIBCPP_INLINE_VISIBILITY + explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {} + + _LIBCPP_INLINE_VISIBILITY + result_type operator[](size_t __i) const + {return __expr_[__i];} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const + {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const + {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const + {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const + {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > + operator+() const + { + typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_)); + } + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > + operator-() const + { + typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_)); + } + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > + operator~() const + { + typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_)); + } + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > + operator!() const + { + typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_)); + } + + operator valarray<result_type>() const; + + _LIBCPP_INLINE_VISIBILITY + size_t size() const {return __expr_.size();} + + _LIBCPP_INLINE_VISIBILITY + result_type sum() const + { + size_t __n = __expr_.size(); + result_type __r = __n ? __expr_[0] : result_type(); + for (size_t __i = 1; __i < __n; ++__i) + __r += __expr_[__i]; + return __r; + } + + _LIBCPP_INLINE_VISIBILITY + result_type min() const + { + size_t __n = size(); + result_type __r = __n ? (*this)[0] : result_type(); + for (size_t __i = 1; __i < __n; ++__i) + { + result_type __x = __expr_[__i]; + if (__x < __r) + __r = __x; + } + return __r; + } + + _LIBCPP_INLINE_VISIBILITY + result_type max() const + { + size_t __n = size(); + result_type __r = __n ? (*this)[0] : result_type(); + for (size_t __i = 1; __i < __n; ++__i) + { + result_type __x = __expr_[__i]; + if (__r < __x) + __r = __x; + } + return __r; + } + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__shift_expr<_ValExpr> > shift (int __i) const + {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const + {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));} + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> > + apply(value_type __f(value_type)) const + { + typedef __apply_expr<value_type, value_type(*)(value_type)> _Op; + typedef _UnaryOp<_Op, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); + } + + _LIBCPP_INLINE_VISIBILITY + __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> > + apply(value_type __f(const value_type&)) const + { + typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op; + typedef _UnaryOp<_Op, _ValExpr> _NewExpr; + return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); + } +}; + +template<class _ValExpr> +__val_expr<_ValExpr>::operator valarray<result_type>() const +{ + valarray<result_type> __r; + size_t __n = __expr_.size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<result_type*>(::operator new(__n * sizeof(result_type))); + for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i) + ::new (__r.__end_) result_type(__expr_[__i]); + } + return __r; +} + +// valarray + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>::valarray(size_t __n) + : __begin_(0), + __end_(0) +{ + resize(__n); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>::valarray(const value_type& __x, size_t __n) + : __begin_(0), + __end_(0) +{ + resize(__n, __x); +} + +template <class _Tp> +valarray<_Tp>::valarray(const value_type* __p, size_t __n) + : __begin_(0), + __end_(0) +{ + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __n; ++__end_, ++__p, --__n) + ::new (__end_) value_type(*__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp> +valarray<_Tp>::valarray(const valarray& __v) + : __begin_(0), + __end_(0) +{ + if (__v.size()) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__v.size() * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p) + ::new (__end_) value_type(*__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>::valarray(valarray&& __v) + : __begin_(__v.__begin_), + __end_(__v.__end_) +{ + __v.__begin_ = __v.__end_ = nullptr; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp> +valarray<_Tp>::valarray(initializer_list<value_type> __il) + : __begin_(0), + __end_(0) +{ + size_t __n = __il.size(); + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (const value_type* __p = __il.begin(); __n; ++__end_, ++__p, --__n) + ::new (__end_) value_type(*__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp> +valarray<_Tp>::valarray(const slice_array<value_type>& __sa) + : __begin_(0), + __end_(0) +{ + size_t __n = __sa.__size_; + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (const value_type* __p = __sa.__vp_; __n; ++__end_, __p += __sa.__stride_, --__n) + ::new (__end_) value_type(*__p); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp> +valarray<_Tp>::valarray(const gslice_array<value_type>& __ga) + : __begin_(0), + __end_(0) +{ + size_t __n = __ga.__1d_.size(); + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef const size_t* _Ip; + const value_type* __s = __ga.__vp_; + for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; + __i != __e; ++__i, ++__end_) + ::new (__end_) value_type(__s[*__i]); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp> +valarray<_Tp>::valarray(const mask_array<value_type>& __ma) + : __begin_(0), + __end_(0) +{ + size_t __n = __ma.__1d_.size(); + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef const size_t* _Ip; + const value_type* __s = __ma.__vp_; + for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; + __i != __e; ++__i, ++__end_) + ::new (__end_) value_type(__s[*__i]); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp> +valarray<_Tp>::valarray(const indirect_array<value_type>& __ia) + : __begin_(0), + __end_(0) +{ + size_t __n = __ia.__1d_.size(); + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + typedef const size_t* _Ip; + const value_type* __s = __ia.__vp_; + for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; + __i != __e; ++__i, ++__end_) + ::new (__end_) value_type(__s[*__i]); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>::~valarray() +{ + resize(0); +} + +template <class _Tp> +valarray<_Tp>& +valarray<_Tp>::operator=(const valarray& __v) +{ + if (this != &__v) + { + if (size() != __v.size()) + resize(__v.size()); + _VSTD::copy(__v.__begin_, __v.__end_, __begin_); + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(valarray&& __v) +{ + resize(0); + __begin_ = __v.__begin_; + __end_ = __v.__end_; + __v.__begin_ = nullptr; + __v.__end_ = nullptr; + return *this; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(initializer_list<value_type> __il) +{ + if (size() != __il.size()) + resize(__il.size()); + _VSTD::copy(__il.begin(), __il.end(), __begin_); + return *this; +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const value_type& __x) +{ + _VSTD::fill(__begin_, __end_, __x); + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const slice_array<value_type>& __sa) +{ + value_type* __t = __begin_; + const value_type* __s = __sa.__vp_; + for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t) + *__t = *__s; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const gslice_array<value_type>& __ga) +{ + typedef const size_t* _Ip; + value_type* __t = __begin_; + const value_type* __s = __ga.__vp_; + for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; + __i != __e; ++__i, ++__t) + *__t = __s[*__i]; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const mask_array<value_type>& __ma) +{ + typedef const size_t* _Ip; + value_type* __t = __begin_; + const value_type* __s = __ma.__vp_; + for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; + __i != __e; ++__i, ++__t) + *__t = __s[*__i]; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const indirect_array<value_type>& __ia) +{ + typedef const size_t* _Ip; + value_type* __t = __begin_; + const value_type* __s = __ia.__vp_; + for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; + __i != __e; ++__i, ++__t) + *__t = __s[*__i]; + return *this; +} + +template <class _Tp> +template <class _ValExpr> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) +{ + size_t __n = __v.size(); + if (size() != __n) + resize(__n); + value_type* __t = __begin_; + for (size_t __i = 0; __i != __n; ++__t, ++__i) + *__t = result_type(__v[__i]); + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__slice_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](slice __s) const +{ + return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +slice_array<_Tp> +valarray<_Tp>::operator[](slice __s) +{ + return slice_array<value_type>(__s, *this); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__indirect_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](const gslice& __gs) const +{ + return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +gslice_array<_Tp> +valarray<_Tp>::operator[](const gslice& __gs) +{ + return gslice_array<value_type>(__gs, *this); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__indirect_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](gslice&& __gs) const +{ + return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +gslice_array<_Tp> +valarray<_Tp>::operator[](gslice&& __gs) +{ + return gslice_array<value_type>(move(__gs), *this); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__mask_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](const valarray<bool>& __vb) const +{ + return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +mask_array<_Tp> +valarray<_Tp>::operator[](const valarray<bool>& __vb) +{ + return mask_array<value_type>(__vb, *this); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__mask_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](valarray<bool>&& __vb) const +{ + return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +mask_array<_Tp> +valarray<_Tp>::operator[](valarray<bool>&& __vb) +{ + return mask_array<value_type>(move(__vb), *this); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__indirect_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](const valarray<size_t>& __vs) const +{ + return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +indirect_array<_Tp> +valarray<_Tp>::operator[](const valarray<size_t>& __vs) +{ + return indirect_array<value_type>(__vs, *this); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +__val_expr<__indirect_expr<const valarray<_Tp>&> > +valarray<_Tp>::operator[](valarray<size_t>&& __vs) const +{ + return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +indirect_array<_Tp> +valarray<_Tp>::operator[](valarray<size_t>&& __vs) +{ + return indirect_array<value_type>(move(__vs), *this); +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::operator+() const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) value_type(+*__p); + } + return __r; +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::operator-() const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) value_type(-*__p); + } + return __r; +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::operator~() const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) value_type(~*__p); + } + return __r; +} + +template <class _Tp> +valarray<bool> +valarray<_Tp>::operator!() const +{ + valarray<bool> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<bool*>(::operator new(__n * sizeof(bool))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) bool(!*__p); + } + return __r; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator*=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p *= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator/=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p /= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator%=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p %= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator+=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p += __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator-=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p -= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator^=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p ^= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator&=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p &= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator|=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p |= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator<<=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p <<= __x; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +valarray<_Tp>& +valarray<_Tp>::operator>>=(const value_type& __x) +{ + for (value_type* __p = __begin_; __p != __end_; ++__p) + *__p >>= __x; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator*=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t *= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator/=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t /= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator%=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t %= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator+=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t += __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator-=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t -= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator^=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t ^= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator|=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t |= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator&=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t &= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator<<=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t <<= __v[__i]; + return *this; +} + +template <class _Tp> +template <class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + valarray<_Tp>& +>::type +valarray<_Tp>::operator>>=(const _Expr& __v) +{ + size_t __i = 0; + for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) + *__t >>= __v[__i]; + return *this; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +valarray<_Tp>::swap(valarray& __v) +{ + _VSTD::swap(__begin_, __v.__begin_); + _VSTD::swap(__end_, __v.__end_); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +valarray<_Tp>::sum() const +{ + if (__begin_ == __end_) + return value_type(); + const value_type* __p = __begin_; + _Tp __r = *__p; + for (++__p; __p != __end_; ++__p) + __r += *__p; + return __r; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +valarray<_Tp>::min() const +{ + if (__begin_ == __end_) + return value_type(); + return *_VSTD::min_element(__begin_, __end_); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp +valarray<_Tp>::max() const +{ + if (__begin_ == __end_) + return value_type(); + return *_VSTD::max_element(__begin_, __end_); +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::shift(int __i) const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + const value_type* __sb; + value_type* __tb; + value_type* __te; + if (__i >= 0) + { + __i = _VSTD::min(__i, static_cast<int>(__n)); + __sb = __begin_ + __i; + __tb = __r.__begin_; + __te = __r.__begin_ + (__n - __i); + } + else + { + __i = _VSTD::min(-__i, static_cast<int>(__n)); + __sb = __begin_; + __tb = __r.__begin_ + __i; + __te = __r.__begin_ + __n; + } + for (; __r.__end_ != __tb; ++__r.__end_) + ::new (__r.__end_) value_type(); + for (; __r.__end_ != __te; ++__r.__end_, ++__sb) + ::new (__r.__end_) value_type(*__sb); + for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_) + ::new (__r.__end_) value_type(); + } + return __r; +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::cshift(int __i) const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + __i %= static_cast<int>(__n); + const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i; + for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s) + ::new (__r.__end_) value_type(*__s); + for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s) + ::new (__r.__end_) value_type(*__s); + } + return __r; +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::apply(value_type __f(value_type)) const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) value_type(__f(*__p)); + } + return __r; +} + +template <class _Tp> +valarray<_Tp> +valarray<_Tp>::apply(value_type __f(const value_type&)) const +{ + valarray<value_type> __r; + size_t __n = size(); + if (__n) + { + __r.__begin_ = + __r.__end_ = + static_cast<value_type*>(::operator new(__n * sizeof(value_type))); + for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) + ::new (__r.__end_) value_type(__f(*__p)); + } + return __r; +} + +template <class _Tp> +void +valarray<_Tp>::resize(size_t __n, value_type __x) +{ + if (__begin_ != nullptr) + { + while (__end_ != __begin_) + (--__end_)->~value_type(); + ::operator delete(__begin_); + __begin_ = __end_ = nullptr; + } + if (__n) + { + __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type))); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __n; --__n, ++__end_) + ::new (__end_) value_type(__x); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + resize(0); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template<class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +void +swap(valarray<_Tp>& __x, valarray<_Tp>& __y) +{ + __x.swap(__y); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator*(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator*(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(multiplies<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator*(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(multiplies<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator/(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<divides<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator/(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(divides<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<divides<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator/(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(divides<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator%(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator%(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(modulus<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator%(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(modulus<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator+(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<plus<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator+(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(plus<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<plus<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator+(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(plus<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator-(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<minus<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator-(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(minus<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<minus<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator-(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(minus<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator^(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator^(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(bit_xor<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator^(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(bit_xor<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator&(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator&(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(bit_and<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator&(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(bit_and<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator|(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator|(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(bit_or<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator|(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(bit_or<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator<<(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator<<(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator<<(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator>>(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator>>(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator>>(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator&&(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator&&(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(logical_and<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator&&(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(logical_and<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator||(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator||(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(logical_or<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator||(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(logical_or<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator==(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator==(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(equal_to<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator==(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(equal_to<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator!=(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator!=(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(not_equal_to<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator!=(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(not_equal_to<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator<(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(less<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<less<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator<(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(less<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<less<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator<(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(less<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator>(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<greater<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator>(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(greater<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<greater<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator>(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(greater<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator<=(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator<=(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(less_equal<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator<=(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(less_equal<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +operator>=(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +operator>=(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(greater_equal<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +operator>=(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(greater_equal<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> > +>::type +abs(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> > +>::type +acos(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> > +>::type +asin(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> > +>::type +atan(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +atan2(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +atan2(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +atan2(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> > +>::type +cos(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> > +>::type +cosh(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> > +>::type +exp(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> > +>::type +log(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> > +>::type +log10(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x)); +} + +template<class _Expr1, class _Expr2> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, + __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > +>::type +pow(const _Expr1& __x, const _Expr2& __y) +{ + typedef typename _Expr1::value_type value_type; + typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op; + return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, + _Expr, __scalar_expr<typename _Expr::value_type> > > +>::type +pow(const _Expr& __x, const typename _Expr::value_type& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; + return __val_expr<_Op>(_Op(__pow_expr<value_type>(), + __x, __scalar_expr<value_type>(__y, __x.size()))); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, + __scalar_expr<typename _Expr::value_type>, _Expr> > +>::type +pow(const typename _Expr::value_type& __x, const _Expr& __y) +{ + typedef typename _Expr::value_type value_type; + typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__pow_expr<value_type>(), + __scalar_expr<value_type>(__x, __y.size()), __y)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> > +>::type +sin(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> > +>::type +sinh(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> > +>::type +sqrt(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> > +>::type +tan(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x)); +} + +template<class _Expr> +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + __is_val_expr<_Expr>::value, + __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> > +>::type +tanh(const _Expr& __x) +{ + typedef typename _Expr::value_type value_type; + typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op; + return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x)); +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +begin(valarray<_Tp>& __v) +{ + return __v.__begin_; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp* +begin(const valarray<_Tp>& __v) +{ + return __v.__begin_; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +_Tp* +end(valarray<_Tp>& __v) +{ + return __v.__end_; +} + +template <class _Tp> +inline _LIBCPP_INLINE_VISIBILITY +const _Tp* +end(const valarray<_Tp>& __v) +{ + return __v.__end_; +} + +extern template valarray<size_t>::valarray(size_t); +extern template valarray<size_t>::~valarray(); +extern template void valarray<size_t>::resize(size_t, size_t); + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_VALARRAY diff --git a/contrib/libc++/include/vector b/contrib/libc++/include/vector new file mode 100644 index 0000000..61f0aef --- /dev/null +++ b/contrib/libc++/include/vector @@ -0,0 +1,3171 @@ +// -*- 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; + + vector() + noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit vector(const 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) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + 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) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + 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 noexcept; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + size_type size() const noexcept; + size_type max_size() const noexcept; + size_type capacity() const noexcept; + bool empty() const noexcept; + void reserve(size_type n); + void shrink_to_fit() noexcept; + + 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() noexcept; + const value_type* data() const noexcept; + + 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() noexcept; + + void resize(size_type sz); + void resize(size_type sz, const value_type& c); + + void swap(vector&) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + + 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&) noexcept; + operator bool() const noexcept; + reference& operator=(const bool x) noexcept; + reference& operator=(const reference& x) noexcept; + iterator operator&() const noexcept; + void flip() noexcept; + }; + + class const_reference + { + public: + const_reference(const reference&) noexcept; + operator bool() const noexcept; + const_iterator operator&() const noexcept; + }; + + vector() + noexcept(is_nothrow_default_constructible<allocator_type>::value); + explicit vector(const 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) + noexcept(is_nothrow_move_constructible<allocator_type>::value); + 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) + noexcept( + allocator_type::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); + 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 noexcept; + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + size_type size() const noexcept; + size_type max_size() const noexcept; + size_type capacity() const noexcept; + bool empty() const noexcept; + void reserve(size_type n); + void shrink_to_fit() noexcept; + + 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() noexcept; + + void resize(size_type sz); + void resize(size_type sz, value_type x); + + void swap(vector&) + noexcept(!allocator_type::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + void flip() noexcept; + + 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) + noexcept(noexcept(x.swap(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> + +#include <__undef_min_max> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_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 +} + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable: 4231 ) +#endif // _MSC_VER +extern template class __vector_base_common<true>; +#ifdef _MSC_VER +#pragma warning( pop ) +#endif // _MSC_VER + +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() _NOEXCEPT + {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY + const allocator_type& __alloc() const _NOEXCEPT + {return __end_cap_.second();} + _LIBCPP_INLINE_VISIBILITY + pointer& __end_cap() _NOEXCEPT + {return __end_cap_.first();} + _LIBCPP_INLINE_VISIBILITY + const pointer& __end_cap() const _NOEXCEPT + {return __end_cap_.first();} + + _LIBCPP_INLINE_VISIBILITY + __vector_base() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY __vector_base(const allocator_type& __a); + ~__vector_base(); + + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__destruct_at_end(__begin_);} + _LIBCPP_INLINE_VISIBILITY + size_type capacity() const _NOEXCEPT + {return static_cast<size_type>(__end_cap() - __begin_);} + + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(const_pointer __new_last) _NOEXCEPT + {__destruct_at_end(__new_last, false_type());} + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT; + + _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) + _NOEXCEPT_( + !__alloc_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<allocator_type>::value) + {__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) + _NOEXCEPT_( + !__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) + {__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&, false_type) + {} + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__vector_base& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__vector_base&, false_type) + _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(allocator_type&, allocator_type&, false_type) + _NOEXCEPT + {} +}; + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +__vector_base<_Tp, _Allocator>::__destruct_at_end(const_pointer __new_last, false_type) _NOEXCEPT +{ + 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) _NOEXCEPT +{ + __end_ = const_cast<pointer>(__new_last); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +__vector_base<_Tp, _Allocator>::__vector_base() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + : __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; + typedef __wrap_iter<pointer> iterator; + typedef __wrap_iter<const_pointer> const_iterator; + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + + _LIBCPP_INLINE_VISIBILITY + vector() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + } + _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a) + : __base(__a) + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + } + 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); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + vector(initializer_list<value_type> __il); + _LIBCPP_INLINE_VISIBILITY + vector(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_INLINE_VISIBILITY + ~vector() + { + __get_db()->__erase_c(this); + } +#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) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY + vector(vector&& __x, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY + vector& operator=(vector&& __x) + _NOEXCEPT_( + __alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + vector& operator=(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end()); return *this;} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + 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); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void assign(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY + allocator_type get_allocator() const _NOEXCEPT + {return this->__alloc();} + + _LIBCPP_INLINE_VISIBILITY iterator begin() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY const_iterator begin() const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY iterator end() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY const_iterator end() const _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT + {return begin();} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT + {return end();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT + {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT + {return rend();} + + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT + {return static_cast<size_type>(this->__end_ - this->__begin_);} + _LIBCPP_INLINE_VISIBILITY + size_type capacity() const _NOEXCEPT + {return __base::capacity();} + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT + {return this->__begin_ == this->__end_;} + size_type max_size() const _NOEXCEPT; + void reserve(size_type __n); + void shrink_to_fit() _NOEXCEPT; + + _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() + { + _LIBCPP_ASSERT(!empty(), "front() called for empty vector"); + return *this->__begin_; + } + _LIBCPP_INLINE_VISIBILITY const_reference front() const + { + _LIBCPP_ASSERT(!empty(), "front() called for empty vector"); + return *this->__begin_; + } + _LIBCPP_INLINE_VISIBILITY reference back() + { + _LIBCPP_ASSERT(!empty(), "back() called for empty vector"); + return *(this->__end_ - 1); + } + _LIBCPP_INLINE_VISIBILITY const_reference back() const + { + _LIBCPP_ASSERT(!empty(), "back() called for empty vector"); + return *(this->__end_ - 1); + } + + _LIBCPP_INLINE_VISIBILITY + value_type* data() _NOEXCEPT + {return _VSTD::__to_raw_pointer(this->__begin_);} + _LIBCPP_INLINE_VISIBILITY + const value_type* data() const _NOEXCEPT + {return _VSTD::__to_raw_pointer(this->__begin_);} + + _LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x); +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY 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); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __position, initializer_list<value_type> __il) + {return insert(__position, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); + iterator erase(const_iterator __first, const_iterator __last); + + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT + { + __base::clear(); + __invalidate_all_iterators(); + } + + void resize(size_type __sz); + void resize(size_type __sz, const_reference __x); + + void swap(vector&) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + + bool __invariants() const; + +#if _LIBCPP_DEBUG_LEVEL >= 2 + + bool __dereferenceable(const const_iterator* __i) const; + bool __decrementable(const const_iterator* __i) const; + bool __addable(const const_iterator* __i, ptrdiff_t __n) const; + bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + +private: + _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); + void allocate(size_type __n); + void deallocate() _NOEXCEPT; + _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) _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + const_iterator __make_iter(const_pointer __p) const _NOEXCEPT; + 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) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); + void __move_assign(vector& __c, false_type); + _LIBCPP_INLINE_VISIBILITY + void __destruct_at_end(const_pointer __new_last) _NOEXCEPT + { +#if _LIBCPP_DEBUG_LEVEL >= 2 + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); + if (__i->base() > __new_last) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __base::__destruct_at_end(__new_last); + } + template <class _Up> + void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + __push_back_slow_path(_Up&& __x); +#else + __push_back_slow_path(_Up& __x); +#endif +#if !defined(_LIBCPP_HAS_NO_VARIADICS) && !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) + template <class... _Args> + void + __emplace_back_slow_path(_Args&&... __args); +#endif +}; + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) +{ + __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_); + _VSTD::swap(this->__begin_, __v.__begin_); + _VSTD::swap(this->__end_, __v.__end_); + _VSTD::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_; + __alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_); + __alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_); + _VSTD::swap(this->__begin_, __v.__begin_); + _VSTD::swap(this->__end_, __v.__end_); + _VSTD::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() _NOEXCEPT +{ + if (this->__begin_ != 0) + { + clear(); + __alloc_traits::deallocate(this->__alloc(), this->__begin_, capacity()); + 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 _NOEXCEPT +{ + return _VSTD::min<size_type>(__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 _VSTD::max<size_type>(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, _VSTD::__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, _VSTD::__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, _VSTD::__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, _VSTD::__to_raw_pointer(this->__end_), + _VSTD::move(*__first)); + ++this->__end_; + } +} + +// Default constructs __n objects starting at __end_ +// throws if construction throws +// Postcondition: size() == size() + __n +// Exception safety: strong. +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. +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 _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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 _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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 _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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*) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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*) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + size_type __n = static_cast<size_type>(_VSTD::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) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + size_type __n = static_cast<size_type>(_VSTD::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())) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + 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) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __base(_VSTD::move(__x.__alloc())) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); + __get_db()->swap(this, &__x); +#endif + this->__begin_ = __x.__begin_; + this->__end_ = __x.__end_; + this->__end_cap() = __x.__end_cap(); + __x.__begin_ = __x.__end_ = __x.__end_cap() = 0; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<_Tp, _Allocator>::vector(vector&& __x, const allocator_type& __a) + : __base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + if (__a == __x.__alloc()) + { + this->__begin_ = __x.__begin_; + this->__end_ = __x.__end_; + this->__end_cap() = __x.__end_cap(); + __x.__begin_ = __x.__end_ = __x.__end_cap() = nullptr; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->swap(this, &__x); +#endif + } + else + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__x.begin()), _Ip(__x.end())); + } +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + if (__il.size() > 0) + { + allocate(__il.size()); + __construct_at_end(__il.begin(), __il.end()); + } +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<_Tp, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) + : __base(__a) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__insert_c(this); +#endif + if (__il.size() > 0) + { + allocate(__il.size()); + __construct_at_end(__il.begin(), __il.end()); + } +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<_Tp, _Allocator>& +vector<_Tp, _Allocator>::operator=(vector&& __x) + _NOEXCEPT_( + __alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) +{ + __move_assign(__x, integral_constant<bool, + __alloc_traits::propagate_on_container_move_assignment::value>()); + return *this; +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type) +{ + if (__base::__alloc() != __c.__alloc()) + { + typedef move_iterator<iterator> _Ip; + assign(_Ip(__c.begin()), _Ip(__c.end())); + } + else + __move_assign(__c, true_type()); +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) +{ + deallocate(); + this->__begin_ = __c.__begin_; + this->__end_ = __c.__end_; + this->__end_cap() = __c.__end_cap(); + __base::__move_assign_alloc(__c); + __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->swap(this, &__c); +#endif +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<_Tp, _Allocator>& +vector<_Tp, _Allocator>::operator=(const vector& __x) +{ + if (this != &__x) + { + __base::__copy_assign_alloc(__x); + assign(__x.__begin_, __x.__end_); + } + return *this; +} + +template <class _Tp, class _Allocator> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + void +>::type +vector<_Tp, _Allocator>::assign(_InputIterator __first, _InputIterator __last) +{ + clear(); + for (; __first != __last; ++__first) + push_back(*__first); +} + +template <class _Tp, class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +vector<_Tp, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) +{ + typename iterator_traits<_ForwardIterator>::difference_type __new_size = _VSTD::distance(__first, __last); + if (static_cast<size_type>(__new_size) <= capacity()) + { + _ForwardIterator __mid = __last; + bool __growing = false; + if (static_cast<size_type>(__new_size) > size()) + { + __growing = true; + __mid = __first; + _VSTD::advance(__mid, size()); + } + pointer __m = _VSTD::copy(__first, __mid, this->__begin_); + if (__growing) + __construct_at_end(__mid, __last); + else + this->__destruct_at_end(__m); + } + else + { + deallocate(); + allocate(__recommend(static_cast<size_type>(__new_size))); + __construct_at_end(__first, __last); + } +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u) +{ + if (__n <= capacity()) + { + size_type __s = size(); + _VSTD::fill_n(this->__begin_, _VSTD::min(__n, __s), __u); + if (__n > __s) + __construct_at_end(__n - __s, __u); + else + this->__destruct_at_end(this->__begin_ + __n); + } + else + { + deallocate(); + allocate(__recommend(static_cast<size_type>(__n))); + __construct_at_end(__n, __u); + } +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::__make_iter(pointer __p) _NOEXCEPT +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + return iterator(this, __p); +#else + return iterator(__p); +#endif +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::const_iterator +vector<_Tp, _Allocator>::__make_iter(const_pointer __p) const _NOEXCEPT +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + return const_iterator(this, __p); +#else + return const_iterator(__p); +#endif +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::begin() _NOEXCEPT +{ + return __make_iter(this->__begin_); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::const_iterator +vector<_Tp, _Allocator>::begin() const _NOEXCEPT +{ + return __make_iter(this->__begin_); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::end() _NOEXCEPT +{ + return __make_iter(this->__end_); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::const_iterator +vector<_Tp, _Allocator>::end() const _NOEXCEPT +{ + return __make_iter(this->__end_); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::reference +vector<_Tp, _Allocator>::operator[](size_type __n) +{ + _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); + return this->__begin_[__n]; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::const_reference +vector<_Tp, _Allocator>::operator[](size_type __n) const +{ + _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds"); + return this->__begin_[__n]; +} + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::reference +vector<_Tp, _Allocator>::at(size_type __n) +{ + if (__n >= size()) + this->__throw_out_of_range(); + return this->__begin_[__n]; +} + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::const_reference +vector<_Tp, _Allocator>::at(size_type __n) const +{ + if (__n >= size()) + this->__throw_out_of_range(); + return this->__begin_[__n]; +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::reserve(size_type __n) +{ + if (__n > capacity()) + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__n, size(), __a); + __swap_out_circular_buffer(__v); + } +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT +{ + if (capacity() > size()) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(size(), size(), __a); + __swap_out_circular_buffer(__v); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Tp, class _Allocator> +template <class _Up> +void +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES +vector<_Tp, _Allocator>::__push_back_slow_path(_Up&& __x) +#else +vector<_Tp, _Allocator>::__push_back_slow_path(_Up& __x) +#endif +{ + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); + // __v.push_back(_VSTD::forward<_Up>(__x)); + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_++), _VSTD::forward<_Up>(__x)); + __swap_out_circular_buffer(__v); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<_Tp, _Allocator>::push_back(const_reference __x) +{ + if (this->__end_ != this->__end_cap()) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), __x); + ++this->__end_; + } + else + __push_back_slow_path(__x); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<_Tp, _Allocator>::push_back(value_type&& __x) +{ + if (this->__end_ < this->__end_cap()) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), + _VSTD::move(__x)); + ++this->__end_; + } + else + __push_back_slow_path(_VSTD::move(__x)); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +void +vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) +{ + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a); +// __v.emplace_back(_VSTD::forward<_Args>(__args)...); + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(__v.__end_++), _VSTD::forward<_Args>(__args)...); + __swap_out_circular_buffer(__v); +} + +template <class _Tp, class _Allocator> +template <class... _Args> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<_Tp, _Allocator>::emplace_back(_Args&&... __args) +{ + if (this->__end_ < this->__end_cap()) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), + _VSTD::forward<_Args>(__args)...); + ++this->__end_; + } + else + __emplace_back_slow_path(_VSTD::forward<_Args>(__args)...); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<_Tp, _Allocator>::pop_back() +{ + _LIBCPP_ASSERT(!empty(), "vector::pop_back called for empty vector"); + this->__destruct_at_end(this->__end_ - 1); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::erase(const_iterator __position) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::erase(iterator) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = const_cast<pointer>(&*__position); + iterator __r = __make_iter(__p); + this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p)); + return __r; +} + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this, + "vector::erase(iterator, iterator) called with an iterator not" + " referring to this vector"); +#endif + _LIBCPP_ASSERT(__first <= __last, "vector::erase(first, last) called with invalid range"); + pointer __p = this->__begin_ + (__first - begin()); + iterator __r = __make_iter(__p); + this->__destruct_at_end(_VSTD::move(__p + (__last - __first), this->__end_, __p)); + return __r; +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) +{ + pointer __old_last = this->__end_; + difference_type __n = __old_last - __to; + for (pointer __i = __from_s + __n; __i < __from_e; ++__i, ++this->__end_) + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), + _VSTD::move(*__i)); + _VSTD::move_backward(__from_s, __from_s + __n, __old_last); +} + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::insert(iterator, x) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = this->__begin_ + (__position - begin()); + if (this->__end_ < this->__end_cap()) + { + if (__p == this->__end_) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), __x); + ++this->__end_; + } + else + { + __move_range(__p, this->__end_, __p + 1); + const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); + if (__p <= __xr && __xr < this->__end_) + ++__xr; + *__p = *__xr; + } + } + else + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); + __v.push_back(__x); + __p = __swap_out_circular_buffer(__v, __p); + } + return __make_iter(__p); +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::insert(iterator, x) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = this->__begin_ + (__position - begin()); + if (this->__end_ < this->__end_cap()) + { + if (__p == this->__end_) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), + _VSTD::move(__x)); + ++this->__end_; + } + else + { + __move_range(__p, this->__end_, __p + 1); + *__p = _VSTD::move(__x); + } + } + else + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); + __v.push_back(_VSTD::move(__x)); + __p = __swap_out_circular_buffer(__v, __p); + } + return __make_iter(__p); +} + +#ifndef _LIBCPP_HAS_NO_VARIADICS + +template <class _Tp, class _Allocator> +template <class... _Args> +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::emplace(iterator, x) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = this->__begin_ + (__position - begin()); + if (this->__end_ < this->__end_cap()) + { + if (__p == this->__end_) + { + __alloc_traits::construct(this->__alloc(), + _VSTD::__to_raw_pointer(this->__end_), + _VSTD::forward<_Args>(__args)...); + ++this->__end_; + } + else + { + __move_range(__p, this->__end_, __p + 1); + *__p = value_type(_VSTD::forward<_Args>(__args)...); + } + } + else + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, __a); + __v.emplace_back(_VSTD::forward<_Args>(__args)...); + __p = __swap_out_circular_buffer(__v, __p); + } + return __make_iter(__p); +} + +#endif // _LIBCPP_HAS_NO_VARIADICS +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Tp, class _Allocator> +typename vector<_Tp, _Allocator>::iterator +vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::insert(iterator, n, x) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = this->__begin_ + (__position - begin()); + if (__n > 0) + { + if (__n <= static_cast<size_type>(this->__end_cap() - this->__end_)) + { + size_type __old_n = __n; + pointer __old_last = this->__end_; + if (__n > static_cast<size_type>(this->__end_ - __p)) + { + size_type __cx = __n - (this->__end_ - __p); + __construct_at_end(__cx, __x); + __n -= __cx; + } + if (__n > 0) + { + __move_range(__p, __old_last, __p + __old_n); + const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); + if (__p <= __xr && __xr < this->__end_) + __xr += __old_n; + _VSTD::fill_n(__p, __n, *__xr); + } + } + else + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); + __v.__construct_at_end(__n, __x); + __p = __swap_out_circular_buffer(__v, __p); + } + } + return __make_iter(__p); +} + +template <class _Tp, class _Allocator> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + typename vector<_Tp, _Allocator>::iterator +>::type +vector<_Tp, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::insert(iterator, range) called with an iterator not" + " referring to this vector"); +#endif + difference_type __off = __position - begin(); + pointer __p = this->__begin_ + __off; + allocator_type& __a = this->__alloc(); + pointer __old_last = this->__end_; + for (; this->__end_ != this->__end_cap() && __first != __last; ++__first) + { + __alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), + *__first); + ++this->__end_; + } + __split_buffer<value_type, allocator_type&> __v(__a); + if (__first != __last) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __v.__construct_at_end(__first, __last); + difference_type __old_size = __old_last - this->__begin_; + difference_type __old_p = __p - this->__begin_; + reserve(__recommend(size() + __v.size())); + __p = this->__begin_ + __old_p; + __old_last = this->__begin_ + __old_size; +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + erase(__make_iter(__old_last), end()); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + __p = _VSTD::rotate(__p, __old_last, this->__end_); + insert(__make_iter(__p), make_move_iterator(__v.begin()), + make_move_iterator(__v.end())); + return begin() + __off; +} + +template <class _Tp, class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + typename vector<_Tp, _Allocator>::iterator +>::type +vector<_Tp, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this, + "vector::insert(iterator, range) called with an iterator not" + " referring to this vector"); +#endif + pointer __p = this->__begin_ + (__position - begin()); + difference_type __n = _VSTD::distance(__first, __last); + if (__n > 0) + { + if (__n <= this->__end_cap() - this->__end_) + { + size_type __old_n = __n; + pointer __old_last = this->__end_; + _ForwardIterator __m = __last; + difference_type __dx = this->__end_ - __p; + if (__n > __dx) + { + __m = __first; + _VSTD::advance(__m, this->__end_ - __p); + __construct_at_end(__m, __last); + __n = __dx; + } + if (__n > 0) + { + __move_range(__p, __old_last, __p + __old_n); + _VSTD::copy(__first, __m, __p); + } + } + else + { + allocator_type& __a = this->__alloc(); + __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, __a); + __v.__construct_at_end(__first, __last); + __p = __swap_out_circular_buffer(__v, __p); + } + } + return __make_iter(__p); +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::resize(size_type __sz) +{ + size_type __cs = size(); + if (__cs < __sz) + this->__append(__sz - __cs); + else if (__cs > __sz) + this->__destruct_at_end(this->__begin_ + __sz); +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) +{ + size_type __cs = size(); + if (__cs < __sz) + this->__append(__sz - __cs, __x); + else if (__cs > __sz) + this->__destruct_at_end(this->__begin_ + __sz); +} + +template <class _Tp, class _Allocator> +void +vector<_Tp, _Allocator>::swap(vector& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) +{ + _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || + this->__alloc() == __x.__alloc(), + "vector::swap: Either propagate_on_container_swap must be true" + " or the allocators must compare equal"); + _VSTD::swap(this->__begin_, __x.__begin_); + _VSTD::swap(this->__end_, __x.__end_); + _VSTD::swap(this->__end_cap(), __x.__end_cap()); + __base::__swap_alloc(this->__alloc(), __x.__alloc()); +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->swap(this, &__x); +#endif // _LIBCPP_DEBUG_LEVEL >= 2 +} + +template <class _Tp, class _Allocator> +bool +vector<_Tp, _Allocator>::__invariants() const +{ + if (this->__begin_ == 0) + { + if (this->__end_ != 0 || this->__end_cap() != 0) + return false; + } + else + { + if (this->__begin_ > this->__end_) + return false; + if (this->__begin_ == this->__end_cap()) + return false; + if (this->__end_ > this->__end_cap()) + return false; + } + return true; +} + +#if _LIBCPP_DEBUG_LEVEL >= 2 + +template <class _Tp, class _Allocator> +bool +vector<_Tp, _Allocator>::__dereferenceable(const const_iterator* __i) const +{ + return this->__begin_ <= __i->base() && __i->base() < this->__end_; +} + +template <class _Tp, class _Allocator> +bool +vector<_Tp, _Allocator>::__decrementable(const const_iterator* __i) const +{ + return this->__begin_ < __i->base() && __i->base() <= this->__end_; +} + +template <class _Tp, class _Allocator> +bool +vector<_Tp, _Allocator>::__addable(const const_iterator* __i, ptrdiff_t __n) const +{ + const_pointer __p = __i->base() + __n; + return this->__begin_ <= __p && __p <= this->__end_; +} + +template <class _Tp, class _Allocator> +bool +vector<_Tp, _Allocator>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const +{ + const_pointer __p = __i->base() + __n; + return this->__begin_ <= __p && __p < this->__end_; +} + +#endif // _LIBCPP_DEBUG_LEVEL >= 2 + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<_Tp, _Allocator>::__invalidate_all_iterators() +{ +#if _LIBCPP_DEBUG_LEVEL >= 2 + __get_db()->__invalidate_all(this); +#endif // _LIBCPP_DEBUG_LEVEL >= 2 +} + +// vector<bool> + +template <class _Allocator> class vector<bool, _Allocator>; + +template <class _Allocator> struct hash<vector<bool, _Allocator> >; + +template <class _Allocator> +struct __has_storage_type<vector<bool, _Allocator> > +{ + static const bool value = true; +}; + +template <class _Allocator> +class _LIBCPP_VISIBLE vector<bool, _Allocator> + : private __vector_base_common<true> +{ +public: + typedef vector __self; + typedef bool value_type; + typedef _Allocator allocator_type; + typedef allocator_traits<allocator_type> __alloc_traits; + typedef typename __alloc_traits::size_type size_type; + typedef typename __alloc_traits::difference_type difference_type; + typedef __bit_iterator<vector, false> pointer; + typedef __bit_iterator<vector, true> 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;} +#else // _LIBCPP_DEBUG + typedef pointer iterator; + typedef const_pointer const_iterator; +#endif // _LIBCPP_DEBUG + typedef _VSTD::reverse_iterator<iterator> reverse_iterator; + typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; + +private: + typedef size_type __storage_type; + typedef typename __alloc_traits::template +#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES + rebind_alloc<__storage_type> +#else + rebind_alloc<__storage_type>::other +#endif + __storage_allocator; + typedef allocator_traits<__storage_allocator> __storage_traits; + typedef typename __storage_traits::pointer __storage_pointer; + typedef typename __storage_traits::const_pointer __const_storage_pointer; + + __storage_pointer __begin_; + size_type __size_; + __compressed_pair<size_type, __storage_allocator> __cap_alloc_; +public: + typedef __bit_reference<vector> reference; + typedef __bit_const_reference<vector> const_reference; +private: + _LIBCPP_INLINE_VISIBILITY + size_type& __cap() _NOEXCEPT + {return __cap_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY + const size_type& __cap() const _NOEXCEPT + {return __cap_alloc_.first();} + _LIBCPP_INLINE_VISIBILITY + __storage_allocator& __alloc() _NOEXCEPT + {return __cap_alloc_.second();} + _LIBCPP_INLINE_VISIBILITY + const __storage_allocator& __alloc() const _NOEXCEPT + {return __cap_alloc_.second();} + + static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); + + _LIBCPP_INLINE_VISIBILITY + static size_type __internal_cap_to_external(size_type __n) _NOEXCEPT + {return __n * __bits_per_word;} + _LIBCPP_INLINE_VISIBILITY + static size_type __external_cap_to_internal(size_type __n) _NOEXCEPT + {return (__n - 1) / __bits_per_word + 1;} + +public: + _LIBCPP_INLINE_VISIBILITY + vector() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY explicit vector(const allocator_type& __a); + ~vector(); + explicit vector(size_type __n); + vector(size_type __n, const value_type& __v); + vector(size_type __n, const value_type& __v, 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); + + vector(const vector& __v); + vector(const vector& __v, const allocator_type& __a); + vector& operator=(const vector& __v); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + vector(initializer_list<value_type> __il); + vector(initializer_list<value_type> __il, const allocator_type& __a); +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY + vector(vector&& __v) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); + vector(vector&& __v, const allocator_type& __a); + _LIBCPP_INLINE_VISIBILITY + vector& operator=(vector&& __v) + _NOEXCEPT_( + __alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value); +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + vector& operator=(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end()); return *this;} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + 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 value_type& __x); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + void assign(initializer_list<value_type> __il) + {assign(__il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY allocator_type get_allocator() const _NOEXCEPT + {return allocator_type(this->__alloc());} + + size_type max_size() const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + size_type capacity() const _NOEXCEPT + {return __internal_cap_to_external(__cap());} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT + {return __size_;} + _LIBCPP_INLINE_VISIBILITY + bool empty() const _NOEXCEPT + {return __size_ == 0;} + void reserve(size_type __n); + void shrink_to_fit() _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT + {return __make_iter(0);} + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT + {return __make_iter(0);} + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT + {return __make_iter(__size_);} + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT + {return __make_iter(__size_);} + + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rbegin() _NOEXCEPT + {return reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rbegin() const _NOEXCEPT + {return const_reverse_iterator(end());} + _LIBCPP_INLINE_VISIBILITY + reverse_iterator rend() _NOEXCEPT + {return reverse_iterator(begin());} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator rend() const _NOEXCEPT + {return const_reverse_iterator(begin());} + + _LIBCPP_INLINE_VISIBILITY + const_iterator cbegin() const _NOEXCEPT + {return __make_iter(0);} + _LIBCPP_INLINE_VISIBILITY + const_iterator cend() const _NOEXCEPT + {return __make_iter(__size_);} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crbegin() const _NOEXCEPT + {return rbegin();} + _LIBCPP_INLINE_VISIBILITY + const_reverse_iterator crend() const _NOEXCEPT + {return rend();} + + _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) {return __make_ref(__n);} + _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const {return __make_ref(__n);} + reference at(size_type __n); + const_reference at(size_type __n) const; + + _LIBCPP_INLINE_VISIBILITY reference front() {return __make_ref(0);} + _LIBCPP_INLINE_VISIBILITY const_reference front() const {return __make_ref(0);} + _LIBCPP_INLINE_VISIBILITY reference back() {return __make_ref(__size_ - 1);} + _LIBCPP_INLINE_VISIBILITY const_reference back() const {return __make_ref(__size_ - 1);} + + void push_back(const value_type& __x); + _LIBCPP_INLINE_VISIBILITY void pop_back() {--__size_;} + + iterator insert(const_iterator __position, const value_type& __x); + iterator insert(const_iterator __position, size_type __n, const value_type& __x); + 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); +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + _LIBCPP_INLINE_VISIBILITY + iterator insert(const_iterator __position, initializer_list<value_type> __il) + {return insert(__position, __il.begin(), __il.end());} +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + + _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __position); + iterator erase(const_iterator __first, const_iterator __last); + + _LIBCPP_INLINE_VISIBILITY + void clear() _NOEXCEPT {__size_ = 0;} + + void swap(vector&) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value); + + void resize(size_type __sz, value_type __x = false); + void flip() _NOEXCEPT; + + bool __invariants() const; + +private: + _LIBCPP_INLINE_VISIBILITY void __invalidate_all_iterators(); + void allocate(size_type __n); + void deallocate() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + static size_type __align(size_type __new_size) _NOEXCEPT + {return __new_size + (__bits_per_word-1) & ~(__bits_per_word-1);}; + _LIBCPP_INLINE_VISIBILITY size_type __recommend(size_type __new_size) const; + _LIBCPP_INLINE_VISIBILITY void __construct_at_end(size_type __n, bool __x); + template <class _ForwardIterator> + typename enable_if + < + __is_forward_iterator<_ForwardIterator>::value, + void + >::type + __construct_at_end(_ForwardIterator __first, _ForwardIterator __last); + void __append(size_type __n, const_reference __x); + _LIBCPP_INLINE_VISIBILITY + reference __make_ref(size_type __pos) _NOEXCEPT + {return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY + const_reference __make_ref(size_type __pos) const _NOEXCEPT + {return const_reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word);} +#ifdef _LIBCPP_DEBUG + _LIBCPP_INLINE_VISIBILITY iterator __make_iter(size_type __pos) + {return iterator(this, pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));} + _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_type __pos) const + {return const_iterator(this, const_pointer(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)));} + _LIBCPP_INLINE_VISIBILITY iterator __const_iterator_cast(const_iterator __p) + {return iterator(this, pointer(const_cast<__storage_pointer>(__p.base().__seg_), __p.base().__ctz_));} +#else // _LIBCPP_DEBUG + _LIBCPP_INLINE_VISIBILITY + iterator __make_iter(size_type __pos) _NOEXCEPT + {return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} + _LIBCPP_INLINE_VISIBILITY + const_iterator __make_iter(size_type __pos) const _NOEXCEPT + {return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word));} + _LIBCPP_INLINE_VISIBILITY + iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT + {return iterator(const_cast<__storage_pointer>(__p.__seg_), __p.__ctz_);} +#endif // _LIBCPP_DEBUG + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const vector& __v) + {__copy_assign_alloc(__v, integral_constant<bool, + __storage_traits::propagate_on_container_copy_assignment::value>());} + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const vector& __c, true_type) + { + if (__alloc() != __c.__alloc()) + deallocate(); + __alloc() = __c.__alloc(); + } + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const vector&, false_type) + {} + + void __move_assign(vector& __c, false_type); + void __move_assign(vector& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(vector& __c) + _NOEXCEPT_( + !__storage_traits::propagate_on_container_move_assignment::value || + is_nothrow_move_assignable<allocator_type>::value) + {__move_assign_alloc(__c, integral_constant<bool, + __storage_traits::propagate_on_container_move_assignment::value>());} + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(vector& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) + { + __alloc() = _VSTD::move(__c.__alloc()); + } + + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(vector&, false_type) + _NOEXCEPT + {} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y) + _NOEXCEPT_( + !__storage_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) + {__swap_alloc(__x, __y, integral_constant<bool, + __storage_traits::propagate_on_container_swap::value>());} + + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__storage_allocator& __x, __storage_allocator& __y, true_type) + _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) + { + using _VSTD::swap; + swap(__x, __y); + } + _LIBCPP_INLINE_VISIBILITY + static void __swap_alloc(__storage_allocator&, __storage_allocator&, false_type) + _NOEXCEPT + {} + + size_t __hash_code() const _NOEXCEPT; + + friend class __bit_reference<vector>; + friend class __bit_const_reference<vector>; + friend class __bit_iterator<vector, false>; + friend class __bit_iterator<vector, true>; + friend class __bit_array<vector>; + friend struct _LIBCPP_VISIBLE hash<vector>; +}; + +template <class _Allocator> +#ifndef _LIBCPP_DEBUG +_LIBCPP_INLINE_VISIBILITY inline +#endif +void +vector<bool, _Allocator>::__invalidate_all_iterators() +{ +#ifdef _LIBCPP_DEBUG + iterator::__remove_all(this); + const_iterator::__remove_all(this); +#endif // _LIBCPP_DEBUG +} + +// Allocate space for __n objects +// throws length_error if __n > max_size() +// throws (probably bad_alloc) if memory run out +// Precondition: __begin_ == __end_ == __cap() == 0 +// Precondition: __n > 0 +// Postcondition: capacity() == __n +// Postcondition: size() == 0 +template <class _Allocator> +void +vector<bool, _Allocator>::allocate(size_type __n) +{ + if (__n > max_size()) + this->__throw_length_error(); + __n = __external_cap_to_internal(__n); + this->__begin_ = __storage_traits::allocate(this->__alloc(), __n); + this->__size_ = 0; + this->__cap() = __n; +} + +template <class _Allocator> +void +vector<bool, _Allocator>::deallocate() _NOEXCEPT +{ + if (this->__begin_ != 0) + { + __storage_traits::deallocate(this->__alloc(), this->__begin_, __cap()); + __invalidate_all_iterators(); + this->__begin_ = 0; + this->__size_ = this->__cap() = 0; + } +} + +template <class _Allocator> +typename vector<bool, _Allocator>::size_type +vector<bool, _Allocator>::max_size() const _NOEXCEPT +{ + size_type __amax = __storage_traits::max_size(__alloc()); + size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always + if (__nmax / __bits_per_word <= __amax) + return __nmax; + return __internal_cap_to_external(__amax); +} + +// Precondition: __new_size > capacity() +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<bool, _Allocator>::size_type +vector<bool, _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 _VSTD::max(2*__cap, __align(__new_size)); +} + +// Default constructs __n objects starting at __end_ +// Precondition: __n > 0 +// Precondition: size() + __n <= capacity() +// Postcondition: size() == size() + __n +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) +{ + size_type __old_size = this->__size_; + this->__size_ += __n; + _VSTD::fill_n(__make_iter(__old_size), __n, __x); +} + +template <class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +vector<bool, _Allocator>::__construct_at_end(_ForwardIterator __first, _ForwardIterator __last) +{ + size_type __old_size = this->__size_; + this->__size_ += _VSTD::distance(__first, __last); + _VSTD::copy(__first, __last, __make_iter(__old_size)); +} + +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<bool, _Allocator>::vector() + _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ +} + +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<bool, _Allocator>::vector(const allocator_type& __a) + : __begin_(0), + __size_(0), + __cap_alloc_(0, static_cast<__storage_allocator>(__a)) +{ +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(size_type __n) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ + if (__n > 0) + { + allocate(__n); + __construct_at_end(__n, false); + } +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(size_type __n, const value_type& __x) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ + if (__n > 0) + { + allocate(__n); + __construct_at_end(__n, __x); + } +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) + : __begin_(0), + __size_(0), + __cap_alloc_(0, static_cast<__storage_allocator>(__a)) +{ + if (__n > 0) + { + allocate(__n); + __construct_at_end(__n, __x); + } +} + +template <class _Allocator> +template <class _InputIterator> +vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, + typename enable_if<__is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value>::type*) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __first != __last; ++__first) + push_back(*__first); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + if (__begin_ != 0) + __storage_traits::deallocate(__alloc(), __begin_, __cap()); + __invalidate_all_iterators(); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Allocator> +template <class _InputIterator> +vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a, + typename enable_if<__is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value>::type*) + : __begin_(0), + __size_(0), + __cap_alloc_(0, static_cast<__storage_allocator>(__a)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __first != __last; ++__first) + push_back(*__first); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + if (__begin_ != 0) + __storage_traits::deallocate(__alloc(), __begin_, __cap()); + __invalidate_all_iterators(); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template <class _Allocator> +template <class _ForwardIterator> +vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, + typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ + size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); + if (__n > 0) + { + allocate(__n); + __construct_at_end(__first, __last); + } +} + +template <class _Allocator> +template <class _ForwardIterator> +vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a, + typename enable_if<__is_forward_iterator<_ForwardIterator>::value>::type*) + : __begin_(0), + __size_(0), + __cap_alloc_(0, static_cast<__storage_allocator>(__a)) +{ + size_type __n = static_cast<size_type>(_VSTD::distance(__first, __last)); + if (__n > 0) + { + allocate(__n); + __construct_at_end(__first, __last); + } +} + +#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Allocator> +vector<bool, _Allocator>::vector(initializer_list<value_type> __il) + : __begin_(0), + __size_(0), + __cap_alloc_(0) +{ + size_type __n = static_cast<size_type>(__il.size()); + if (__n > 0) + { + allocate(__n); + __construct_at_end(__il.begin(), __il.end()); + } +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) + : __begin_(0), + __size_(0), + __cap_alloc_(0, static_cast<__storage_allocator>(__a)) +{ + size_type __n = static_cast<size_type>(__il.size()); + if (__n > 0) + { + allocate(__n); + __construct_at_end(__il.begin(), __il.end()); + } +} + +#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + +template <class _Allocator> +vector<bool, _Allocator>::~vector() +{ + if (__begin_ != 0) + __storage_traits::deallocate(__alloc(), __begin_, __cap()); +#ifdef _LIBCPP_DEBUG + __invalidate_all_iterators(); +#endif +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(const vector& __v) + : __begin_(0), + __size_(0), + __cap_alloc_(0, __storage_traits::select_on_container_copy_construction(__v.__alloc())) +{ + if (__v.size() > 0) + { + allocate(__v.size()); + __construct_at_end(__v.begin(), __v.end()); + } +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) + : __begin_(0), + __size_(0), + __cap_alloc_(0, __a) +{ + if (__v.size() > 0) + { + allocate(__v.size()); + __construct_at_end(__v.begin(), __v.end()); + } +} + +template <class _Allocator> +vector<bool, _Allocator>& +vector<bool, _Allocator>::operator=(const vector& __v) +{ + if (this != &__v) + { + __copy_assign_alloc(__v); + if (__v.__size_) + { + if (__v.__size_ > capacity()) + { + deallocate(); + allocate(__v.__size_); + } + _VSTD::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); + } + __size_ = __v.__size_; + } + return *this; +} + +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<bool, _Allocator>::vector(vector&& __v) + _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) + : __begin_(__v.__begin_), + __size_(__v.__size_), + __cap_alloc_(__v.__cap_alloc_) +{ + __v.__begin_ = 0; + __v.__size_ = 0; + __v.__cap() = 0; +} + +template <class _Allocator> +vector<bool, _Allocator>::vector(vector&& __v, const allocator_type& __a) + : __begin_(0), + __size_(0), + __cap_alloc_(0, __a) +{ + if (__a == allocator_type(__v.__alloc())) + { + this->__begin_ = __v.__begin_; + this->__size_ = __v.__size_; + this->__cap() = __v.__cap(); + __v.__begin_ = nullptr; + __v.__cap() = __v.__size_ = 0; + } + else if (__v.size() > 0) + { + allocate(__v.size()); + __construct_at_end(__v.begin(), __v.end()); + } +} + +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +vector<bool, _Allocator>& +vector<bool, _Allocator>::operator=(vector&& __v) + _NOEXCEPT_( + __alloc_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<allocator_type>::value) +{ + __move_assign(__v, integral_constant<bool, + __storage_traits::propagate_on_container_move_assignment::value>()); +} + +template <class _Allocator> +void +vector<bool, _Allocator>::__move_assign(vector& __c, false_type) +{ + if (__alloc() != __c.__alloc()) + assign(__c.begin(), __c.end()); + else + __move_assign(__c, true_type()); +} + +template <class _Allocator> +void +vector<bool, _Allocator>::__move_assign(vector& __c, true_type) + _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) +{ + deallocate(); + this->__begin_ = __c.__begin_; + this->__size_ = __c.__size_; + this->__cap() = __c.__cap(); + __move_assign_alloc(__c); + __c.__begin_ = nullptr; + __c.__cap() = __c.__size_ = 0; +} + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + +template <class _Allocator> +void +vector<bool, _Allocator>::assign(size_type __n, const value_type& __x) +{ + __size_ = 0; + if (__n > 0) + { + size_type __c = capacity(); + if (__n <= __c) + __size_ = __n; + else + { + vector __v(__alloc()); + __v.reserve(__recommend(__n)); + __v.__size_ = __n; + swap(__v); + } + _VSTD::fill_n(begin(), __n, __x); + } +} + +template <class _Allocator> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator<_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + void +>::type +vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) +{ + clear(); + for (; __first != __last; ++__first) + push_back(*__first); +} + +template <class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + void +>::type +vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) +{ + clear(); + difference_type __n = _VSTD::distance(__first, __last); + if (__n) + { + if (__n > capacity()) + { + deallocate(); + allocate(__n); + } + __construct_at_end(__first, __last); + } +} + +template <class _Allocator> +void +vector<bool, _Allocator>::reserve(size_type __n) +{ + if (__n > capacity()) + { + vector __v(this->__alloc()); + __v.allocate(__n); + __v.__construct_at_end(this->begin(), this->end()); + swap(__v); + __invalidate_all_iterators(); + } +} + +template <class _Allocator> +void +vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT +{ + if (__external_cap_to_internal(size()) > __cap()) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + vector(*this, allocator_type(__alloc())).swap(*this); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + } +} + +template <class _Allocator> +typename vector<bool, _Allocator>::reference +vector<bool, _Allocator>::at(size_type __n) +{ + if (__n >= size()) + this->__throw_out_of_range(); + return (*this)[__n]; +} + +template <class _Allocator> +typename vector<bool, _Allocator>::const_reference +vector<bool, _Allocator>::at(size_type __n) const +{ + if (__n >= size()) + this->__throw_out_of_range(); + return (*this)[__n]; +} + +template <class _Allocator> +void +vector<bool, _Allocator>::push_back(const value_type& __x) +{ + if (this->__size_ == this->capacity()) + reserve(__recommend(this->__size_ + 1)); + ++this->__size_; + back() = __x; +} + +template <class _Allocator> +typename vector<bool, _Allocator>::iterator +vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) +{ + iterator __r; + if (size() < capacity()) + { + const_iterator __old_end = end(); + ++__size_; + _VSTD::copy_backward(__position, __old_end, end()); + __r = __const_iterator_cast(__position); + } + else + { + vector __v(__alloc()); + __v.reserve(__recommend(__size_ + 1)); + __v.__size_ = __size_ + 1; + __r = _VSTD::copy(cbegin(), __position, __v.begin()); + _VSTD::copy_backward(__position, cend(), __v.end()); + swap(__v); + } + *__r = __x; + return __r; +} + +template <class _Allocator> +typename vector<bool, _Allocator>::iterator +vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) +{ + iterator __r; + size_type __c = capacity(); + if (__n <= __c && size() <= __c - __n) + { + const_iterator __old_end = end(); + __size_ += __n; + _VSTD::copy_backward(__position, __old_end, end()); + __r = __const_iterator_cast(__position); + } + else + { + vector __v(__alloc()); + __v.reserve(__recommend(__size_ + __n)); + __v.__size_ = __size_ + __n; + __r = _VSTD::copy(cbegin(), __position, __v.begin()); + _VSTD::copy_backward(__position, cend(), __v.end()); + swap(__v); + } + _VSTD::fill_n(__r, __n, __x); + return __r; +} + +template <class _Allocator> +template <class _InputIterator> +typename enable_if +< + __is_input_iterator <_InputIterator>::value && + !__is_forward_iterator<_InputIterator>::value, + typename vector<bool, _Allocator>::iterator +>::type +vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) +{ + difference_type __off = __position - begin(); + iterator __p = __const_iterator_cast(__position); + iterator __old_end = end(); + for (; size() != capacity() && __first != __last; ++__first) + { + ++this->__size_; + back() = *__first; + } + vector __v(__alloc()); + if (__first != __last) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + __v.assign(__first, __last); + difference_type __old_size = static_cast<difference_type>(__old_end - begin()); + difference_type __old_p = __p - begin(); + reserve(__recommend(size() + __v.size())); + __p = begin() + __old_p; + __old_end = begin() + __old_size; +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + erase(__old_end, end()); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + __p = _VSTD::rotate(__p, __old_end, end()); + insert(__p, __v.begin(), __v.end()); + return begin() + __off; +} + +template <class _Allocator> +template <class _ForwardIterator> +typename enable_if +< + __is_forward_iterator<_ForwardIterator>::value, + typename vector<bool, _Allocator>::iterator +>::type +vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) +{ + difference_type __n = _VSTD::distance(__first, __last); + iterator __r; + size_type __c = capacity(); + if (__n <= __c && size() <= __c - __n) + { + const_iterator __old_end = end(); + __size_ += __n; + _VSTD::copy_backward(__position, __old_end, end()); + __r = __const_iterator_cast(__position); + } + else + { + vector __v(__alloc()); + __v.reserve(__recommend(__size_ + __n)); + __v.__size_ = __size_ + __n; + __r = _VSTD::copy(cbegin(), __position, __v.begin()); + _VSTD::copy_backward(__position, cend(), __v.end()); + swap(__v); + } + _VSTD::copy(__first, __last, __r); + return __r; +} + +template <class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +typename vector<bool, _Allocator>::iterator +vector<bool, _Allocator>::erase(const_iterator __position) +{ + iterator __r = __const_iterator_cast(__position); + _VSTD::copy(__position + 1, this->cend(), __r); + --__size_; + return __r; +} + +template <class _Allocator> +typename vector<bool, _Allocator>::iterator +vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) +{ + iterator __r = __const_iterator_cast(__first); + difference_type __d = __last - __first; + _VSTD::copy(__last, this->cend(), __r); + __size_ -= __d; + return __r; +} + +template <class _Allocator> +void +vector<bool, _Allocator>::swap(vector& __x) + _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || + __is_nothrow_swappable<allocator_type>::value) +{ + _VSTD::swap(this->__begin_, __x.__begin_); + _VSTD::swap(this->__size_, __x.__size_); + _VSTD::swap(this->__cap(), __x.__cap()); + __swap_alloc(this->__alloc(), __x.__alloc()); +#ifdef _LIBCPP_DEBUG + iterator::swap(this, &__x); + const_iterator::swap(this, &__x); +#endif // _LIBCPP_DEBUG +} + +template <class _Allocator> +void +vector<bool, _Allocator>::resize(size_type __sz, value_type __x) +{ + size_type __cs = size(); + if (__cs < __sz) + { + iterator __r; + size_type __c = capacity(); + size_type __n = __sz - __cs; + if (__n <= __c && __cs <= __c - __n) + { + __r = end(); + __size_ += __n; + } + else + { + vector __v(__alloc()); + __v.reserve(__recommend(__size_ + __n)); + __v.__size_ = __size_ + __n; + __r = _VSTD::copy(cbegin(), cend(), __v.begin()); + swap(__v); + } + _VSTD::fill_n(__r, __n, __x); + } + else + __size_ = __sz; +} + +template <class _Allocator> +void +vector<bool, _Allocator>::flip() _NOEXCEPT +{ + // do middle whole words + size_type __n = __size_; + __storage_pointer __p = __begin_; + for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) + *__p = ~*__p; + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__p & __m; + *__p &= ~__m; + *__p |= ~__b & __m; + } +} + +template <class _Allocator> +bool +vector<bool, _Allocator>::__invariants() const +{ + if (this->__begin_ == 0) + { + if (this->__size_ != 0 || this->__cap() != 0) + return false; + } + else + { + if (this->__cap() == 0) + return false; + if (this->__size_ > this->capacity()) + return false; + } + return true; +} + +template <class _Allocator> +size_t +vector<bool, _Allocator>::__hash_code() const _NOEXCEPT +{ + size_t __h = 0; + // do middle whole words + size_type __n = __size_; + __storage_pointer __p = __begin_; + for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) + __h ^= *__p; + // do last partial word + if (__n > 0) + { + const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __h ^= *__p & __m; + } + return __h; +} + +template <class _Allocator> +struct _LIBCPP_VISIBLE hash<vector<bool, _Allocator> > + : public unary_function<vector<bool, _Allocator>, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT + {return __vec.__hash_code();} +}; + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator==(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + const typename vector<_Tp, _Allocator>::size_type __sz = __x.size(); + return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator!=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + return !(__x == __y); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator< (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator> (const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + return __y < __x; +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator>=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + return !(__x < __y); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +bool +operator<=(const vector<_Tp, _Allocator>& __x, const vector<_Tp, _Allocator>& __y) +{ + return !(__y < __x); +} + +template <class _Tp, class _Allocator> +_LIBCPP_INLINE_VISIBILITY inline +void +swap(vector<_Tp, _Allocator>& __x, vector<_Tp, _Allocator>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_VECTOR diff --git a/contrib/libc++/src/algorithm.cpp b/contrib/libc++/src/algorithm.cpp new file mode 100644 index 0000000..6d5cf7c0 --- /dev/null +++ b/contrib/libc++/src/algorithm.cpp @@ -0,0 +1,83 @@ +//===----------------------- algorithm.cpp --------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "algorithm" +#include "random" +#include "mutex" + +_LIBCPP_BEGIN_NAMESPACE_STD + +template void __sort<__less<char>&, char*>(char*, char*, __less<char>&); +template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); +template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); +template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); +template void __sort<__less<short>&, short*>(short*, short*, __less<short>&); +template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); +template void __sort<__less<int>&, int*>(int*, int*, __less<int>&); +template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); +template void __sort<__less<long>&, long*>(long*, long*, __less<long>&); +template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); +template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); +template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); +template void __sort<__less<float>&, float*>(float*, float*, __less<float>&); +template void __sort<__less<double>&, double*>(double*, double*, __less<double>&); +template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); + +template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&); +template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); +template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); +template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); +template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&); +template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); +template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&); +template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); +template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&); +template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); +template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); +template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); +template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&); +template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&); +template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); + +template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&); + +static pthread_mutex_t __rs_mut = PTHREAD_MUTEX_INITIALIZER; +unsigned __rs_default::__c_ = 0; + +__rs_default::__rs_default() +{ + pthread_mutex_lock(&__rs_mut); + __c_ = 1; +} + +__rs_default::__rs_default(const __rs_default&) +{ + ++__c_; +} + +__rs_default::~__rs_default() +{ + if (--__c_ == 0) + pthread_mutex_unlock(&__rs_mut); +} + +__rs_default::result_type +__rs_default::operator()() +{ + static mt19937 __rs_g; + return __rs_g(); +} + +__rs_default +__rs_get() +{ + return __rs_default(); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/bind.cpp b/contrib/libc++/src/bind.cpp new file mode 100644 index 0000000..cab0b7c --- /dev/null +++ b/contrib/libc++/src/bind.cpp @@ -0,0 +1,30 @@ +//===-------------------------- bind.cpp ----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "functional" + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace placeholders +{ + +__ph<1> _1; +__ph<2> _2; +__ph<3> _3; +__ph<4> _4; +__ph<5> _5; +__ph<6> _6; +__ph<7> _7; +__ph<8> _8; +__ph<9> _9; +__ph<10> _10; + +} // placeholders + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/chrono.cpp b/contrib/libc++/src/chrono.cpp new file mode 100644 index 0000000..73c83ee --- /dev/null +++ b/contrib/libc++/src/chrono.cpp @@ -0,0 +1,128 @@ +//===------------------------- chrono.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "chrono" +#include <sys/time.h> //for gettimeofday and timeval +#if __APPLE__ +#include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t +#else /* !__APPLE__ */ +#include <cerrno> // errno +#include <system_error> // __throw_system_error +#include <time.h> // clock_gettime, CLOCK_MONOTONIC +#endif // __APPLE__ + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +// system_clock + +system_clock::time_point +system_clock::now() _NOEXCEPT +{ + timeval tv; + gettimeofday(&tv, 0); + return time_point(seconds(tv.tv_sec) + microseconds(tv.tv_usec)); +} + +time_t +system_clock::to_time_t(const time_point& t) _NOEXCEPT +{ + return time_t(duration_cast<seconds>(t.time_since_epoch()).count()); +} + +system_clock::time_point +system_clock::from_time_t(time_t t) _NOEXCEPT +{ + return system_clock::time_point(seconds(t)); +} + +// steady_clock + +#if __APPLE__ +// mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of +// nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom +// are run time constants supplied by the OS. This clock has no relationship +// to the Gregorian calendar. It's main use is as a high resolution timer. + +// MachInfo.numer / MachInfo.denom is often 1 on the latest equipment. Specialize +// for that case as an optimization. + +#pragma GCC visibility push(hidden) + +static +steady_clock::rep +steady_simplified() +{ + return static_cast<steady_clock::rep>(mach_absolute_time()); +} + +static +double +compute_steady_factor() +{ + mach_timebase_info_data_t MachInfo; + mach_timebase_info(&MachInfo); + return static_cast<double>(MachInfo.numer) / MachInfo.denom; +} + +static +steady_clock::rep +steady_full() +{ + static const double factor = compute_steady_factor(); + return static_cast<steady_clock::rep>(mach_absolute_time() * factor); +} + +typedef steady_clock::rep (*FP)(); + +static +FP +init_steady_clock() +{ + mach_timebase_info_data_t MachInfo; + mach_timebase_info(&MachInfo); + if (MachInfo.numer == MachInfo.denom) + return &steady_simplified; + return &steady_full; +} + +#pragma GCC visibility pop + +steady_clock::time_point +steady_clock::now() _NOEXCEPT +{ + static FP fp = init_steady_clock(); + return time_point(duration(fp())); +} + +#else // __APPLE__ +// FIXME: We assume that clock_gettime(CLOCK_MONOTONIC) works on +// non-apple systems. Instead, we should check _POSIX_TIMERS and +// _POSIX_MONOTONIC_CLOCK and fall back to something else if those +// don't exist. + +// Warning: If this is not truly steady, then it is non-conforming. It is +// better for it to not exist and have the rest of libc++ use system_clock +// instead. + +steady_clock::time_point +steady_clock::now() _NOEXCEPT +{ + struct timespec tp; + if (0 != clock_gettime(CLOCK_MONOTONIC, &tp)) + __throw_system_error(errno, "clock_gettime(CLOCK_MONOTONIC) failed"); + return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec)); +} +#endif // __APPLE__ + +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/condition_variable.cpp b/contrib/libc++/src/condition_variable.cpp new file mode 100644 index 0000000..b53b836 --- /dev/null +++ b/contrib/libc++/src/condition_variable.cpp @@ -0,0 +1,69 @@ +//===-------------------- condition_variable.cpp --------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "condition_variable" +#include "thread" +#include "system_error" +#include "cassert" + +_LIBCPP_BEGIN_NAMESPACE_STD + +condition_variable::~condition_variable() +{ + pthread_cond_destroy(&__cv_); +} + +void +condition_variable::notify_one() +{ + pthread_cond_signal(&__cv_); +} + +void +condition_variable::notify_all() +{ + pthread_cond_broadcast(&__cv_); +} + +void +condition_variable::wait(unique_lock<mutex>& lk) +{ + if (!lk.owns_lock()) + __throw_system_error(EPERM, + "condition_variable::wait: mutex not locked"); + int ec = pthread_cond_wait(&__cv_, lk.mutex()->native_handle()); + if (ec) + __throw_system_error(ec, "condition_variable wait failed"); +} + +void +condition_variable::__do_timed_wait(unique_lock<mutex>& lk, + chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp) +{ + using namespace chrono; + if (!lk.owns_lock()) + __throw_system_error(EPERM, + "condition_variable::timed wait: mutex not locked"); + nanoseconds d = tp.time_since_epoch(); + timespec ts; + seconds s = duration_cast<seconds>(d); + ts.tv_sec = static_cast<decltype(ts.tv_sec)>(s.count()); + ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((d - s).count()); + int ec = pthread_cond_timedwait(&__cv_, lk.mutex()->native_handle(), &ts); + if (ec != 0 && ec != ETIMEDOUT) + __throw_system_error(ec, "condition_variable timed_wait failed"); +} + +void +notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk) +{ + __thread_local_data()->notify_all_at_thread_exit(&cond, lk.release()); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/debug.cpp b/contrib/libc++/src/debug.cpp new file mode 100644 index 0000000..406b247 --- /dev/null +++ b/contrib/libc++/src/debug.cpp @@ -0,0 +1,484 @@ +//===-------------------------- debug.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#define _LIBCPP_DEBUG2 1 +#include "__config" +#include "__debug" +#include "functional" +#include "algorithm" +#include "__hash_table" +#include "mutex" + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_VISIBLE +__libcpp_db* +__get_db() +{ + static __libcpp_db db; + return &db; +}; + +_LIBCPP_VISIBLE +const __libcpp_db* +__get_const_db() +{ + return __get_db(); +} + +namespace +{ + +typedef mutex mutex_type; +typedef lock_guard<mutex_type> WLock; +typedef lock_guard<mutex_type> RLock; + +mutex_type& +mut() +{ + static mutex_type m; + return m; +} + +} // unnamed namespace + +__i_node::~__i_node() +{ + if (__next_) + { + __next_->~__i_node(); + free(__next_); + } +} + +__c_node::~__c_node() +{ + free(beg_); + if (__next_) + { + __next_->~__c_node(); + free(__next_); + } +} + +__libcpp_db::__libcpp_db() + : __cbeg_(nullptr), + __cend_(nullptr), + __csz_(0), + __ibeg_(nullptr), + __iend_(nullptr), + __isz_(0) +{ +} + +__libcpp_db::~__libcpp_db() +{ + if (__cbeg_) + { + for (__c_node** p = __cbeg_; p != __cend_; ++p) + { + if (*p != nullptr) + { + (*p)->~__c_node(); + free(*p); + } + } + free(__cbeg_); + } + if (__ibeg_) + { + for (__i_node** p = __ibeg_; p != __iend_; ++p) + { + if (*p != nullptr) + { + (*p)->~__i_node(); + free(*p); + } + } + free(__ibeg_); + } +} + +void* +__libcpp_db::__find_c_from_i(void* __i) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + _LIBCPP_ASSERT(i != nullptr, "iterator constructed in translation unit with debug mode not enabled." + " #define _LIBCPP_DEBUG2 1 for that translation unit."); + return i->__c_ != nullptr ? i->__c_->__c_ : nullptr; +} + +void +__libcpp_db::__insert_ic(void* __i, const void* __c) +{ + WLock _(mut()); + __i_node* i = __insert_iterator(__i); + const char* errmsg = + "Container constructed in a translation unit with debug mode disabled." + " But it is being used in a translation unit with debug mode enabled." + " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1"; + _LIBCPP_ASSERT(__cbeg_ != __cend_, errmsg); + size_t hc = hash<const void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* c = __cbeg_[hc]; + _LIBCPP_ASSERT(c != nullptr, errmsg); + while (c->__c_ != __c) + { + c = c->__next_; + _LIBCPP_ASSERT(c != nullptr, errmsg); + } + c->__add(i); + i->__c_ = c; +} + +__c_node* +__libcpp_db::__insert_c(void* __c) +{ + WLock _(mut()); + if (__csz_ + 1 > static_cast<size_t>(__cend_ - __cbeg_)) + { + size_t nc = __next_prime(2*static_cast<size_t>(__cend_ - __cbeg_) + 1); + __c_node** cbeg = (__c_node**)calloc(nc, sizeof(void*)); + if (cbeg == nullptr) + throw bad_alloc(); + for (__c_node** p = __cbeg_; p != __cend_; ++p) + { + __c_node* q = *p; + while (q != nullptr) + { + size_t h = hash<void*>()(q->__c_) % nc; + __c_node* r = q->__next_; + q->__next_ = cbeg[h]; + cbeg[h] = q; + q = r; + } + } + free(__cbeg_); + __cbeg_ = cbeg; + __cend_ = __cbeg_ + nc; + } + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + __c_node* r = __cbeg_[hc] = (__c_node*)malloc(sizeof(__c_node)); + if (__cbeg_[hc] == nullptr) + throw bad_alloc(); + r->__c_ = __c; + r->__next_ = p; + ++__csz_; + return r; +} + +void +__libcpp_db::__erase_i(void* __i) +{ + WLock _(mut()); + if (__ibeg_ != __iend_) + { + size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); + __i_node* p = __ibeg_[hi]; + if (p != nullptr) + { + __i_node* q = nullptr; + while (p->__i_ != __i) + { + q = p; + p = p->__next_; + if (p == nullptr) + return; + } + if (q == nullptr) + __ibeg_[hi] = p->__next_; + else + q->__next_ = p->__next_; + __c_node* c = p->__c_; + free(p); + --__isz_; + if (c != nullptr) + c->__remove(p); + } + } +} + +void +__libcpp_db::__invalidate_all(void* __c) +{ + WLock _(mut()); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __invalidate_all A"); + while (p->__c_ != __c) + { + p = p->__next_; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __invalidate_all B"); + } + while (p->end_ != p->beg_) + { + --p->end_; + (*p->end_)->__c_ = nullptr; + } +} + +__c_node* +__libcpp_db::__find_c_and_lock(void* __c) const +{ + mut().lock(); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c_and_lock A"); + while (p->__c_ != __c) + { + p = p->__next_; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c_and_lock B"); + } + return p; +} + +__c_node* +__libcpp_db::__find_c(void* __c) const +{ + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c A"); + while (p->__c_ != __c) + { + p = p->__next_; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __find_c B"); + } + return p; +} + +void +__libcpp_db::unlock() const +{ + mut().unlock(); +} + +void +__libcpp_db::__erase_c(void* __c) +{ + WLock _(mut()); + size_t hc = hash<void*>()(__c) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p = __cbeg_[hc]; + __c_node* q = nullptr; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c A"); + while (p->__c_ != __c) + { + q = p; + p = p->__next_; + _LIBCPP_ASSERT(p != nullptr, "debug mode internal logic error __erase_c B"); + } + if (q == nullptr) + __cbeg_[hc] = p->__next_; + else + q->__next_ = p->__next_; + while (p->end_ != p->beg_) + { + --p->end_; + (*p->end_)->__c_ = nullptr; + } + free(p->beg_); + free(p); + --__csz_; +} + +void +__libcpp_db::__iterator_copy(void* __i, const void* __i0) +{ + WLock _(mut()); + __i_node* i = __find_iterator(__i); + __i_node* i0 = __find_iterator(__i0); + __c_node* c0 = i0 != nullptr ? i0->__c_ : nullptr; + if (i == nullptr && c0 != nullptr) + i = __insert_iterator(__i); + __c_node* c = i != nullptr ? i->__c_ : nullptr; + if (c != c0) + { + if (c != nullptr) + c->__remove(i); + if (i != nullptr) + { + i->__c_ = nullptr; + if (c0 != nullptr) + { + i->__c_ = c0; + i->__c_->__add(i); + } + } + } +} + +bool +__libcpp_db::__dereferenceable(const void* __i) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + return i != nullptr && i->__c_ != nullptr && i->__c_->__dereferenceable(__i); +} + +bool +__libcpp_db::__decrementable(const void* __i) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + return i != nullptr && i->__c_ != nullptr && i->__c_->__decrementable(__i); +} + +bool +__libcpp_db::__addable(const void* __i, ptrdiff_t __n) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + return i != nullptr && i->__c_ != nullptr && i->__c_->__addable(__i, __n); +} + +bool +__libcpp_db::__subscriptable(const void* __i, ptrdiff_t __n) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + return i != nullptr && i->__c_ != nullptr && i->__c_->__subscriptable(__i, __n); +} + +bool +__libcpp_db::__comparable(const void* __i, const void* __j) const +{ + RLock _(mut()); + __i_node* i = __find_iterator(__i); + __i_node* j = __find_iterator(__j); + __c_node* ci = i != nullptr ? i->__c_ : nullptr; + __c_node* cj = j != nullptr ? j->__c_ : nullptr; + return ci != nullptr && ci == cj; +} + +void +__libcpp_db::swap(void* c1, void* c2) +{ + WLock _(mut()); + size_t hc = hash<void*>()(c1) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p1 = __cbeg_[hc]; + _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap A"); + while (p1->__c_ != c1) + { + p1 = p1->__next_; + _LIBCPP_ASSERT(p1 != nullptr, "debug mode internal logic error swap B"); + } + hc = hash<void*>()(c2) % static_cast<size_t>(__cend_ - __cbeg_); + __c_node* p2 = __cbeg_[hc]; + _LIBCPP_ASSERT(p2 != nullptr, "debug mode internal logic error swap C"); + while (p2->__c_ != c2) + { + p2 = p2->__next_; + _LIBCPP_ASSERT(p2 != nullptr, "debug mode internal logic error swap D"); + } + std::swap(p1->beg_, p2->beg_); + std::swap(p1->end_, p2->end_); + std::swap(p1->cap_, p2->cap_); + for (__i_node** p = p1->beg_; p != p1->end_; ++p) + (*p)->__c_ = p1; + for (__i_node** p = p2->beg_; p != p2->end_; ++p) + (*p)->__c_ = p2; +} + +void +__libcpp_db::__insert_i(void* __i) +{ + WLock _(mut()); + __insert_iterator(__i); +} + +void +__c_node::__add(__i_node* i) +{ + if (end_ == cap_) + { + size_t nc = 2*static_cast<size_t>(cap_ - beg_); + if (nc == 0) + nc = 1; + __i_node** beg = (__i_node**)malloc(nc * sizeof(__i_node*)); + if (beg == nullptr) + throw bad_alloc(); + if (nc > 1) + memcpy(beg, beg_, nc/2*sizeof(__i_node*)); + free(beg_); + beg_ = beg; + end_ = beg_ + nc/2; + cap_ = beg_ + nc; + } + *end_++ = i; +} + +// private api + +_LIBCPP_HIDDEN +__i_node* +__libcpp_db::__insert_iterator(void* __i) +{ + if (__isz_ + 1 > static_cast<size_t>(__iend_ - __ibeg_)) + { + size_t nc = __next_prime(2*static_cast<size_t>(__iend_ - __ibeg_) + 1); + __i_node** ibeg = (__i_node**)calloc(nc, sizeof(void*)); + if (ibeg == nullptr) + throw bad_alloc(); + for (__i_node** p = __ibeg_; p != __iend_; ++p) + { + __i_node* q = *p; + while (q != nullptr) + { + size_t h = hash<void*>()(q->__i_) % nc; + __i_node* r = q->__next_; + q->__next_ = ibeg[h]; + ibeg[h] = q; + q = r; + } + } + free(__ibeg_); + __ibeg_ = ibeg; + __iend_ = __ibeg_ + nc; + } + size_t hi = hash<void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); + __i_node* p = __ibeg_[hi]; + __i_node* r = __ibeg_[hi] = (__i_node*)malloc(sizeof(__i_node)); + if (r == nullptr) + throw bad_alloc(); + ::new(r) __i_node(__i, p, nullptr); + ++__isz_; + return r; +} + +_LIBCPP_HIDDEN +__i_node* +__libcpp_db::__find_iterator(const void* __i) const +{ + __i_node* r = nullptr; + if (__ibeg_ != __iend_) + { + size_t h = hash<const void*>()(__i) % static_cast<size_t>(__iend_ - __ibeg_); + for (__i_node* nd = __ibeg_[h]; nd != nullptr; nd = nd->__next_) + { + if (nd->__i_ == __i) + { + r = nd; + break; + } + } + } + return r; +} + +_LIBCPP_HIDDEN +void +__c_node::__remove(__i_node* p) +{ + __i_node** r = find(beg_, end_, p); + _LIBCPP_ASSERT(r != end_, "debug mode internal logic error __c_node::__remove"); + if (--end_ != r) + memmove(r, r+1, static_cast<size_t>(end_ - r)*sizeof(__i_node*)); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/exception.cpp b/contrib/libc++/src/exception.cpp new file mode 100644 index 0000000..6b5e698 --- /dev/null +++ b/contrib/libc++/src/exception.cpp @@ -0,0 +1,217 @@ +//===------------------------ exception.cpp -------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// +#include <stdlib.h> + +#include "exception" + +#if __APPLE__ + #include <cxxabi.h> + + using namespace __cxxabiv1; + #define HAVE_DEPENDENT_EH_ABI 1 + #ifndef _LIBCPPABI_VERSION + using namespace __cxxabiapple; + // On Darwin, there are two STL shared libraries and a lower level ABI + // shared libray. The globals holding the current terminate handler and + // current unexpected handler are in the ABI library. + #define __terminate_handler __cxxabiapple::__cxa_terminate_handler + #define __unexpected_handler __cxxabiapple::__cxa_unexpected_handler + #endif // _LIBCPPABI_VERSION +#elif defined(LIBCXXRT) + #include <cxxabi.h> + using namespace __cxxabiv1; + #define HAVE_DEPENDENT_EH_ABI 1 +#else // __APPLE__ + static std::terminate_handler __terminate_handler; + static std::unexpected_handler __unexpected_handler; +#endif // __APPLE__ + +namespace std +{ + +#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) + +// libcxxrt provides implementations of these functions itself. +unexpected_handler +set_unexpected(unexpected_handler func) _NOEXCEPT +{ + return __sync_lock_test_and_set(&__unexpected_handler, func); +} + +unexpected_handler +get_unexpected() _NOEXCEPT +{ + return __sync_fetch_and_add(&__unexpected_handler, (unexpected_handler)0); +} + +_ATTRIBUTE(noreturn) +void +unexpected() +{ + (*get_unexpected())(); + // unexpected handler should not return + terminate(); +} + +terminate_handler +set_terminate(terminate_handler func) _NOEXCEPT +{ + return __sync_lock_test_and_set(&__terminate_handler, func); +} + +terminate_handler +get_terminate() _NOEXCEPT +{ + return __sync_fetch_and_add(&__terminate_handler, (terminate_handler)0); +} + +_ATTRIBUTE(noreturn) +void +terminate() _NOEXCEPT +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + (*get_terminate())(); + // handler should not return + ::abort (); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + // handler should not throw exception + ::abort (); + } +#endif // _LIBCPP_NO_EXCEPTIONS +} +#endif // !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) + +#ifndef LIBCXXRT +bool uncaught_exception() _NOEXCEPT +{ +#if __APPLE__ + // on Darwin, there is a helper function so __cxa_get_globals is private + return __cxa_uncaught_exception(); +#elif LIBCXXRT + __cxa_eh_globals * globals = __cxa_get_globals(); + return (globals->uncaughtExceptions != 0); +#else // __APPLE__ + #warning uncaught_exception not yet implemented + ::abort(); +#endif // __APPLE__ +} + +#ifndef _LIBCPPABI_VERSION + +exception::~exception() _NOEXCEPT +{ +} + +bad_exception::~bad_exception() _NOEXCEPT +{ +} + +const char* exception::what() const _NOEXCEPT +{ + return "std::exception"; +} + +const char* bad_exception::what() const _NOEXCEPT +{ + return "std::bad_exception"; +} + +#endif // _LIBCPPABI_VERSION +#endif //LIBCXXRT + +exception_ptr::~exception_ptr() _NOEXCEPT +{ +#if HAVE_DEPENDENT_EH_ABI + __cxa_decrement_exception_refcount(__ptr_); +#else + #warning exception_ptr not yet implemented + ::abort(); +#endif // __APPLE__ +} + +exception_ptr::exception_ptr(const exception_ptr& other) _NOEXCEPT + : __ptr_(other.__ptr_) +{ +#if HAVE_DEPENDENT_EH_ABI + __cxa_increment_exception_refcount(__ptr_); +#else + #warning exception_ptr not yet implemented + ::abort(); +#endif // __APPLE__ +} + +exception_ptr& exception_ptr::operator=(const exception_ptr& other) _NOEXCEPT +{ +#if HAVE_DEPENDENT_EH_ABI + if (__ptr_ != other.__ptr_) + { + __cxa_increment_exception_refcount(other.__ptr_); + __cxa_decrement_exception_refcount(__ptr_); + __ptr_ = other.__ptr_; + } + return *this; +#else // __APPLE__ + #warning exception_ptr not yet implemented + ::abort(); +#endif // __APPLE__ +} + +nested_exception::nested_exception() _NOEXCEPT + : __ptr_(current_exception()) +{ +} + +nested_exception::~nested_exception() _NOEXCEPT +{ +} + +_ATTRIBUTE(noreturn) +void +nested_exception::rethrow_nested() const +{ + if (__ptr_ == nullptr) + terminate(); + rethrow_exception(__ptr_); +} + + +exception_ptr current_exception() _NOEXCEPT +{ +#if HAVE_DEPENDENT_EH_ABI + // be nicer if there was a constructor that took a ptr, then + // this whole function would be just: + // return exception_ptr(__cxa_current_primary_exception()); + exception_ptr ptr; + ptr.__ptr_ = __cxa_current_primary_exception(); + return ptr; +#else // __APPLE__ + #warning exception_ptr not yet implemented + ::abort(); +#endif // __APPLE__ +} + +_ATTRIBUTE(noreturn) +void rethrow_exception(exception_ptr p) +{ +#if HAVE_DEPENDENT_EH_ABI + __cxa_rethrow_primary_exception(p.__ptr_); + // if p.__ptr_ is NULL, above returns so we terminate + terminate(); +#else // __APPLE__ + #warning exception_ptr not yet implemented + ::abort(); +#endif // __APPLE__ +} +} // std diff --git a/contrib/libc++/src/future.cpp b/contrib/libc++/src/future.cpp new file mode 100644 index 0000000..2935711 --- /dev/null +++ b/contrib/libc++/src/future.cpp @@ -0,0 +1,285 @@ +//===------------------------- future.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "future" +#include "string" + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_HIDDEN __future_error_category + : public __do_message +{ +public: + virtual const char* name() const _NOEXCEPT; + virtual string message(int ev) const; +}; + +const char* +__future_error_category::name() const _NOEXCEPT +{ + return "future"; +} + +string +__future_error_category::message(int ev) const +{ + switch (static_cast<future_errc>(ev)) + { + case future_errc::broken_promise: + return string("The associated promise has been destructed prior " + "to the associated state becoming ready."); + case future_errc::future_already_retrieved: + return string("The future has already been retrieved from " + "the promise or packaged_task."); + case future_errc::promise_already_satisfied: + return string("The state of the promise has already been set."); + case future_errc::no_state: + return string("Operation not permitted on an object without " + "an associated state."); + } + return string("unspecified future_errc value\n"); +} + +const error_category& +future_category() +{ + static __future_error_category __f; + return __f; +} + +future_error::future_error(error_code __ec) + : logic_error(__ec.message()), + __ec_(__ec) +{ +} + +future_error::~future_error() _NOEXCEPT +{ +} + +void +__assoc_sub_state::__on_zero_shared() _NOEXCEPT +{ + delete this; +} + +void +__assoc_sub_state::set_value() +{ + unique_lock<mutex> __lk(__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __state_ |= __constructed | ready; + __lk.unlock(); + __cv_.notify_all(); +} + +void +__assoc_sub_state::set_value_at_thread_exit() +{ + unique_lock<mutex> __lk(__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __state_ |= __constructed; + __thread_local_data()->__make_ready_at_thread_exit(this); + __lk.unlock(); +} + +void +__assoc_sub_state::set_exception(exception_ptr __p) +{ + unique_lock<mutex> __lk(__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __exception_ = __p; + __state_ |= ready; + __lk.unlock(); + __cv_.notify_all(); +} + +void +__assoc_sub_state::set_exception_at_thread_exit(exception_ptr __p) +{ + unique_lock<mutex> __lk(__mut_); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__has_value()) + throw future_error(make_error_code(future_errc::promise_already_satisfied)); +#endif + __exception_ = __p; + __thread_local_data()->__make_ready_at_thread_exit(this); + __lk.unlock(); +} + +void +__assoc_sub_state::__make_ready() +{ + unique_lock<mutex> __lk(__mut_); + __state_ |= ready; + __lk.unlock(); + __cv_.notify_all(); +} + +void +__assoc_sub_state::copy() +{ + unique_lock<mutex> __lk(__mut_); + __sub_wait(__lk); + if (__exception_ != nullptr) + rethrow_exception(__exception_); +} + +void +__assoc_sub_state::wait() +{ + unique_lock<mutex> __lk(__mut_); + __sub_wait(__lk); +} + +void +__assoc_sub_state::__sub_wait(unique_lock<mutex>& __lk) +{ + if (!__is_ready()) + { + if (__state_ & static_cast<unsigned>(deferred)) + { + __state_ &= ~static_cast<unsigned>(deferred); + __lk.unlock(); + __execute(); + } + else + while (!__is_ready()) + __cv_.wait(__lk); + } +} + +void +__assoc_sub_state::__execute() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw future_error(make_error_code(future_errc::no_state)); +#endif +} + +future<void>::future(__assoc_sub_state* __state) + : __state_(__state) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_->__has_future_attached()) + throw future_error(make_error_code(future_errc::future_already_retrieved)); +#endif + __state_->__add_shared(); + __state_->__set_future_attached(); +} + +future<void>::~future() +{ + if (__state_) + __state_->__release_shared(); +} + +void +future<void>::get() +{ + unique_ptr<__shared_count, __release_shared_count> __(__state_); + __assoc_sub_state* __s = __state_; + __state_ = nullptr; + __s->copy(); +} + +promise<void>::promise() + : __state_(new __assoc_sub_state) +{ +} + +promise<void>::~promise() +{ + if (__state_) + { + if (!__state_->__has_value() && __state_->use_count() > 1) + __state_->set_exception(make_exception_ptr( + future_error(make_error_code(future_errc::broken_promise)) + )); + __state_->__release_shared(); + } +} + +future<void> +promise<void>::get_future() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + return future<void>(__state_); +} + +void +promise<void>::set_value() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value(); +} + +void +promise<void>::set_exception(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception(__p); +} + +void +promise<void>::set_value_at_thread_exit() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_value_at_thread_exit(); +} + +void +promise<void>::set_exception_at_thread_exit(exception_ptr __p) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__state_ == nullptr) + throw future_error(make_error_code(future_errc::no_state)); +#endif + __state_->set_exception_at_thread_exit(__p); +} + +shared_future<void>::~shared_future() +{ + if (__state_) + __state_->__release_shared(); +} + +shared_future<void>& +shared_future<void>::operator=(const shared_future& __rhs) +{ + if (__rhs.__state_) + __rhs.__state_->__add_shared(); + if (__state_) + __state_->__release_shared(); + __state_ = __rhs.__state_; + return *this; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/hash.cpp b/contrib/libc++/src/hash.cpp new file mode 100644 index 0000000..6f30d5a --- /dev/null +++ b/contrib/libc++/src/hash.cpp @@ -0,0 +1,560 @@ +//===-------------------------- hash.cpp ----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "__hash_table" +#include "algorithm" +#include "stdexcept" + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace { + +// handle all next_prime(i) for i in [1, 210), special case 0 +const unsigned small_primes[] = +{ + 0, + 2, + 3, + 5, + 7, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 127, + 131, + 137, + 139, + 149, + 151, + 157, + 163, + 167, + 173, + 179, + 181, + 191, + 193, + 197, + 199, + 211 +}; + +// potential primes = 210*k + indices[i], k >= 1 +// these numbers are not divisible by 2, 3, 5 or 7 +// (or any integer 2 <= j <= 10 for that matter). +const unsigned indices[] = +{ + 1, + 11, + 13, + 17, + 19, + 23, + 29, + 31, + 37, + 41, + 43, + 47, + 53, + 59, + 61, + 67, + 71, + 73, + 79, + 83, + 89, + 97, + 101, + 103, + 107, + 109, + 113, + 121, + 127, + 131, + 137, + 139, + 143, + 149, + 151, + 157, + 163, + 167, + 169, + 173, + 179, + 181, + 187, + 191, + 193, + 197, + 199, + 209 +}; + +} + +// Returns: If n == 0, returns 0. Else returns the lowest prime number that +// is greater than or equal to n. +// +// The algorithm creates a list of small primes, plus an open-ended list of +// potential primes. All prime numbers are potential prime numbers. However +// some potential prime numbers are not prime. In an ideal world, all potential +// prime numbers would be prime. Candiate prime numbers are chosen as the next +// highest potential prime. Then this number is tested for prime by dividing it +// by all potential prime numbers less than the sqrt of the candidate. +// +// This implementation defines potential primes as those numbers not divisible +// by 2, 3, 5, and 7. Other (common) implementations define potential primes +// as those not divisible by 2. A few other implementations define potential +// primes as those not divisible by 2 or 3. By raising the number of small +// primes which the potential prime is not divisible by, the set of potential +// primes more closely approximates the set of prime numbers. And thus there +// are fewer potential primes to search, and fewer potential primes to divide +// against. + +inline _LIBCPP_INLINE_VISIBILITY +void +__check_for_overflow(size_t N, integral_constant<size_t, 32>) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (N > 0xFFFFFFFB) + throw overflow_error("__next_prime overflow"); +#endif +} + +inline _LIBCPP_INLINE_VISIBILITY +void +__check_for_overflow(size_t N, integral_constant<size_t, 64>) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (N > 0xFFFFFFFFFFFFFFC5ull) + throw overflow_error("__next_prime overflow"); +#endif +} + +size_t +__next_prime(size_t n) +{ + const size_t L = 210; + const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); + // If n is small enough, search in small_primes + if (n <= small_primes[N-1]) + return *std::lower_bound(small_primes, small_primes + N, n); + // Else n > largest small_primes + // Check for overflow + __check_for_overflow(n, integral_constant<size_t, + sizeof(n) * __CHAR_BIT__>()); + // Start searching list of potential primes: L * k0 + indices[in] + const size_t M = sizeof(indices) / sizeof(indices[0]); + // Select first potential prime >= n + // Known a-priori n >= L + size_t k0 = n / L; + size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) + - indices); + n = L * k0 + indices[in]; + while (true) + { + // Divide n by all primes or potential primes (i) until: + // 1. The division is even, so try next potential prime. + // 2. The i > sqrt(n), in which case n is prime. + // It is known a-priori that n is not divisible by 2, 3, 5 or 7, + // so don't test those (j == 5 -> divide by 11 first). And the + // potential primes start with 211, so don't test against the last + // small prime. + for (size_t j = 5; j < N - 1; ++j) + { + const std::size_t p = small_primes[j]; + const std::size_t q = n / p; + if (q < p) + return n; + if (n == q * p) + goto next; + } + // n wasn't divisible by small primes, try potential primes + { + size_t i = 211; + while (true) + { + std::size_t q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 10; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 8; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 8; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 6; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 4; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 2; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + i += 10; + q = n / i; + if (q < i) + return n; + if (n == q * i) + break; + + // This will loop i to the next "plane" of potential primes + i += 2; + } + } +next: + // n is not prime. Increment n to next potential prime. + if (++in == M) + { + ++k0; + in = 0; + } + n = L * k0 + indices[in]; + } +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/ios.cpp b/contrib/libc++/src/ios.cpp new file mode 100644 index 0000000..80917a0 --- /dev/null +++ b/contrib/libc++/src/ios.cpp @@ -0,0 +1,455 @@ +//===-------------------------- ios.cpp -----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "ios" +#include "streambuf" +#include "istream" +#include "string" +#include "__locale" +#include "algorithm" +#include "memory" +#include "new" +#include "limits" +#include <stdlib.h> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template class basic_ios<char>; +template class basic_ios<wchar_t>; + +template class basic_streambuf<char>; +template class basic_streambuf<wchar_t>; + +template class basic_istream<char>; +template class basic_istream<wchar_t>; + +template class basic_ostream<char>; +template class basic_ostream<wchar_t>; + +template class basic_iostream<char>; + +class _LIBCPP_HIDDEN __iostream_category + : public __do_message +{ +public: + virtual const char* name() const _NOEXCEPT; + virtual string message(int ev) const; +}; + +const char* +__iostream_category::name() const _NOEXCEPT +{ + return "iostream"; +} + +string +__iostream_category::message(int ev) const +{ + if (ev != static_cast<int>(io_errc::stream) +#ifdef ELAST + && ev <= ELAST +#endif + ) + return __do_message::message(ev); + return string("unspecified iostream_category error"); +} + +const error_category& +iostream_category() +{ + static __iostream_category s; + return s; +} + +// ios_base::failure + +ios_base::failure::failure(const string& msg, const error_code& ec) + : system_error(ec, msg) +{ +} + +ios_base::failure::failure(const char* msg, const error_code& ec) + : system_error(ec, msg) +{ +} + +ios_base::failure::~failure() throw() +{ +} + +// ios_base locale + +const ios_base::fmtflags ios_base::boolalpha; +const ios_base::fmtflags ios_base::dec; +const ios_base::fmtflags ios_base::fixed; +const ios_base::fmtflags ios_base::hex; +const ios_base::fmtflags ios_base::internal; +const ios_base::fmtflags ios_base::left; +const ios_base::fmtflags ios_base::oct; +const ios_base::fmtflags ios_base::right; +const ios_base::fmtflags ios_base::scientific; +const ios_base::fmtflags ios_base::showbase; +const ios_base::fmtflags ios_base::showpoint; +const ios_base::fmtflags ios_base::showpos; +const ios_base::fmtflags ios_base::skipws; +const ios_base::fmtflags ios_base::unitbuf; +const ios_base::fmtflags ios_base::uppercase; +const ios_base::fmtflags ios_base::adjustfield; +const ios_base::fmtflags ios_base::basefield; +const ios_base::fmtflags ios_base::floatfield; + +const ios_base::iostate ios_base::badbit; +const ios_base::iostate ios_base::eofbit; +const ios_base::iostate ios_base::failbit; +const ios_base::iostate ios_base::goodbit; + +const ios_base::openmode ios_base::app; +const ios_base::openmode ios_base::ate; +const ios_base::openmode ios_base::binary; +const ios_base::openmode ios_base::in; +const ios_base::openmode ios_base::out; +const ios_base::openmode ios_base::trunc; + +void +ios_base::__call_callbacks(event ev) +{ + for (size_t i = __event_size_; i;) + { + --i; + __fn_[i](ev, *this, __index_[i]); + } +} + +// locale + +locale +ios_base::imbue(const locale& newloc) +{ + static_assert(sizeof(locale) == sizeof(__loc_), ""); + locale& loc_storage = *(locale*)&__loc_; + locale oldloc = loc_storage; + loc_storage = newloc; + __call_callbacks(imbue_event); + return oldloc; +} + +locale +ios_base::getloc() const +{ + const locale& loc_storage = *(locale*)&__loc_; + return loc_storage; +} + +// xalloc + +int ios_base::__xindex_ = 0; + +int +ios_base::xalloc() +{ + return __xindex_++; +} + +long& +ios_base::iword(int index) +{ + size_t req_size = static_cast<size_t>(index)+1; + if (req_size > __iarray_cap_) + { + size_t newcap; + const size_t mx = std::numeric_limits<size_t>::max(); + if (req_size < mx/2) + newcap = _VSTD::max(2 * __iarray_cap_, req_size); + else + newcap = mx; + long* iarray = (long*)realloc(__iarray_, newcap * sizeof(long)); + if (iarray == 0) + { + setstate(badbit); + static long error; + error = 0; + return error; + } + __iarray_ = iarray; + for (long* p = __iarray_ + __iarray_size_; __iarray_cap_ < newcap; ++__iarray_cap_, ++p) + *p = 0; + } + __iarray_size_ = max<size_t>(__iarray_size_, req_size); + return __iarray_[index]; +} + +void*& +ios_base::pword(int index) +{ + size_t req_size = static_cast<size_t>(index)+1; + if (req_size > __parray_cap_) + { + size_t newcap; + const size_t mx = std::numeric_limits<size_t>::max(); + if (req_size < mx/2) + newcap = _VSTD::max(2 * __parray_cap_, req_size); + else + newcap = mx; + void** parray = (void**)realloc(__parray_, newcap * sizeof(void*)); + if (parray == 0) + { + setstate(badbit); + static void* error; + error = 0; + return error; + } + __parray_ = parray; + for (void** p = __parray_ + __parray_size_; __parray_cap_ < newcap; ++__parray_cap_, ++p) + *p = 0; + } + __parray_size_ = max<size_t>(__parray_size_, req_size); + return __parray_[index]; +} + +// register_callback + +void +ios_base::register_callback(event_callback fn, int index) +{ + size_t req_size = __event_size_ + 1; + if (req_size > __event_cap_) + { + size_t newcap; + const size_t mx = std::numeric_limits<size_t>::max(); + if (req_size < mx/2) + newcap = _VSTD::max(2 * __event_cap_, req_size); + else + newcap = mx; + event_callback* fns = (event_callback*)realloc(__fn_, newcap * sizeof(event_callback)); + if (fns == 0) + setstate(badbit); + __fn_ = fns; + int* indxs = (int*)realloc(__index_, newcap * sizeof(int)); + if (indxs == 0) + setstate(badbit); + __index_ = indxs; + } + __fn_[__event_size_] = fn; + __index_[__event_size_] = index; + ++__event_size_; +} + +ios_base::~ios_base() +{ + __call_callbacks(erase_event); + locale& loc_storage = *(locale*)&__loc_; + loc_storage.~locale(); + free(__fn_); + free(__index_); + free(__iarray_); + free(__parray_); +} + +// iostate + +void +ios_base::clear(iostate state) +{ + if (__rdbuf_) + __rdstate_ = state; + else + __rdstate_ = state | badbit; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0) + throw failure("ios_base::clear"); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +// init + +void +ios_base::init(void* sb) +{ + __rdbuf_ = sb; + __rdstate_ = __rdbuf_ ? goodbit : badbit; + __exceptions_ = goodbit; + __fmtflags_ = skipws | dec; + __width_ = 0; + __precision_ = 6; + __fn_ = 0; + __index_ = 0; + __event_size_ = 0; + __event_cap_ = 0; + __iarray_ = 0; + __iarray_size_ = 0; + __iarray_cap_ = 0; + __parray_ = 0; + __parray_size_ = 0; + __parray_cap_ = 0; + ::new(&__loc_) locale; +} + +void +ios_base::copyfmt(const ios_base& rhs) +{ + // If we can't acquire the needed resources, throw bad_alloc (can't set badbit) + // Don't alter *this until all needed resources are aquired + unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free); + unique_ptr<int, void (*)(void*)> new_ints(0, free); + unique_ptr<long, void (*)(void*)> new_longs(0, free); + unique_ptr<void*, void (*)(void*)> new_pointers(0, free); + if (__event_cap_ < rhs.__event_size_) + { + new_callbacks.reset((event_callback*)malloc(sizeof(event_callback) * rhs.__event_size_)); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!new_callbacks) + throw bad_alloc(); +#endif // _LIBCPP_NO_EXCEPTIONS + new_ints.reset((int*)malloc(sizeof(int) * rhs.__event_size_)); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!new_ints) + throw bad_alloc(); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (__iarray_cap_ < rhs.__iarray_size_) + { + new_longs.reset((long*)malloc(sizeof(long) * rhs.__iarray_size_)); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!new_longs) + throw bad_alloc(); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (__parray_cap_ < rhs.__parray_size_) + { + new_pointers.reset((void**)malloc(sizeof(void*) * rhs.__parray_size_)); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!new_pointers) + throw bad_alloc(); +#endif // _LIBCPP_NO_EXCEPTIONS + } + // Got everything we need. Copy everything but __rdstate_, __rdbuf_ and __exceptions_ + __fmtflags_ = rhs.__fmtflags_; + __precision_ = rhs.__precision_; + __width_ = rhs.__width_; + locale& lhs_loc = *(locale*)&__loc_; + locale& rhs_loc = *(locale*)&rhs.__loc_; + lhs_loc = rhs_loc; + if (__event_cap_ < rhs.__event_size_) + { + free(__fn_); + __fn_ = new_callbacks.release(); + free(__index_); + __index_ = new_ints.release(); + __event_cap_ = rhs.__event_size_; + } + for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_) + { + __fn_[__event_size_] = rhs.__fn_[__event_size_]; + __index_[__event_size_] = rhs.__index_[__event_size_]; + } + if (__iarray_cap_ < rhs.__iarray_size_) + { + free(__iarray_); + __iarray_ = new_longs.release(); + __iarray_cap_ = rhs.__iarray_size_; + } + for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_) + __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_]; + if (__parray_cap_ < rhs.__parray_size_) + { + free(__parray_); + __parray_ = new_pointers.release(); + __parray_cap_ = rhs.__parray_size_; + } + for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_) + __parray_[__parray_size_] = rhs.__parray_[__parray_size_]; +} + +void +ios_base::move(ios_base& rhs) +{ + // *this is uninitialized + __fmtflags_ = rhs.__fmtflags_; + __precision_ = rhs.__precision_; + __width_ = rhs.__width_; + __rdstate_ = rhs.__rdstate_; + __exceptions_ = rhs.__exceptions_; + __rdbuf_ = 0; + locale& rhs_loc = *(locale*)&rhs.__loc_; + ::new(&__loc_) locale(rhs_loc); + __fn_ = rhs.__fn_; + rhs.__fn_ = 0; + __index_ = rhs.__index_; + rhs.__index_ = 0; + __event_size_ = rhs.__event_size_; + rhs.__event_size_ = 0; + __event_cap_ = rhs.__event_cap_; + rhs.__event_cap_ = 0; + __iarray_ = rhs.__iarray_; + rhs.__iarray_ = 0; + __iarray_size_ = rhs.__iarray_size_; + rhs.__iarray_size_ = 0; + __iarray_cap_ = rhs.__iarray_cap_; + rhs.__iarray_cap_ = 0; + __parray_ = rhs.__parray_; + rhs.__parray_ = 0; + __parray_size_ = rhs.__parray_size_; + rhs.__parray_size_ = 0; + __parray_cap_ = rhs.__parray_cap_; + rhs.__parray_cap_ = 0; +} + +void +ios_base::swap(ios_base& rhs) +{ + _VSTD::swap(__fmtflags_, rhs.__fmtflags_); + _VSTD::swap(__precision_, rhs.__precision_); + _VSTD::swap(__width_, rhs.__width_); + _VSTD::swap(__rdstate_, rhs.__rdstate_); + _VSTD::swap(__exceptions_, rhs.__exceptions_); + locale& lhs_loc = *(locale*)&__loc_; + locale& rhs_loc = *(locale*)&rhs.__loc_; + _VSTD::swap(lhs_loc, rhs_loc); + _VSTD::swap(__fn_, rhs.__fn_); + _VSTD::swap(__index_, rhs.__index_); + _VSTD::swap(__event_size_, rhs.__event_size_); + _VSTD::swap(__event_cap_, rhs.__event_cap_); + _VSTD::swap(__iarray_, rhs.__iarray_); + _VSTD::swap(__iarray_size_, rhs.__iarray_size_); + _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_); + _VSTD::swap(__parray_, rhs.__parray_); + _VSTD::swap(__parray_size_, rhs.__parray_size_); + _VSTD::swap(__parray_cap_, rhs.__parray_cap_); +} + +void +ios_base::__set_badbit_and_consider_rethrow() +{ + __rdstate_ |= badbit; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__exceptions_ & badbit) + throw; +#endif // _LIBCPP_NO_EXCEPTIONS +} + +void +ios_base::__set_failbit_and_consider_rethrow() +{ + __rdstate_ |= failbit; +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__exceptions_ & failbit) + throw; +#endif // _LIBCPP_NO_EXCEPTIONS +} + +bool +ios_base::sync_with_stdio(bool sync) +{ + static bool previous_state = true; + bool r = previous_state; + previous_state = sync; + return r; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/iostream.cpp b/contrib/libc++/src/iostream.cpp new file mode 100644 index 0000000..157c397 --- /dev/null +++ b/contrib/libc++/src/iostream.cpp @@ -0,0 +1,53 @@ +//===------------------------ iostream.cpp --------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "__std_stream" +#include "string" + +_LIBCPP_BEGIN_NAMESPACE_STD + +static __stdinbuf<char> __cin(stdin); +static __stdoutbuf<char> __cout(stdout); +static __stdoutbuf<char> __cerr(stderr); +static __stdinbuf<wchar_t> __wcin(stdin); +static __stdoutbuf<wchar_t> __wcout(stdout); +static __stdoutbuf<wchar_t> __wcerr(stderr); + +istream cin(&__cin); +ostream cout(&__cout); +ostream cerr(&__cerr); +ostream clog(&__cerr); +wistream wcin(&__wcin); +wostream wcout(&__wcout); +wostream wcerr(&__wcerr); +wostream wclog(&__wcerr); + +ios_base::Init __start_std_streams; + +ios_base::Init::Init() +{ + cin.tie(&cout); + _VSTD::unitbuf(cerr); + cerr.tie(&cout); + + wcin.tie(&wcout); + _VSTD::unitbuf(wcerr); + wcerr.tie(&wcout); +} + +ios_base::Init::~Init() +{ + cout.flush(); + clog.flush(); + + wcout.flush(); + wclog.flush(); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/locale.cpp b/contrib/libc++/src/locale.cpp new file mode 100644 index 0000000..fe99488 --- /dev/null +++ b/contrib/libc++/src/locale.cpp @@ -0,0 +1,6017 @@ +//===------------------------- locale.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// On Solaris, we need to define something to make the C99 parts of localeconv +// visible. +#ifdef __sun__ +#define _LCONV_C99 +#endif + +#include "string" +#include "locale" +#include "codecvt" +#include "vector" +#include "algorithm" +#include "algorithm" +#include "typeinfo" +#include "type_traits" +#include "clocale" +#include "cstring" +#include "cwctype" +#include "__sso_allocator" +#if _WIN32 +#include <support/win32/locale_win32.h> +#else // _WIN32 +#include <langinfo.h> +#endif // _!WIN32 +#include <stdlib.h> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#ifdef __cloc_defined +locale_t __cloc() { + // In theory this could create a race condition. In practice + // the race condition is non-fatal since it will just create + // a little resource leak. Better approach would be appreciated. + static locale_t result = newlocale(LC_ALL_MASK, "C", 0); + return result; +} +#endif // __cloc_defined + +namespace { + +struct release +{ + void operator()(locale::facet* p) {p->__release_shared();} +}; + +template <class T, class A0> +inline +T& +make(A0 a0) +{ + static typename aligned_storage<sizeof(T)>::type buf; + ::new (&buf) T(a0); + return *(T*)&buf; +} + +template <class T, class A0, class A1> +inline +T& +make(A0 a0, A1 a1) +{ + static typename aligned_storage<sizeof(T)>::type buf; + ::new (&buf) T(a0, a1); + return *(T*)&buf; +} + +template <class T, class A0, class A1, class A2> +inline +T& +make(A0 a0, A1 a1, A2 a2) +{ + static typename aligned_storage<sizeof(T)>::type buf; + ::new (&buf) T(a0, a1, a2); + return *(T*)&buf; +} + +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + +class _LIBCPP_HIDDEN locale::__imp + : public facet +{ + enum {N = 28}; + vector<facet*, __sso_allocator<facet*, N> > facets_; + string name_; +public: + explicit __imp(size_t refs = 0); + explicit __imp(const string& name, size_t refs = 0); + __imp(const __imp&); + __imp(const __imp&, const string&, locale::category c); + __imp(const __imp& other, const __imp& one, locale::category c); + __imp(const __imp&, facet* f, long id); + ~__imp(); + + const string& name() const {return name_;} + bool has_facet(long id) const + {return static_cast<size_t>(id) < facets_.size() && facets_[static_cast<size_t>(id)];} + const locale::facet* use_facet(long id) const; + + static const locale& make_classic(); + static locale& make_global(); +private: + void install(facet* f, long id); + template <class F> void install(F* f) {install(f, f->id.__get());} + template <class F> void install_from(const __imp& other); +}; + +#pragma clang diagnostic pop + +locale::__imp::__imp(size_t refs) + : facet(refs), + facets_(N), + name_("C") +{ + facets_.clear(); + install(&make<_VSTD::collate<char> >(1u)); + install(&make<_VSTD::collate<wchar_t> >(1u)); + install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1u)); + install(&make<_VSTD::ctype<wchar_t> >(1u)); + install(&make<codecvt<char, char, mbstate_t> >(1u)); + install(&make<codecvt<wchar_t, char, mbstate_t> >(1u)); + install(&make<codecvt<char16_t, char, mbstate_t> >(1u)); + install(&make<codecvt<char32_t, char, mbstate_t> >(1u)); + install(&make<numpunct<char> >(1u)); + install(&make<numpunct<wchar_t> >(1u)); + install(&make<num_get<char> >(1u)); + install(&make<num_get<wchar_t> >(1u)); + install(&make<num_put<char> >(1u)); + install(&make<num_put<wchar_t> >(1u)); + install(&make<moneypunct<char, false> >(1u)); + install(&make<moneypunct<char, true> >(1u)); + install(&make<moneypunct<wchar_t, false> >(1u)); + install(&make<moneypunct<wchar_t, true> >(1u)); + install(&make<money_get<char> >(1u)); + install(&make<money_get<wchar_t> >(1u)); + install(&make<money_put<char> >(1u)); + install(&make<money_put<wchar_t> >(1u)); + install(&make<time_get<char> >(1u)); + install(&make<time_get<wchar_t> >(1u)); + install(&make<time_put<char> >(1u)); + install(&make<time_put<wchar_t> >(1u)); + install(&make<_VSTD::messages<char> >(1u)); + install(&make<_VSTD::messages<wchar_t> >(1u)); +} + +locale::__imp::__imp(const string& name, size_t refs) + : facet(refs), + facets_(N), + name_(name) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + facets_ = locale::classic().__locale_->facets_; + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__add_shared(); + install(new collate_byname<char>(name_)); + install(new collate_byname<wchar_t>(name_)); + install(new ctype_byname<char>(name_)); + install(new ctype_byname<wchar_t>(name_)); + install(new codecvt_byname<char, char, mbstate_t>(name_)); + install(new codecvt_byname<wchar_t, char, mbstate_t>(name_)); + install(new codecvt_byname<char16_t, char, mbstate_t>(name_)); + install(new codecvt_byname<char32_t, char, mbstate_t>(name_)); + install(new numpunct_byname<char>(name_)); + install(new numpunct_byname<wchar_t>(name_)); + install(new moneypunct_byname<char, false>(name_)); + install(new moneypunct_byname<char, true>(name_)); + install(new moneypunct_byname<wchar_t, false>(name_)); + install(new moneypunct_byname<wchar_t, true>(name_)); + install(new time_get_byname<char>(name_)); + install(new time_get_byname<wchar_t>(name_)); + install(new time_put_byname<char>(name_)); + install(new time_put_byname<wchar_t>(name_)); + install(new messages_byname<char>(name_)); + install(new messages_byname<wchar_t>(name_)); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__release_shared(); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +locale::__imp::__imp(const __imp& other) + : facets_(max<size_t>(N, other.facets_.size())), + name_(other.name_) +{ + facets_ = other.facets_; + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__add_shared(); +} + +locale::__imp::__imp(const __imp& other, const string& name, locale::category c) + : facets_(N), + name_("*") +{ + facets_ = other.facets_; + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__add_shared(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + if (c & locale::collate) + { + install(new collate_byname<char>(name)); + install(new collate_byname<wchar_t>(name)); + } + if (c & locale::ctype) + { + install(new ctype_byname<char>(name)); + install(new ctype_byname<wchar_t>(name)); + install(new codecvt_byname<char, char, mbstate_t>(name)); + install(new codecvt_byname<wchar_t, char, mbstate_t>(name)); + install(new codecvt_byname<char16_t, char, mbstate_t>(name)); + install(new codecvt_byname<char32_t, char, mbstate_t>(name)); + } + if (c & locale::monetary) + { + install(new moneypunct_byname<char, false>(name)); + install(new moneypunct_byname<char, true>(name)); + install(new moneypunct_byname<wchar_t, false>(name)); + install(new moneypunct_byname<wchar_t, true>(name)); + } + if (c & locale::numeric) + { + install(new numpunct_byname<char>(name)); + install(new numpunct_byname<wchar_t>(name)); + } + if (c & locale::time) + { + install(new time_get_byname<char>(name)); + install(new time_get_byname<wchar_t>(name)); + install(new time_put_byname<char>(name)); + install(new time_put_byname<wchar_t>(name)); + } + if (c & locale::messages) + { + install(new messages_byname<char>(name)); + install(new messages_byname<wchar_t>(name)); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__release_shared(); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +template<class F> +inline +void +locale::__imp::install_from(const locale::__imp& one) +{ + long id = F::id.__get(); + install(const_cast<F*>(static_cast<const F*>(one.use_facet(id))), id); +} + +locale::__imp::__imp(const __imp& other, const __imp& one, locale::category c) + : facets_(N), + name_("*") +{ + facets_ = other.facets_; + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__add_shared(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + if (c & locale::collate) + { + install_from<_VSTD::collate<char> >(one); + install_from<_VSTD::collate<wchar_t> >(one); + } + if (c & locale::ctype) + { + install_from<_VSTD::ctype<char> >(one); + install_from<_VSTD::ctype<wchar_t> >(one); + install_from<_VSTD::codecvt<char, char, mbstate_t> >(one); + install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one); + install_from<_VSTD::codecvt<char32_t, char, mbstate_t> >(one); + install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one); + } + if (c & locale::monetary) + { + install_from<moneypunct<char, false> >(one); + install_from<moneypunct<char, true> >(one); + install_from<moneypunct<wchar_t, false> >(one); + install_from<moneypunct<wchar_t, true> >(one); + install_from<money_get<char> >(one); + install_from<money_get<wchar_t> >(one); + install_from<money_put<char> >(one); + install_from<money_put<wchar_t> >(one); + } + if (c & locale::numeric) + { + install_from<numpunct<char> >(one); + install_from<numpunct<wchar_t> >(one); + install_from<num_get<char> >(one); + install_from<num_get<wchar_t> >(one); + install_from<num_put<char> >(one); + install_from<num_put<wchar_t> >(one); + } + if (c & locale::time) + { + install_from<time_get<char> >(one); + install_from<time_get<wchar_t> >(one); + install_from<time_put<char> >(one); + install_from<time_put<wchar_t> >(one); + } + if (c & locale::messages) + { + install_from<_VSTD::messages<char> >(one); + install_from<_VSTD::messages<wchar_t> >(one); + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__release_shared(); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS +} + +locale::__imp::__imp(const __imp& other, facet* f, long id) + : facets_(max<size_t>(N, other.facets_.size()+1)), + name_("*") +{ + f->__add_shared(); + unique_ptr<facet, release> hold(f); + facets_ = other.facets_; + for (unsigned i = 0; i < other.facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__add_shared(); + install(hold.get(), id); +} + +locale::__imp::~__imp() +{ + for (unsigned i = 0; i < facets_.size(); ++i) + if (facets_[i]) + facets_[i]->__release_shared(); +} + +void +locale::__imp::install(facet* f, long id) +{ + f->__add_shared(); + unique_ptr<facet, release> hold(f); + if (static_cast<size_t>(id) >= facets_.size()) + facets_.resize(static_cast<size_t>(id+1)); + if (facets_[static_cast<size_t>(id)]) + facets_[static_cast<size_t>(id)]->__release_shared(); + facets_[static_cast<size_t>(id)] = hold.release(); +} + +const locale::facet* +locale::__imp::use_facet(long id) const +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (!has_facet(id)) + throw bad_cast(); +#endif // _LIBCPP_NO_EXCEPTIONS + return facets_[static_cast<size_t>(id)]; +} + +// locale + +const locale& +locale::__imp::make_classic() +{ + // only one thread can get in here and it only gets in once + static aligned_storage<sizeof(locale)>::type buf; + locale* c = (locale*)&buf; + c->__locale_ = &make<__imp>(1u); + return *c; +} + +const locale& +locale::classic() +{ + static const locale& c = __imp::make_classic(); + return c; +} + +locale& +locale::__imp::make_global() +{ + // only one thread can get in here and it only gets in once + static aligned_storage<sizeof(locale)>::type buf; + ::new (&buf) locale(locale::classic()); + return *(locale*)&buf; +} + +locale& +locale::__global() +{ + static locale& g = __imp::make_global(); + return g; +} + +locale::locale() _NOEXCEPT + : __locale_(__global().__locale_) +{ + __locale_->__add_shared(); +} + +locale::locale(const locale& l) _NOEXCEPT + : __locale_(l.__locale_) +{ + __locale_->__add_shared(); +} + +locale::~locale() +{ + __locale_->__release_shared(); +} + +const locale& +locale::operator=(const locale& other) _NOEXCEPT +{ + other.__locale_->__add_shared(); + __locale_->__release_shared(); + __locale_ = other.__locale_; + return *this; +} + +locale::locale(const char* name) +#ifndef _LIBCPP_NO_EXCEPTIONS + : __locale_(name ? new __imp(name) + : throw runtime_error("locale constructed with null")) +#else // _LIBCPP_NO_EXCEPTIONS + : __locale_(new __imp(name)) +#endif +{ + __locale_->__add_shared(); +} + +locale::locale(const string& name) + : __locale_(new __imp(name)) +{ + __locale_->__add_shared(); +} + +locale::locale(const locale& other, const char* name, category c) +#ifndef _LIBCPP_NO_EXCEPTIONS + : __locale_(name ? new __imp(*other.__locale_, name, c) + : throw runtime_error("locale constructed with null")) +#else // _LIBCPP_NO_EXCEPTIONS + : __locale_(new __imp(*other.__locale_, name, c)) +#endif +{ + __locale_->__add_shared(); +} + +locale::locale(const locale& other, const string& name, category c) + : __locale_(new __imp(*other.__locale_, name, c)) +{ + __locale_->__add_shared(); +} + +locale::locale(const locale& other, const locale& one, category c) + : __locale_(new __imp(*other.__locale_, *one.__locale_, c)) +{ + __locale_->__add_shared(); +} + +string +locale::name() const +{ + return __locale_->name(); +} + +void +locale::__install_ctor(const locale& other, facet* f, long id) +{ + if (f) + __locale_ = new __imp(*other.__locale_, f, id); + else + __locale_ = other.__locale_; + __locale_->__add_shared(); +} + +locale +locale::global(const locale& loc) +{ + locale& g = __global(); + locale r = g; + g = loc; + if (g.name() != "*") + setlocale(LC_ALL, g.name().c_str()); + return r; +} + +bool +locale::has_facet(id& x) const +{ + return __locale_->has_facet(x.__get()); +} + +const locale::facet* +locale::use_facet(id& x) const +{ + return __locale_->use_facet(x.__get()); +} + +bool +locale::operator==(const locale& y) const +{ + return (__locale_ == y.__locale_) + || (__locale_->name() != "*" && __locale_->name() == y.__locale_->name()); +} + +// locale::facet + +locale::facet::~facet() +{ +} + +void +locale::facet::__on_zero_shared() _NOEXCEPT +{ + delete this; +} + +// locale::id + +int32_t locale::id::__next_id = 0; + +namespace +{ + +class __fake_bind +{ + locale::id* id_; + void (locale::id::* pmf_)(); +public: + __fake_bind(void (locale::id::* pmf)(), locale::id* id) + : id_(id), pmf_(pmf) {} + + void operator()() const + { + (id_->*pmf_)(); + } +}; + +} + +long +locale::id::__get() +{ + call_once(__flag_, __fake_bind(&locale::id::__init, this)); + return __id_ - 1; +} + +void +locale::id::__init() +{ + __id_ = __sync_add_and_fetch(&__next_id, 1); +} + +// template <> class collate_byname<char> + +collate_byname<char>::collate_byname(const char* n, size_t refs) + : collate<char>(refs), + __l(newlocale(LC_ALL_MASK, n, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("collate_byname<char>::collate_byname" + " failed to construct for " + string(n)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +collate_byname<char>::collate_byname(const string& name, size_t refs) + : collate<char>(refs), + __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("collate_byname<char>::collate_byname" + " failed to construct for " + name); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +collate_byname<char>::~collate_byname() +{ + freelocale(__l); +} + +int +collate_byname<char>::do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const +{ + string_type lhs(__lo1, __hi1); + string_type rhs(__lo2, __hi2); + int r = strcoll_l(lhs.c_str(), rhs.c_str(), __l); + if (r < 0) + return -1; + if (r > 0) + return 1; + return r; +} + +collate_byname<char>::string_type +collate_byname<char>::do_transform(const char_type* lo, const char_type* hi) const +{ + const string_type in(lo, hi); + string_type out(strxfrm_l(0, in.c_str(), 0, __l), char()); + strxfrm_l(const_cast<char*>(out.c_str()), in.c_str(), out.size()+1, __l); + return out; +} + +// template <> class collate_byname<wchar_t> + +collate_byname<wchar_t>::collate_byname(const char* n, size_t refs) + : collate<wchar_t>(refs), + __l(newlocale(LC_ALL_MASK, n, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)" + " failed to construct for " + string(n)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +collate_byname<wchar_t>::collate_byname(const string& name, size_t refs) + : collate<wchar_t>(refs), + __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)" + " failed to construct for " + name); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +collate_byname<wchar_t>::~collate_byname() +{ + freelocale(__l); +} + +int +collate_byname<wchar_t>::do_compare(const char_type* __lo1, const char_type* __hi1, + const char_type* __lo2, const char_type* __hi2) const +{ + string_type lhs(__lo1, __hi1); + string_type rhs(__lo2, __hi2); + int r = wcscoll_l(lhs.c_str(), rhs.c_str(), __l); + if (r < 0) + return -1; + if (r > 0) + return 1; + return r; +} + +collate_byname<wchar_t>::string_type +collate_byname<wchar_t>::do_transform(const char_type* lo, const char_type* hi) const +{ + const string_type in(lo, hi); + string_type out(wcsxfrm_l(0, in.c_str(), 0, __l), wchar_t()); + wcsxfrm_l(const_cast<wchar_t*>(out.c_str()), in.c_str(), out.size()+1, __l); + return out; +} + +// template <> class ctype<wchar_t>; + +locale::id ctype<wchar_t>::id; + +ctype<wchar_t>::~ctype() +{ +} + +bool +ctype<wchar_t>::do_is(mask m, char_type c) const +{ + return isascii(c) ? ctype<char>::classic_table()[c] & m : false; +} + +const wchar_t* +ctype<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const +{ + for (; low != high; ++low, ++vec) + *vec = static_cast<mask>(isascii(*low) ? + ctype<char>::classic_table()[*low] : 0); + return low; +} + +const wchar_t* +ctype<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + if (isascii(*low) && (ctype<char>::classic_table()[*low] & m)) + break; + return low; +} + +const wchar_t* +ctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m))) + break; + return low; +} + +wchar_t +ctype<wchar_t>::do_toupper(char_type c) const +{ +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c; +#elif defined(__GLIBC__) + return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c; +#else + return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c; +#endif +} + +const wchar_t* +ctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low; +#elif defined(__GLIBC__) + *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low] + : *low; +#else + *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') : *low; +#endif + return low; +} + +wchar_t +ctype<wchar_t>::do_tolower(char_type c) const +{ +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c; +#elif defined(__GLIBC__) + return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c; +#else + return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c; +#endif +} + +const wchar_t* +ctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low; +#elif defined(__GLIBC__) + *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low] + : *low; +#else + *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *low; +#endif + return low; +} + +wchar_t +ctype<wchar_t>::do_widen(char c) const +{ + return c; +} + +const char* +ctype<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const +{ + for (; low != high; ++low, ++dest) + *dest = *low; + return low; +} + +char +ctype<wchar_t>::do_narrow(char_type c, char dfault) const +{ + if (isascii(c)) + return static_cast<char>(c); + return dfault; +} + +const wchar_t* +ctype<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const +{ + for (; low != high; ++low, ++dest) + if (isascii(*low)) + *dest = static_cast<char>(*low); + else + *dest = dfault; + return low; +} + +// template <> class ctype<char>; + +locale::id ctype<char>::id; + +ctype<char>::ctype(const mask* tab, bool del, size_t refs) + : locale::facet(refs), + __tab_(tab), + __del_(del) +{ + if (__tab_ == 0) + __tab_ = classic_table(); +} + +ctype<char>::~ctype() +{ + if (__tab_ && __del_) + delete [] __tab_; +} + +char +ctype<char>::do_toupper(char_type c) const +{ +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? + static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c; +#elif defined(__GLIBC__) + return isascii(c) ? __classic_upper_table()[c] : c; +#else + return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c; +#endif +} + +const char* +ctype<char>::do_toupper(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? + static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__GLIBC__) + *low = isascii(*low) ? __classic_upper_table()[*low] : *low; +#else + *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *low; +#endif + return low; +} + +char +ctype<char>::do_tolower(char_type c) const +{ +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + return isascii(c) ? + static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c; +#elif defined(__GLIBC__) + return isascii(c) ? __classic_lower_table()[c] : c; +#else + return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c; +#endif +} + +const char* +ctype<char>::do_tolower(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) +#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE + *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low; +#elif defined(__GLIBC__) + *low = isascii(*low) ? __classic_lower_table()[*low] : *low; +#else + *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *low; +#endif + return low; +} + +char +ctype<char>::do_widen(char c) const +{ + return c; +} + +const char* +ctype<char>::do_widen(const char* low, const char* high, char_type* dest) const +{ + for (; low != high; ++low, ++dest) + *dest = *low; + return low; +} + +char +ctype<char>::do_narrow(char_type c, char dfault) const +{ + if (isascii(c)) + return static_cast<char>(c); + return dfault; +} + +const char* +ctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const +{ + for (; low != high; ++low, ++dest) + if (isascii(*low)) + *dest = *low; + else + *dest = dfault; + return low; +} + +const ctype<char>::mask* +ctype<char>::classic_table() _NOEXCEPT +{ +#if defined(__APPLE__) || defined(__FreeBSD__) + return _DefaultRuneLocale.__runetype; +#elif defined(__GLIBC__) + return __cloc()->__ctype_b; +#elif __sun__ + return __ctype_mask; +#elif _WIN32 + return _ctype+1; // internal ctype mask table defined in msvcrt.dll +// This is assumed to be safe, which is a nonsense assumption because we're +// going to end up dereferencing it later... +#else + // Platform not supported: abort so the person doing the port knows what to + // fix +# warning ctype<char>::classic_table() is not implemented + abort(); + return NULL; +#endif +} + +#if defined(__GLIBC__) +const int* +ctype<char>::__classic_lower_table() _NOEXCEPT +{ + return __cloc()->__ctype_tolower; +} + +const int* +ctype<char>::__classic_upper_table() _NOEXCEPT +{ + return __cloc()->__ctype_toupper; +} +#endif // __GLIBC__ + +// template <> class ctype_byname<char> + +ctype_byname<char>::ctype_byname(const char* name, size_t refs) + : ctype<char>(0, false, refs), + __l(newlocale(LC_ALL_MASK, name, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("ctype_byname<char>::ctype_byname" + " failed to construct for " + string(name)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +ctype_byname<char>::ctype_byname(const string& name, size_t refs) + : ctype<char>(0, false, refs), + __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("ctype_byname<char>::ctype_byname" + " failed to construct for " + name); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +ctype_byname<char>::~ctype_byname() +{ + freelocale(__l); +} + +char +ctype_byname<char>::do_toupper(char_type c) const +{ + return static_cast<char>(toupper_l(c, __l)); +} + +const char* +ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + *low = static_cast<char>(toupper_l(*low, __l)); + return low; +} + +char +ctype_byname<char>::do_tolower(char_type c) const +{ + return static_cast<char>(tolower_l(c, __l)); +} + +const char* +ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + *low = static_cast<char>(tolower_l(*low, __l)); + return low; +} + +// template <> class ctype_byname<wchar_t> + +ctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs) + : ctype<wchar_t>(refs), + __l(newlocale(LC_ALL_MASK, name, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("ctype_byname<wchar_t>::ctype_byname" + " failed to construct for " + string(name)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +ctype_byname<wchar_t>::ctype_byname(const string& name, size_t refs) + : ctype<wchar_t>(refs), + __l(newlocale(LC_ALL_MASK, name.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("ctype_byname<wchar_t>::ctype_byname" + " failed to construct for " + name); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +ctype_byname<wchar_t>::~ctype_byname() +{ + freelocale(__l); +} + +bool +ctype_byname<wchar_t>::do_is(mask m, char_type c) const +{ +#ifdef _LIBCPP_WCTYPE_IS_MASK + return static_cast<bool>(iswctype_l(c, m, __l)); +#else + bool result = true; + if (m & space && !iswspace_l(c, __l)) result = false; + if (m & print && !iswprint_l(c, __l)) result = false; + if (m & cntrl && !iswcntrl_l(c, __l)) result = false; + if (m & upper && !iswupper_l(c, __l)) result = false; + if (m & lower && !iswlower_l(c, __l)) result = false; + if (m & alpha && !iswalpha_l(c, __l)) result = false; + if (m & digit && !iswdigit_l(c, __l)) result = false; + if (m & punct && !iswpunct_l(c, __l)) result = false; + if (m & xdigit && !iswxdigit_l(c, __l)) result = false; + if (m & blank && !iswblank_l(c, __l)) result = false; + return result; +#endif +} + +const wchar_t* +ctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const +{ + for (; low != high; ++low, ++vec) + { + if (isascii(*low)) + *vec = static_cast<mask>(ctype<char>::classic_table()[*low]); + else + { + *vec = 0; + if (iswspace_l(*low, __l)) + *vec |= space; + if (iswprint_l(*low, __l)) + *vec |= print; + if (iswcntrl_l(*low, __l)) + *vec |= cntrl; + if (iswupper_l(*low, __l)) + *vec |= upper; + if (iswlower_l(*low, __l)) + *vec |= lower; + if (iswalpha_l(*low, __l)) + *vec |= alpha; + if (iswdigit_l(*low, __l)) + *vec |= digit; + if (iswpunct_l(*low, __l)) + *vec |= punct; + if (iswxdigit_l(*low, __l)) + *vec |= xdigit; + } + } + return low; +} + +const wchar_t* +ctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + { +#ifdef _LIBCPP_WCTYPE_IS_MASK + if (iswctype_l(*low, m, __l)) + break; +#else + if (m & space && !iswspace_l(*low, __l)) continue; + if (m & print && !iswprint_l(*low, __l)) continue; + if (m & cntrl && !iswcntrl_l(*low, __l)) continue; + if (m & upper && !iswupper_l(*low, __l)) continue; + if (m & lower && !iswlower_l(*low, __l)) continue; + if (m & alpha && !iswalpha_l(*low, __l)) continue; + if (m & digit && !iswdigit_l(*low, __l)) continue; + if (m & punct && !iswpunct_l(*low, __l)) continue; + if (m & xdigit && !iswxdigit_l(*low, __l)) continue; + if (m & blank && !iswblank_l(*low, __l)) continue; + break; +#endif + } + return low; +} + +const wchar_t* +ctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + { +#ifdef _LIBCPP_WCTYPE_IS_MASK + if (!iswctype_l(*low, m, __l)) + break; +#else + if (m & space && iswspace_l(*low, __l)) continue; + if (m & print && iswprint_l(*low, __l)) continue; + if (m & cntrl && iswcntrl_l(*low, __l)) continue; + if (m & upper && iswupper_l(*low, __l)) continue; + if (m & lower && iswlower_l(*low, __l)) continue; + if (m & alpha && iswalpha_l(*low, __l)) continue; + if (m & digit && iswdigit_l(*low, __l)) continue; + if (m & punct && iswpunct_l(*low, __l)) continue; + if (m & xdigit && iswxdigit_l(*low, __l)) continue; + if (m & blank && iswblank_l(*low, __l)) continue; + break; +#endif + } + return low; +} + +wchar_t +ctype_byname<wchar_t>::do_toupper(char_type c) const +{ + return towupper_l(c, __l); +} + +const wchar_t* +ctype_byname<wchar_t>::do_toupper(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + *low = towupper_l(*low, __l); + return low; +} + +wchar_t +ctype_byname<wchar_t>::do_tolower(char_type c) const +{ + return towlower_l(c, __l); +} + +const wchar_t* +ctype_byname<wchar_t>::do_tolower(char_type* low, const char_type* high) const +{ + for (; low != high; ++low) + *low = towlower_l(*low, __l); + return low; +} + +wchar_t +ctype_byname<wchar_t>::do_widen(char c) const +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return btowc_l(c, __l); +#else + return __btowc_l(c, __l); +#endif +} + +const char* +ctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const +{ + for (; low != high; ++low, ++dest) +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + *dest = btowc_l(*low, __l); +#else + *dest = __btowc_l(*low, __l); +#endif + return low; +} + +char +ctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int r = wctob_l(c, __l); +#else + int r = __wctob_l(c, __l); +#endif + return r != WEOF ? static_cast<char>(r) : dfault; +} + +const wchar_t* +ctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const +{ + for (; low != high; ++low, ++dest) + { +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int r = wctob_l(*low, __l); +#else + int r = __wctob_l(*low, __l); +#endif + *dest = r != WEOF ? static_cast<char>(r) : dfault; + } + return low; +} + +// template <> class codecvt<char, char, mbstate_t> + +locale::id codecvt<char, char, mbstate_t>::id; + +codecvt<char, char, mbstate_t>::~codecvt() +{ +} + +codecvt<char, char, mbstate_t>::result +codecvt<char, char, mbstate_t>::do_out(state_type&, + const intern_type* frm, const intern_type*, const intern_type*& frm_nxt, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + frm_nxt = frm; + to_nxt = to; + return noconv; +} + +codecvt<char, char, mbstate_t>::result +codecvt<char, char, mbstate_t>::do_in(state_type&, + const extern_type* frm, const extern_type*, const extern_type*& frm_nxt, + intern_type* to, intern_type*, intern_type*& to_nxt) const +{ + frm_nxt = frm; + to_nxt = to; + return noconv; +} + +codecvt<char, char, mbstate_t>::result +codecvt<char, char, mbstate_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +codecvt<char, char, mbstate_t>::do_encoding() const _NOEXCEPT +{ + return 1; +} + +bool +codecvt<char, char, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return true; +} + +int +codecvt<char, char, mbstate_t>::do_length(state_type&, + const extern_type* frm, const extern_type* end, size_t mx) const +{ + return static_cast<int>(min<size_t>(mx, static_cast<size_t>(end-frm))); +} + +int +codecvt<char, char, mbstate_t>::do_max_length() const _NOEXCEPT +{ + return 1; +} + +// template <> class codecvt<wchar_t, char, mbstate_t> + +locale::id codecvt<wchar_t, char, mbstate_t>::id; + +codecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs) + : locale::facet(refs), + __l(0) +{ +} + +codecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs) + : locale::facet(refs), + __l(newlocale(LC_ALL_MASK, nm, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__l == 0) + throw runtime_error("codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +codecvt<wchar_t, char, mbstate_t>::~codecvt() +{ + if (__l != 0) + freelocale(__l); +} + +codecvt<wchar_t, char, mbstate_t>::result +codecvt<wchar_t, char, mbstate_t>::do_out(state_type& st, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + // look for first internal null in frm + const intern_type* fend = frm; + for (; fend != frm_end; ++fend) + if (*fend == 0) + break; + // loop over all null-terminated sequences in frm + to_nxt = to; + for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt) + { + // save state in case needed to reover to_nxt on error + mbstate_t save_state = st; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), + static_cast<size_t>(to_end-to), &st, __l); +#else + size_t n = __wcsnrtombs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); +#endif + if (n == size_t(-1)) + { + // need to recover to_nxt + for (to_nxt = to; frm != frm_nxt; ++frm) + { +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + n = wcrtomb_l(to_nxt, *frm, &save_state, __l); +#else + n = __wcrtomb_l(to_nxt, *frm, &save_state, __l); +#endif + if (n == size_t(-1)) + break; + to_nxt += n; + } + frm_nxt = frm; + return error; + } + if (n == 0) + return partial; + to_nxt += n; + if (to_nxt == to_end) + break; + if (fend != frm_end) // set up next null terminated sequence + { + // Try to write the terminating null + extern_type tmp[MB_LEN_MAX]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + n = wcrtomb_l(tmp, intern_type(), &st, __l); +#else + n = __wcrtomb_l(tmp, intern_type(), &st, __l); +#endif + if (n == size_t(-1)) // on error + return error; + if (n > static_cast<size_t>(to_end-to_nxt)) // is there room? + return partial; + for (extern_type* p = tmp; n; --n) // write it + *to_nxt++ = *p++; + ++frm_nxt; + // look for next null in frm + for (fend = frm_nxt; fend != frm_end; ++fend) + if (*fend == 0) + break; + } + } + return frm_nxt == frm_end ? ok : partial; +} + +codecvt<wchar_t, char, mbstate_t>::result +codecvt<wchar_t, char, mbstate_t>::do_in(state_type& st, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + // look for first internal null in frm + const extern_type* fend = frm; + for (; fend != frm_end; ++fend) + if (*fend == 0) + break; + // loop over all null-terminated sequences in frm + to_nxt = to; + for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt) + { + // save state in case needed to reover to_nxt on error + mbstate_t save_state = st; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm), + static_cast<size_t>(to_end-to), &st, __l); +#else + size_t n = __mbsnrtowcs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l); +#endif + if (n == size_t(-1)) + { + // need to recover to_nxt + for (to_nxt = to; frm != frm_nxt; ++to_nxt) + { +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + n = mbrtowc_l(to_nxt, frm, static_cast<size_t>(fend-frm), + &save_state, __l); +#else + n = __mbrtowc_l(to_nxt, frm, fend-frm, &save_state, __l); +#endif + switch (n) + { + case 0: + ++frm; + break; + case size_t(-1): + frm_nxt = frm; + return error; + case size_t(-2): + frm_nxt = frm; + return partial; + default: + frm += n; + break; + } + } + frm_nxt = frm; + return frm_nxt == frm_end ? ok : partial; + } + if (n == 0) + return error; + to_nxt += n; + if (to_nxt == to_end) + break; + if (fend != frm_end) // set up next null terminated sequence + { + // Try to write the terminating null +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + n = mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l); +#else + n = __mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l); +#endif + if (n != 0) // on error + return error; + ++to_nxt; + ++frm_nxt; + // look for next null in frm + for (fend = frm_nxt; fend != frm_end; ++fend) + if (*fend == 0) + break; + } + } + return frm_nxt == frm_end ? ok : partial; +} + +codecvt<wchar_t, char, mbstate_t>::result +codecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + to_nxt = to; + extern_type tmp[MB_LEN_MAX]; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = wcrtomb_l(tmp, intern_type(), &st, __l); +#else + size_t n = __wcrtomb_l(tmp, intern_type(), &st, __l); +#endif + if (n == size_t(-1) || n == 0) // on error + return error; + --n; + if (n > static_cast<size_t>(to_end-to_nxt)) // is there room? + return partial; + for (extern_type* p = tmp; n; --n) // write it + *to_nxt++ = *p++; + return ok; +} + +int +codecvt<wchar_t, char, mbstate_t>::do_encoding() const _NOEXCEPT +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + if (mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0) +#else + if (__mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0) +#endif + { + // stateless encoding +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + if (__l == 0 || MB_CUR_MAX_L(__l) == 1) // there are no known constant length encodings +#else + if (__l == 0 || __mb_cur_max_l(__l) == 1) // there are no known constant length encodings +#endif + return 1; // which take more than 1 char to form a wchar_t + return 0; + } + return -1; +} + +bool +codecvt<wchar_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +codecvt<wchar_t, char, mbstate_t>::do_length(state_type& st, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + int nbytes = 0; + for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t) + { +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t n = mbrlen_l(frm, static_cast<size_t>(frm_end-frm), &st, __l); +#else + size_t n = __mbrlen_l(frm, frm_end-frm, &st, __l); +#endif + switch (n) + { + case 0: + ++nbytes; + ++frm; + break; + case size_t(-1): + case size_t(-2): + return nbytes; + default: + nbytes += n; + frm += n; + break; + } + } + return nbytes; +} + +int +codecvt<wchar_t, char, mbstate_t>::do_max_length() const _NOEXCEPT +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return __l == 0 ? 1 : MB_CUR_MAX_L(__l); +#else + return __l == 0 ? 1 : __mb_cur_max_l(__l); +#endif +} + +// Valid UTF ranges +// UTF-32 UTF-16 UTF-8 # of code points +// first second first second third fourth +// 000000 - 00007F 0000 - 007F 00 - 7F 127 +// 000080 - 0007FF 0080 - 07FF C2 - DF, 80 - BF 1920 +// 000800 - 000FFF 0800 - 0FFF E0 - E0, A0 - BF, 80 - BF 2048 +// 001000 - 00CFFF 1000 - CFFF E1 - EC, 80 - BF, 80 - BF 49152 +// 00D000 - 00D7FF D000 - D7FF ED - ED, 80 - 9F, 80 - BF 2048 +// 00D800 - 00DFFF invalid +// 00E000 - 00FFFF E000 - FFFF EE - EF, 80 - BF, 80 - BF 8192 +// 010000 - 03FFFF D800 - D8BF, DC00 - DFFF F0 - F0, 90 - BF, 80 - BF, 80 - BF 196608 +// 040000 - 0FFFFF D8C0 - DBBF, DC00 - DFFF F1 - F3, 80 - BF, 80 - BF, 80 - BF 786432 +// 100000 - 10FFFF DBC0 - DBFF, DC00 - DFFF F4 - F4, 80 - 8F, 80 - BF, 80 - BF 65536 + +static +codecvt_base::result +utf16_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xEF); + *to_nxt++ = static_cast<uint8_t>(0xBB); + *to_nxt++ = static_cast<uint8_t>(0xBF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint16_t wc1 = *frm_nxt; + if (wc1 > Maxcode) + return codecvt_base::error; + if (wc1 < 0x0080) + { + if (to_end-to_nxt < 1) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc1); + } + else if (wc1 < 0x0800) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F)); + } + else if (wc1 < 0xD800) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F)); + } + else if (wc1 < 0xDC00) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint16_t wc2 = frm_nxt[1]; + if ((wc2 & 0xFC00) != 0xDC00) + return codecvt_base::error; + if (to_end-to_nxt < 4) + return codecvt_base::partial; + if ((((((unsigned long)wc1 & 0x03C0) >> 6) + 1) << 16) + + (((unsigned long)wc1 & 0x003F) << 10) + (wc2 & 0x03FF) > Maxcode) + return codecvt_base::error; + ++frm_nxt; + uint8_t z = ((wc1 & 0x03C0) >> 6) + 1; + *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4) | ((wc1 & 0x003C) >> 2)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc2 & 0x003F)); + } + else if (wc1 < 0xE000) + { + return codecvt_base::error; + } + else + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F)); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf16_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xEF); + *to_nxt++ = static_cast<uint8_t>(0xBB); + *to_nxt++ = static_cast<uint8_t>(0xBF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint16_t wc1 = static_cast<uint16_t>(*frm_nxt); + if (wc1 > Maxcode) + return codecvt_base::error; + if (wc1 < 0x0080) + { + if (to_end-to_nxt < 1) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc1); + } + else if (wc1 < 0x0800) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F)); + } + else if (wc1 < 0xD800) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F)); + } + else if (wc1 < 0xDC00) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint16_t wc2 = static_cast<uint16_t>(frm_nxt[1]); + if ((wc2 & 0xFC00) != 0xDC00) + return codecvt_base::error; + if (to_end-to_nxt < 4) + return codecvt_base::partial; + if ((((((unsigned long)wc1 & 0x03C0) >> 6) + 1) << 16) + + (((unsigned long)wc1 & 0x003F) << 10) + (wc2 & 0x03FF) > Maxcode) + return codecvt_base::error; + ++frm_nxt; + uint8_t z = ((wc1 & 0x03C0) >> 6) + 1; + *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4) | ((wc1 & 0x003C) >> 2)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc2 & 0x003F)); + } + else if (wc1 < 0xE000) + { + return codecvt_base::error; + } + else + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc1 >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x003F)); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt) + { + uint8_t c1 = *frm_nxt; + if (c1 > Maxcode) + return codecvt_base::error; + if (c1 < 0x80) + { + *to_nxt = static_cast<uint16_t>(c1); + ++frm_nxt; + } + else if (c1 < 0xC2) + { + return codecvt_base::error; + } + else if (c1 < 0xE0) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return codecvt_base::error; + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12) + | ((c2 & 0x3F) << 6) + | (c3 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 3; + } + else if (c1 < 0xF5) + { + if (frm_end-frm_nxt < 4) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + uint8_t c4 = frm_nxt[3]; + switch (c1) + { + case 0xF0: + if (!(0x90 <= c2 && c2 <= 0xBF)) + return codecvt_base::error; + break; + case 0xF4: + if ((c2 & 0xF0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) + return codecvt_base::error; + if (to_end-to_nxt < 2) + return codecvt_base::partial; + if (((((unsigned long)c1 & 7) << 18) + + (((unsigned long)c2 & 0x3F) << 12) + + (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint16_t>( + 0xD800 + | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6) + | ((c2 & 0x0F) << 2) + | ((c3 & 0x30) >> 4)); + *++to_nxt = static_cast<uint16_t>( + 0xDC00 + | ((c3 & 0x0F) << 6) + | (c4 & 0x3F)); + frm_nxt += 4; + } + else + { + return codecvt_base::error; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +codecvt_base::result +utf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt) + { + uint8_t c1 = *frm_nxt; + if (c1 > Maxcode) + return codecvt_base::error; + if (c1 < 0x80) + { + *to_nxt = static_cast<uint32_t>(c1); + ++frm_nxt; + } + else if (c1 < 0xC2) + { + return codecvt_base::error; + } + else if (c1 < 0xE0) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>(t); + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return codecvt_base::error; + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12) + | ((c2 & 0x3F) << 6) + | (c3 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>(t); + frm_nxt += 3; + } + else if (c1 < 0xF5) + { + if (frm_end-frm_nxt < 4) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + uint8_t c4 = frm_nxt[3]; + switch (c1) + { + case 0xF0: + if (!(0x90 <= c2 && c2 <= 0xBF)) + return codecvt_base::error; + break; + case 0xF4: + if ((c2 & 0xF0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) + return codecvt_base::error; + if (to_end-to_nxt < 2) + return codecvt_base::partial; + if (((((unsigned long)c1 & 7) << 18) + + (((unsigned long)c2 & 0x3F) << 12) + + (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>( + 0xD800 + | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6) + | ((c2 & 0x0F) << 2) + | ((c3 & 0x30) >> 4)); + *++to_nxt = static_cast<uint32_t>( + 0xDC00 + | ((c3 & 0x0F) << 6) + | (c4 & 0x3F)); + frm_nxt += 4; + } + else + { + return codecvt_base::error; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (size_t nchar16_t = 0; frm_nxt < frm_end && nchar16_t < mx; ++nchar16_t) + { + uint8_t c1 = *frm_nxt; + if (c1 > Maxcode) + break; + if (c1 < 0x80) + { + ++frm_nxt; + } + else if (c1 < 0xC2) + { + break; + } + else if (c1 < 0xE0) + { + if ((frm_end-frm_nxt < 2) || (frm_nxt[1] & 0xC0) != 0x80) + break; + uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F)); + if (t > Maxcode) + break; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + break; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return static_cast<int>(frm_nxt - frm); + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + default: + if ((c2 & 0xC0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + } + if ((c3 & 0xC0) != 0x80) + break; + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) + break; + frm_nxt += 3; + } + else if (c1 < 0xF5) + { + if (frm_end-frm_nxt < 4 || mx-nchar16_t < 2) + break; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + uint8_t c4 = frm_nxt[3]; + switch (c1) + { + case 0xF0: + if (!(0x90 <= c2 && c2 <= 0xBF)) + return static_cast<int>(frm_nxt - frm); + break; + case 0xF4: + if ((c2 & 0xF0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + default: + if ((c2 & 0xC0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + } + if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) + break; + if (((((unsigned long)c1 & 7) << 18) + + (((unsigned long)c2 & 0x3F) << 12) + + (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode) + break; + ++nchar16_t; + frm_nxt += 4; + } + else + { + break; + } + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs4_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xEF); + *to_nxt++ = static_cast<uint8_t>(0xBB); + *to_nxt++ = static_cast<uint8_t>(0xBF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint32_t wc = *frm_nxt; + if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode) + return codecvt_base::error; + if (wc < 0x000080) + { + if (to_end-to_nxt < 1) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc); + } + else if (wc < 0x000800) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F)); + } + else if (wc < 0x010000) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x003F)); + } + else // if (wc < 0x110000) + { + if (to_end-to_nxt < 4) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xF0 | (wc >> 18)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x03F000) >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x000FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x00003F)); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf8_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt) + { + uint8_t c1 = static_cast<uint8_t>(*frm_nxt); + if (c1 < 0x80) + { + if (c1 > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>(c1); + ++frm_nxt; + } + else if (c1 < 0xC2) + { + return codecvt_base::error; + } + else if (c1 < 0xE0) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + uint32_t t = static_cast<uint32_t>(((c1 & 0x1F) << 6) + | (c2 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return codecvt_base::error; + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80) + return codecvt_base::error; + uint32_t t = static_cast<uint32_t>(((c1 & 0x0F) << 12) + | ((c2 & 0x3F) << 6) + | (c3 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 3; + } + else if (c1 < 0xF5) + { + if (frm_end-frm_nxt < 4) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + uint8_t c4 = frm_nxt[3]; + switch (c1) + { + case 0xF0: + if (!(0x90 <= c2 && c2 <= 0xBF)) + return codecvt_base::error; + break; + case 0xF4: + if ((c2 & 0xF0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) + return codecvt_base::error; + uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18) + | ((c2 & 0x3F) << 12) + | ((c3 & 0x3F) << 6) + | (c4 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 4; + } + else + { + return codecvt_base::error; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t) + { + uint8_t c1 = static_cast<uint8_t>(*frm_nxt); + if (c1 < 0x80) + { + if (c1 > Maxcode) + break; + ++frm_nxt; + } + else if (c1 < 0xC2) + { + break; + } + else if (c1 < 0xE0) + { + if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80)) + break; + if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode) + break; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + break; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return static_cast<int>(frm_nxt - frm); + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + default: + if ((c2 & 0xC0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + } + if ((c3 & 0xC0) != 0x80) + break; + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) + break; + frm_nxt += 3; + } + else if (c1 < 0xF5) + { + if (frm_end-frm_nxt < 4) + break; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + uint8_t c4 = frm_nxt[3]; + switch (c1) + { + case 0xF0: + if (!(0x90 <= c2 && c2 <= 0xBF)) + return static_cast<int>(frm_nxt - frm); + break; + case 0xF4: + if ((c2 & 0xF0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + default: + if ((c2 & 0xC0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + } + if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80) + break; + if ((((c1 & 0x07u) << 18) | ((c2 & 0x3Fu) << 12) | + ((c3 & 0x3Fu) << 6) | (c4 & 0x3Fu)) > Maxcode) + break; + frm_nxt += 4; + } + else + { + break; + } + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs2_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xEF); + *to_nxt++ = static_cast<uint8_t>(0xBB); + *to_nxt++ = static_cast<uint8_t>(0xBF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint16_t wc = *frm_nxt; + if ((wc & 0xF800) == 0xD800 || wc > Maxcode) + return codecvt_base::error; + if (wc < 0x0080) + { + if (to_end-to_nxt < 1) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc); + } + else if (wc < 0x0800) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F)); + } + else // if (wc <= 0xFFFF) + { + if (to_end-to_nxt < 3) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xE0 | (wc >> 12)); + *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6)); + *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x003F)); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf8_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt) + { + uint8_t c1 = static_cast<uint8_t>(*frm_nxt); + if (c1 < 0x80) + { + if (c1 > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint16_t>(c1); + ++frm_nxt; + } + else if (c1 < 0xC2) + { + return codecvt_base::error; + } + else if (c1 < 0xE0) + { + if (frm_end-frm_nxt < 2) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) + | (c2 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + return codecvt_base::partial; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return codecvt_base::error; + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return codecvt_base::error; + break; + default: + if ((c2 & 0xC0) != 0x80) + return codecvt_base::error; + break; + } + if ((c3 & 0xC0) != 0x80) + return codecvt_base::error; + uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12) + | ((c2 & 0x3F) << 6) + | (c3 & 0x3F)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 3; + } + else + { + return codecvt_base::error; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB && + frm_nxt[2] == 0xBF) + frm_nxt += 3; + } + for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t) + { + uint8_t c1 = static_cast<uint8_t>(*frm_nxt); + if (c1 < 0x80) + { + if (c1 > Maxcode) + break; + ++frm_nxt; + } + else if (c1 < 0xC2) + { + break; + } + else if (c1 < 0xE0) + { + if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80)) + break; + if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode) + break; + frm_nxt += 2; + } + else if (c1 < 0xF0) + { + if (frm_end-frm_nxt < 3) + break; + uint8_t c2 = frm_nxt[1]; + uint8_t c3 = frm_nxt[2]; + switch (c1) + { + case 0xE0: + if ((c2 & 0xE0) != 0xA0) + return static_cast<int>(frm_nxt - frm); + break; + case 0xED: + if ((c2 & 0xE0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + default: + if ((c2 & 0xC0) != 0x80) + return static_cast<int>(frm_nxt - frm); + break; + } + if ((c3 & 0xC0) != 0x80) + break; + if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode) + break; + frm_nxt += 3; + } + else + { + break; + } + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs4_to_utf16be(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xFE); + *to_nxt++ = static_cast<uint8_t>(0xFF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint32_t wc = *frm_nxt; + if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode) + return codecvt_base::error; + if (wc < 0x010000) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc >> 8); + *to_nxt++ = static_cast<uint8_t>(wc); + } + else + { + if (to_end-to_nxt < 4) + return codecvt_base::partial; + uint16_t t = static_cast<uint16_t>( + 0xD800 + | ((((wc & 0x1F0000) >> 16) - 1) << 6) + | ((wc & 0x00FC00) >> 10)); + *to_nxt++ = static_cast<uint8_t>(t >> 8); + *to_nxt++ = static_cast<uint8_t>(t); + t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF)); + *to_nxt++ = static_cast<uint8_t>(t >> 8); + *to_nxt++ = static_cast<uint8_t>(t); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) + frm_nxt += 2; + } + for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); + if ((c1 & 0xFC00) == 0xDC00) + return codecvt_base::error; + if ((c1 & 0xFC00) != 0xD800) + { + if (c1 > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>(c1); + frm_nxt += 2; + } + else + { + if (frm_end-frm_nxt < 4) + return codecvt_base::partial; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]); + if ((c2 & 0xFC00) != 0xDC00) + return codecvt_base::error; + uint32_t t = static_cast<uint32_t>( + ((((c1 & 0x03C0) >> 6) + 1) << 16) + | ((c1 & 0x003F) << 10) + | (c2 & 0x03FF)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 4; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) + frm_nxt += 2; + } + for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); + if ((c1 & 0xFC00) == 0xDC00) + break; + if ((c1 & 0xFC00) != 0xD800) + { + if (c1 > Maxcode) + break; + frm_nxt += 2; + } + else + { + if (frm_end-frm_nxt < 4) + break; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]); + if ((c2 & 0xFC00) != 0xDC00) + break; + uint32_t t = static_cast<uint32_t>( + ((((c1 & 0x03C0) >> 6) + 1) << 16) + | ((c1 & 0x003F) << 10) + | (c2 & 0x03FF)); + if (t > Maxcode) + break; + frm_nxt += 4; + } + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs4_to_utf16le(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xFF); + *to_nxt++ = static_cast<uint8_t>(0xFE); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint32_t wc = *frm_nxt; + if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode) + return codecvt_base::error; + if (wc < 0x010000) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc); + *to_nxt++ = static_cast<uint8_t>(wc >> 8); + } + else + { + if (to_end-to_nxt < 4) + return codecvt_base::partial; + uint16_t t = static_cast<uint16_t>( + 0xD800 + | ((((wc & 0x1F0000) >> 16) - 1) << 6) + | ((wc & 0x00FC00) >> 10)); + *to_nxt++ = static_cast<uint8_t>(t); + *to_nxt++ = static_cast<uint8_t>(t >> 8); + t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF)); + *to_nxt++ = static_cast<uint8_t>(t); + *to_nxt++ = static_cast<uint8_t>(t >> 8); + } + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE) + frm_nxt += 2; + } + for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); + if ((c1 & 0xFC00) == 0xDC00) + return codecvt_base::error; + if ((c1 & 0xFC00) != 0xD800) + { + if (c1 > Maxcode) + return codecvt_base::error; + *to_nxt = static_cast<uint32_t>(c1); + frm_nxt += 2; + } + else + { + if (frm_end-frm_nxt < 4) + return codecvt_base::partial; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]); + if ((c2 & 0xFC00) != 0xDC00) + return codecvt_base::error; + uint32_t t = static_cast<uint32_t>( + ((((c1 & 0x03C0) >> 6) + 1) << 16) + | ((c1 & 0x003F) << 10) + | (c2 & 0x03FF)); + if (t > Maxcode) + return codecvt_base::error; + *to_nxt = t; + frm_nxt += 4; + } + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE) + frm_nxt += 2; + } + for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); + if ((c1 & 0xFC00) == 0xDC00) + break; + if ((c1 & 0xFC00) != 0xD800) + { + if (c1 > Maxcode) + break; + frm_nxt += 2; + } + else + { + if (frm_end-frm_nxt < 4) + break; + uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]); + if ((c2 & 0xFC00) != 0xDC00) + break; + uint32_t t = static_cast<uint32_t>( + ((((c1 & 0x03C0) >> 6) + 1) << 16) + | ((c1 & 0x003F) << 10) + | (c2 & 0x03FF)); + if (t > Maxcode) + break; + frm_nxt += 4; + } + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs2_to_utf16be(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xFE); + *to_nxt++ = static_cast<uint8_t>(0xFF); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint16_t wc = *frm_nxt; + if ((wc & 0xF800) == 0xD800 || wc > Maxcode) + return codecvt_base::error; + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc >> 8); + *to_nxt++ = static_cast<uint8_t>(wc); + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf16be_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) + frm_nxt += 2; + } + for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); + if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) + return codecvt_base::error; + *to_nxt = c1; + frm_nxt += 2; + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF) + frm_nxt += 2; + } + for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]); + if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) + break; + frm_nxt += 2; + } + return static_cast<int>(frm_nxt - frm); +} + +static +codecvt_base::result +ucs2_to_utf16le(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt, + uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & generate_header) + { + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(0xFF); + *to_nxt++ = static_cast<uint8_t>(0xFE); + } + for (; frm_nxt < frm_end; ++frm_nxt) + { + uint16_t wc = *frm_nxt; + if ((wc & 0xF800) == 0xD800 || wc > Maxcode) + return codecvt_base::error; + if (to_end-to_nxt < 2) + return codecvt_base::partial; + *to_nxt++ = static_cast<uint8_t>(wc); + *to_nxt++ = static_cast<uint8_t>(wc >> 8); + } + return codecvt_base::ok; +} + +static +codecvt_base::result +utf16le_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt, + uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt, + unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0)) +{ + frm_nxt = frm; + to_nxt = to; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE) + frm_nxt += 2; + } + for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); + if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) + return codecvt_base::error; + *to_nxt = c1; + frm_nxt += 2; + } + return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok; +} + +static +int +utf16le_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end, + size_t mx, unsigned long Maxcode = 0x10FFFF, + codecvt_mode mode = codecvt_mode(0)) +{ + const uint8_t* frm_nxt = frm; + frm_nxt = frm; + if (mode & consume_header) + { + if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE) + frm_nxt += 2; + } + for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t) + { + uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]); + if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode) + break; + frm_nxt += 2; + } + return static_cast<int>(frm_nxt - frm); +} + +// template <> class codecvt<char16_t, char, mbstate_t> + +locale::id codecvt<char16_t, char, mbstate_t>::id; + +codecvt<char16_t, char, mbstate_t>::~codecvt() +{ +} + +codecvt<char16_t, char, mbstate_t>::result +codecvt<char16_t, char, mbstate_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char16_t, char, mbstate_t>::result +codecvt<char16_t, char, mbstate_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char16_t, char, mbstate_t>::result +codecvt<char16_t, char, mbstate_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +codecvt<char16_t, char, mbstate_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +codecvt<char16_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +codecvt<char16_t, char, mbstate_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_utf16_length(_frm, _frm_end, mx); +} + +int +codecvt<char16_t, char, mbstate_t>::do_max_length() const _NOEXCEPT +{ + return 4; +} + +// template <> class codecvt<char32_t, char, mbstate_t> + +locale::id codecvt<char32_t, char, mbstate_t>::id; + +codecvt<char32_t, char, mbstate_t>::~codecvt() +{ +} + +codecvt<char32_t, char, mbstate_t>::result +codecvt<char32_t, char, mbstate_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char32_t, char, mbstate_t>::result +codecvt<char32_t, char, mbstate_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +codecvt<char32_t, char, mbstate_t>::result +codecvt<char32_t, char, mbstate_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +codecvt<char32_t, char, mbstate_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +codecvt<char32_t, char, mbstate_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +codecvt<char32_t, char, mbstate_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_ucs4_length(_frm, _frm_end, mx); +} + +int +codecvt<char32_t, char, mbstate_t>::do_max_length() const _NOEXCEPT +{ + return 4; +} + +// __codecvt_utf8<wchar_t> + +__codecvt_utf8<wchar_t>::result +__codecvt_utf8<wchar_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<wchar_t>::result +__codecvt_utf8<wchar_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<wchar_t>::result +__codecvt_utf8<wchar_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8<wchar_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8<wchar_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8<wchar_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8<wchar_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 7; + return 4; +} + +// __codecvt_utf8<char16_t> + +__codecvt_utf8<char16_t>::result +__codecvt_utf8<char16_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<char16_t>::result +__codecvt_utf8<char16_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<char16_t>::result +__codecvt_utf8<char16_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8<char16_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8<char16_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8<char16_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8<char16_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 6; + return 3; +} + +// __codecvt_utf8<char32_t> + +__codecvt_utf8<char32_t>::result +__codecvt_utf8<char32_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<char32_t>::result +__codecvt_utf8<char32_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8<char32_t>::result +__codecvt_utf8<char32_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8<char32_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8<char32_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8<char32_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8<char32_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 7; + return 4; +} + +// __codecvt_utf16<wchar_t, false> + +__codecvt_utf16<wchar_t, false>::result +__codecvt_utf16<wchar_t, false>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<wchar_t, false>::result +__codecvt_utf16<wchar_t, false>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<wchar_t, false>::result +__codecvt_utf16<wchar_t, false>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<wchar_t, false>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<wchar_t, false>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<wchar_t, false>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<wchar_t, false>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 6; + return 4; +} + +// __codecvt_utf16<wchar_t, true> + +__codecvt_utf16<wchar_t, true>::result +__codecvt_utf16<wchar_t, true>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<wchar_t, true>::result +__codecvt_utf16<wchar_t, true>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<wchar_t, true>::result +__codecvt_utf16<wchar_t, true>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<wchar_t, true>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<wchar_t, true>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<wchar_t, true>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<wchar_t, true>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 6; + return 4; +} + +// __codecvt_utf16<char16_t, false> + +__codecvt_utf16<char16_t, false>::result +__codecvt_utf16<char16_t, false>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs2_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char16_t, false>::result +__codecvt_utf16<char16_t, false>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf16be_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char16_t, false>::result +__codecvt_utf16<char16_t, false>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<char16_t, false>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<char16_t, false>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<char16_t, false>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16be_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<char16_t, false>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 4; + return 2; +} + +// __codecvt_utf16<char16_t, true> + +__codecvt_utf16<char16_t, true>::result +__codecvt_utf16<char16_t, true>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs2_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char16_t, true>::result +__codecvt_utf16<char16_t, true>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf16le_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char16_t, true>::result +__codecvt_utf16<char16_t, true>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<char16_t, true>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<char16_t, true>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<char16_t, true>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16le_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<char16_t, true>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 4; + return 2; +} + +// __codecvt_utf16<char32_t, false> + +__codecvt_utf16<char32_t, false>::result +__codecvt_utf16<char32_t, false>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char32_t, false>::result +__codecvt_utf16<char32_t, false>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char32_t, false>::result +__codecvt_utf16<char32_t, false>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<char32_t, false>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<char32_t, false>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<char32_t, false>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<char32_t, false>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 6; + return 4; +} + +// __codecvt_utf16<char32_t, true> + +__codecvt_utf16<char32_t, true>::result +__codecvt_utf16<char32_t, true>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char32_t, true>::result +__codecvt_utf16<char32_t, true>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf16<char32_t, true>::result +__codecvt_utf16<char32_t, true>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf16<char32_t, true>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf16<char32_t, true>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf16<char32_t, true>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf16<char32_t, true>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 6; + return 4; +} + +// __codecvt_utf8_utf16<wchar_t> + +__codecvt_utf8_utf16<wchar_t>::result +__codecvt_utf8_utf16<wchar_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<wchar_t>::result +__codecvt_utf8_utf16<wchar_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<wchar_t>::result +__codecvt_utf8_utf16<wchar_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8_utf16<wchar_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8_utf16<wchar_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8_utf16<wchar_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8_utf16<wchar_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 7; + return 4; +} + +// __codecvt_utf8_utf16<char16_t> + +__codecvt_utf8_utf16<char16_t>::result +__codecvt_utf8_utf16<char16_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm); + const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end); + const uint16_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<char16_t>::result +__codecvt_utf8_utf16<char16_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint16_t* _to = reinterpret_cast<uint16_t*>(to); + uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end); + uint16_t* _to_nxt = _to; + result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<char16_t>::result +__codecvt_utf8_utf16<char16_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8_utf16<char16_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8_utf16<char16_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8_utf16<char16_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8_utf16<char16_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 7; + return 4; +} + +// __codecvt_utf8_utf16<char32_t> + +__codecvt_utf8_utf16<char32_t>::result +__codecvt_utf8_utf16<char32_t>::do_out(state_type&, + const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt, + extern_type* to, extern_type* to_end, extern_type*& to_nxt) const +{ + const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm); + const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end); + const uint32_t* _frm_nxt = _frm; + uint8_t* _to = reinterpret_cast<uint8_t*>(to); + uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end); + uint8_t* _to_nxt = _to; + result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<char32_t>::result +__codecvt_utf8_utf16<char32_t>::do_in(state_type&, + const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt, + intern_type* to, intern_type* to_end, intern_type*& to_nxt) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + const uint8_t* _frm_nxt = _frm; + uint32_t* _to = reinterpret_cast<uint32_t*>(to); + uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end); + uint32_t* _to_nxt = _to; + result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt, + _Maxcode_, _Mode_); + frm_nxt = frm + (_frm_nxt - _frm); + to_nxt = to + (_to_nxt - _to); + return r; +} + +__codecvt_utf8_utf16<char32_t>::result +__codecvt_utf8_utf16<char32_t>::do_unshift(state_type&, + extern_type* to, extern_type*, extern_type*& to_nxt) const +{ + to_nxt = to; + return noconv; +} + +int +__codecvt_utf8_utf16<char32_t>::do_encoding() const _NOEXCEPT +{ + return 0; +} + +bool +__codecvt_utf8_utf16<char32_t>::do_always_noconv() const _NOEXCEPT +{ + return false; +} + +int +__codecvt_utf8_utf16<char32_t>::do_length(state_type&, + const extern_type* frm, const extern_type* frm_end, size_t mx) const +{ + const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm); + const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end); + return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_); +} + +int +__codecvt_utf8_utf16<char32_t>::do_max_length() const _NOEXCEPT +{ + if (_Mode_ & consume_header) + return 7; + return 4; +} + +// __narrow_to_utf8<16> + +__narrow_to_utf8<16>::~__narrow_to_utf8() +{ +} + +// __narrow_to_utf8<32> + +__narrow_to_utf8<32>::~__narrow_to_utf8() +{ +} + +// __widen_from_utf8<16> + +__widen_from_utf8<16>::~__widen_from_utf8() +{ +} + +// __widen_from_utf8<32> + +__widen_from_utf8<32>::~__widen_from_utf8() +{ +} + +// numpunct<char> && numpunct<wchar_t> + +locale::id numpunct< char >::id; +locale::id numpunct<wchar_t>::id; + +numpunct<char>::numpunct(size_t refs) + : locale::facet(refs), + __decimal_point_('.'), + __thousands_sep_(',') +{ +} + +numpunct<wchar_t>::numpunct(size_t refs) + : locale::facet(refs), + __decimal_point_(L'.'), + __thousands_sep_(L',') +{ +} + +numpunct<char>::~numpunct() +{ +} + +numpunct<wchar_t>::~numpunct() +{ +} + + char numpunct< char >::do_decimal_point() const {return __decimal_point_;} +wchar_t numpunct<wchar_t>::do_decimal_point() const {return __decimal_point_;} + + char numpunct< char >::do_thousands_sep() const {return __thousands_sep_;} +wchar_t numpunct<wchar_t>::do_thousands_sep() const {return __thousands_sep_;} + +string numpunct< char >::do_grouping() const {return __grouping_;} +string numpunct<wchar_t>::do_grouping() const {return __grouping_;} + + string numpunct< char >::do_truename() const {return "true";} +wstring numpunct<wchar_t>::do_truename() const {return L"true";} + + string numpunct< char >::do_falsename() const {return "false";} +wstring numpunct<wchar_t>::do_falsename() const {return L"false";} + +// numpunct_byname<char> + +numpunct_byname<char>::numpunct_byname(const char* nm, size_t refs) + : numpunct<char>(refs) +{ + __init(nm); +} + +numpunct_byname<char>::numpunct_byname(const string& nm, size_t refs) + : numpunct<char>(refs) +{ + __init(nm.c_str()); +} + +numpunct_byname<char>::~numpunct_byname() +{ +} + +void +numpunct_byname<char>::__init(const char* nm) +{ + if (strcmp(nm, "C") != 0) + { + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("numpunct_byname<char>::numpunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->decimal_point) + __decimal_point_ = *lc->decimal_point; + if (*lc->thousands_sep) + __thousands_sep_ = *lc->thousands_sep; + __grouping_ = lc->grouping; + // localization for truename and falsename is not available + } +} + +// numpunct_byname<wchar_t> + +numpunct_byname<wchar_t>::numpunct_byname(const char* nm, size_t refs) + : numpunct<wchar_t>(refs) +{ + __init(nm); +} + +numpunct_byname<wchar_t>::numpunct_byname(const string& nm, size_t refs) + : numpunct<wchar_t>(refs) +{ + __init(nm.c_str()); +} + +numpunct_byname<wchar_t>::~numpunct_byname() +{ +} + +void +numpunct_byname<wchar_t>::__init(const char* nm) +{ + if (strcmp(nm, "C") != 0) + { + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("numpunct_byname<char>::numpunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->decimal_point) + __decimal_point_ = *lc->decimal_point; + if (*lc->thousands_sep) + __thousands_sep_ = *lc->thousands_sep; + __grouping_ = lc->grouping; + // locallization for truename and falsename is not available + } +} + +// num_get helpers + +int +__num_get_base::__get_base(ios_base& iob) +{ + ios_base::fmtflags __basefield = iob.flags() & ios_base::basefield; + if (__basefield == ios_base::oct) + return 8; + else if (__basefield == ios_base::hex) + return 16; + else if (__basefield == 0) + return 0; + return 10; +} + +const char __num_get_base::__src[33] = "0123456789abcdefABCDEFxX+-pPiInN"; + +void +__check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end, + ios_base::iostate& __err) +{ + if (__grouping.size() != 0) + { + reverse(__g, __g_end); + const char* __ig = __grouping.data(); + const char* __eg = __ig + __grouping.size(); + for (unsigned* __r = __g; __r < __g_end-1; ++__r) + { + if (0 < *__ig && *__ig < numeric_limits<char>::max()) + { + if (static_cast<unsigned>(*__ig) != *__r) + { + __err = ios_base::failbit; + return; + } + } + if (__eg - __ig > 1) + ++__ig; + } + if (0 < *__ig && *__ig < numeric_limits<char>::max()) + { + if (static_cast<unsigned>(*__ig) < __g_end[-1] || __g_end[-1] == 0) + __err = ios_base::failbit; + } + } +} + +void +__num_put_base::__format_int(char* __fmtp, const char* __len, bool __signd, + ios_base::fmtflags __flags) +{ + if (__flags & ios_base::showpos) + *__fmtp++ = '+'; + if (__flags & ios_base::showbase) + *__fmtp++ = '#'; + while(*__len) + *__fmtp++ = *__len++; + if ((__flags & ios_base::basefield) == ios_base::oct) + *__fmtp = 'o'; + else if ((__flags & ios_base::basefield) == ios_base::hex) + { + if (__flags & ios_base::uppercase) + *__fmtp = 'X'; + else + *__fmtp = 'x'; + } + else if (__signd) + *__fmtp = 'd'; + else + *__fmtp = 'u'; +} + +bool +__num_put_base::__format_float(char* __fmtp, const char* __len, + ios_base::fmtflags __flags) +{ + bool specify_precision = true; + if (__flags & ios_base::showpos) + *__fmtp++ = '+'; + if (__flags & ios_base::showpoint) + *__fmtp++ = '#'; + ios_base::fmtflags floatfield = __flags & ios_base::floatfield; + bool uppercase = __flags & ios_base::uppercase; + if (floatfield == (ios_base::fixed | ios_base::scientific)) + specify_precision = false; + else + { + *__fmtp++ = '.'; + *__fmtp++ = '*'; + } + while(*__len) + *__fmtp++ = *__len++; + if (floatfield == ios_base::fixed) + { + if (uppercase) + *__fmtp = 'F'; + else + *__fmtp = 'f'; + } + else if (floatfield == ios_base::scientific) + { + if (uppercase) + *__fmtp = 'E'; + else + *__fmtp = 'e'; + } + else if (floatfield == (ios_base::fixed | ios_base::scientific)) + { + if (uppercase) + *__fmtp = 'A'; + else + *__fmtp = 'a'; + } + else + { + if (uppercase) + *__fmtp = 'G'; + else + *__fmtp = 'g'; + } + return specify_precision; +} + +char* +__num_put_base::__identify_padding(char* __nb, char* __ne, + const ios_base& __iob) +{ + switch (__iob.flags() & ios_base::adjustfield) + { + case ios_base::internal: + if (__nb[0] == '-' || __nb[0] == '+') + return __nb+1; + if (__ne - __nb >= 2 && __nb[0] == '0' + && (__nb[1] == 'x' || __nb[1] == 'X')) + return __nb+2; + break; + case ios_base::left: + return __ne; + case ios_base::right: + default: + break; + } + return __nb; +} + +// time_get + +static +string* +init_weeks() +{ + static string weeks[14]; + weeks[0] = "Sunday"; + weeks[1] = "Monday"; + weeks[2] = "Tuesday"; + weeks[3] = "Wednesday"; + weeks[4] = "Thursday"; + weeks[5] = "Friday"; + weeks[6] = "Saturday"; + weeks[7] = "Sun"; + weeks[8] = "Mon"; + weeks[9] = "Tue"; + weeks[10] = "Wed"; + weeks[11] = "Thu"; + weeks[12] = "Fri"; + weeks[13] = "Sat"; + return weeks; +} + +static +wstring* +init_wweeks() +{ + static wstring weeks[14]; + weeks[0] = L"Sunday"; + weeks[1] = L"Monday"; + weeks[2] = L"Tuesday"; + weeks[3] = L"Wednesday"; + weeks[4] = L"Thursday"; + weeks[5] = L"Friday"; + weeks[6] = L"Saturday"; + weeks[7] = L"Sun"; + weeks[8] = L"Mon"; + weeks[9] = L"Tue"; + weeks[10] = L"Wed"; + weeks[11] = L"Thu"; + weeks[12] = L"Fri"; + weeks[13] = L"Sat"; + return weeks; +} + +template <> +const string* +__time_get_c_storage<char>::__weeks() const +{ + static const string* weeks = init_weeks(); + return weeks; +} + +template <> +const wstring* +__time_get_c_storage<wchar_t>::__weeks() const +{ + static const wstring* weeks = init_wweeks(); + return weeks; +} + +static +string* +init_months() +{ + static string months[24]; + months[0] = "January"; + months[1] = "February"; + months[2] = "March"; + months[3] = "April"; + months[4] = "May"; + months[5] = "June"; + months[6] = "July"; + months[7] = "August"; + months[8] = "September"; + months[9] = "October"; + months[10] = "November"; + months[11] = "December"; + months[12] = "Jan"; + months[13] = "Feb"; + months[14] = "Mar"; + months[15] = "Apr"; + months[16] = "May"; + months[17] = "Jun"; + months[18] = "Jul"; + months[19] = "Aug"; + months[20] = "Sep"; + months[21] = "Oct"; + months[22] = "Nov"; + months[23] = "Dec"; + return months; +} + +static +wstring* +init_wmonths() +{ + static wstring months[24]; + months[0] = L"January"; + months[1] = L"February"; + months[2] = L"March"; + months[3] = L"April"; + months[4] = L"May"; + months[5] = L"June"; + months[6] = L"July"; + months[7] = L"August"; + months[8] = L"September"; + months[9] = L"October"; + months[10] = L"November"; + months[11] = L"December"; + months[12] = L"Jan"; + months[13] = L"Feb"; + months[14] = L"Mar"; + months[15] = L"Apr"; + months[16] = L"May"; + months[17] = L"Jun"; + months[18] = L"Jul"; + months[19] = L"Aug"; + months[20] = L"Sep"; + months[21] = L"Oct"; + months[22] = L"Nov"; + months[23] = L"Dec"; + return months; +} + +template <> +const string* +__time_get_c_storage<char>::__months() const +{ + static const string* months = init_months(); + return months; +} + +template <> +const wstring* +__time_get_c_storage<wchar_t>::__months() const +{ + static const wstring* months = init_wmonths(); + return months; +} + +static +string* +init_am_pm() +{ + static string am_pm[24]; + am_pm[0] = "AM"; + am_pm[1] = "PM"; + return am_pm; +} + +static +wstring* +init_wam_pm() +{ + static wstring am_pm[24]; + am_pm[0] = L"AM"; + am_pm[1] = L"PM"; + return am_pm; +} + +template <> +const string* +__time_get_c_storage<char>::__am_pm() const +{ + static const string* am_pm = init_am_pm(); + return am_pm; +} + +template <> +const wstring* +__time_get_c_storage<wchar_t>::__am_pm() const +{ + static const wstring* am_pm = init_wam_pm(); + return am_pm; +} + +template <> +const string& +__time_get_c_storage<char>::__x() const +{ + static string s("%m/%d/%y"); + return s; +} + +template <> +const wstring& +__time_get_c_storage<wchar_t>::__x() const +{ + static wstring s(L"%m/%d/%y"); + return s; +} + +template <> +const string& +__time_get_c_storage<char>::__X() const +{ + static string s("%H:%M:%S"); + return s; +} + +template <> +const wstring& +__time_get_c_storage<wchar_t>::__X() const +{ + static wstring s(L"%H:%M:%S"); + return s; +} + +template <> +const string& +__time_get_c_storage<char>::__c() const +{ + static string s("%a %b %d %H:%M:%S %Y"); + return s; +} + +template <> +const wstring& +__time_get_c_storage<wchar_t>::__c() const +{ + static wstring s(L"%a %b %d %H:%M:%S %Y"); + return s; +} + +template <> +const string& +__time_get_c_storage<char>::__r() const +{ + static string s("%I:%M:%S %p"); + return s; +} + +template <> +const wstring& +__time_get_c_storage<wchar_t>::__r() const +{ + static wstring s(L"%I:%M:%S %p"); + return s; +} + +// time_get_byname + +__time_get::__time_get(const char* nm) + : __loc_(newlocale(LC_ALL_MASK, nm, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__loc_ == 0) + throw runtime_error("time_get_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +__time_get::__time_get(const string& nm) + : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__loc_ == 0) + throw runtime_error("time_get_byname" + " failed to construct for " + nm); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +__time_get::~__time_get() +{ + freelocale(__loc_); +} + +#pragma clang diagnostic ignored "-Wmissing-field-initializers" + +template <> +string +__time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct) +{ + tm t = {0}; + t.tm_sec = 59; + t.tm_min = 55; + t.tm_hour = 23; + t.tm_mday = 31; + t.tm_mon = 11; + t.tm_year = 161; + t.tm_wday = 6; + t.tm_yday = 364; + t.tm_isdst = -1; + char buf[100]; + char f[3] = {0}; + f[0] = '%'; + f[1] = fmt; + size_t n = strftime_l(buf, 100, f, &t, __loc_); + char* bb = buf; + char* be = buf + n; + string result; + while (bb != be) + { + if (ct.is(ctype_base::space, *bb)) + { + result.push_back(' '); + for (++bb; bb != be && ct.is(ctype_base::space, *bb); ++bb) + ; + continue; + } + char* w = bb; + ios_base::iostate err = ios_base::goodbit; + ptrdiff_t i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14, + ct, err, false) + - this->__weeks_; + if (i < 14) + { + result.push_back('%'); + if (i < 7) + result.push_back('A'); + else + result.push_back('a'); + bb = w; + continue; + } + w = bb; + i = __scan_keyword(w, be, this->__months_, this->__months_+24, + ct, err, false) + - this->__months_; + if (i < 24) + { + result.push_back('%'); + if (i < 12) + result.push_back('B'); + else + result.push_back('b'); + if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0])) + result.back() = 'm'; + bb = w; + continue; + } + if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0) + { + w = bb; + i = __scan_keyword(w, be, this->__am_pm_, this->__am_pm_+2, + ct, err, false) - this->__am_pm_; + if (i < 2) + { + result.push_back('%'); + result.push_back('p'); + bb = w; + continue; + } + } + w = bb; + if (ct.is(ctype_base::digit, *bb)) + { + switch(__get_up_to_n_digits(bb, be, err, ct, 4)) + { + case 6: + result.push_back('%'); + result.push_back('w'); + break; + case 7: + result.push_back('%'); + result.push_back('u'); + break; + case 11: + result.push_back('%'); + result.push_back('I'); + break; + case 12: + result.push_back('%'); + result.push_back('m'); + break; + case 23: + result.push_back('%'); + result.push_back('H'); + break; + case 31: + result.push_back('%'); + result.push_back('d'); + break; + case 55: + result.push_back('%'); + result.push_back('M'); + break; + case 59: + result.push_back('%'); + result.push_back('S'); + break; + case 61: + result.push_back('%'); + result.push_back('y'); + break; + case 364: + result.push_back('%'); + result.push_back('j'); + break; + case 2061: + result.push_back('%'); + result.push_back('Y'); + break; + default: + for (; w != bb; ++w) + result.push_back(*w); + break; + } + continue; + } + if (*bb == '%') + { + result.push_back('%'); + result.push_back('%'); + ++bb; + continue; + } + result.push_back(*bb); + ++bb; + } + return result; +} + +#pragma clang diagnostic ignored "-Wmissing-braces" + +template <> +wstring +__time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct) +{ + tm t = {0}; + t.tm_sec = 59; + t.tm_min = 55; + t.tm_hour = 23; + t.tm_mday = 31; + t.tm_mon = 11; + t.tm_year = 161; + t.tm_wday = 6; + t.tm_yday = 364; + t.tm_isdst = -1; + char buf[100]; + char f[3] = {0}; + f[0] = '%'; + f[1] = fmt; + strftime_l(buf, 100, f, &t, __loc_); + wchar_t wbuf[100]; + wchar_t* wbb = wbuf; + mbstate_t mb = {0}; + const char* bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + size_t j = __mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wchar_t* wbe = wbb + j; + wstring result; + while (wbb != wbe) + { + if (ct.is(ctype_base::space, *wbb)) + { + result.push_back(L' '); + for (++wbb; wbb != wbe && ct.is(ctype_base::space, *wbb); ++wbb) + ; + continue; + } + wchar_t* w = wbb; + ios_base::iostate err = ios_base::goodbit; + ptrdiff_t i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14, + ct, err, false) + - this->__weeks_; + if (i < 14) + { + result.push_back(L'%'); + if (i < 7) + result.push_back(L'A'); + else + result.push_back(L'a'); + wbb = w; + continue; + } + w = wbb; + i = __scan_keyword(w, wbe, this->__months_, this->__months_+24, + ct, err, false) + - this->__months_; + if (i < 24) + { + result.push_back(L'%'); + if (i < 12) + result.push_back(L'B'); + else + result.push_back(L'b'); + if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0])) + result.back() = L'm'; + wbb = w; + continue; + } + if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0) + { + w = wbb; + i = __scan_keyword(w, wbe, this->__am_pm_, this->__am_pm_+2, + ct, err, false) - this->__am_pm_; + if (i < 2) + { + result.push_back(L'%'); + result.push_back(L'p'); + wbb = w; + continue; + } + } + w = wbb; + if (ct.is(ctype_base::digit, *wbb)) + { + switch(__get_up_to_n_digits(wbb, wbe, err, ct, 4)) + { + case 6: + result.push_back(L'%'); + result.push_back(L'w'); + break; + case 7: + result.push_back(L'%'); + result.push_back(L'u'); + break; + case 11: + result.push_back(L'%'); + result.push_back(L'I'); + break; + case 12: + result.push_back(L'%'); + result.push_back(L'm'); + break; + case 23: + result.push_back(L'%'); + result.push_back(L'H'); + break; + case 31: + result.push_back(L'%'); + result.push_back(L'd'); + break; + case 55: + result.push_back(L'%'); + result.push_back(L'M'); + break; + case 59: + result.push_back(L'%'); + result.push_back(L'S'); + break; + case 61: + result.push_back(L'%'); + result.push_back(L'y'); + break; + case 364: + result.push_back(L'%'); + result.push_back(L'j'); + break; + case 2061: + result.push_back(L'%'); + result.push_back(L'Y'); + break; + default: + for (; w != wbb; ++w) + result.push_back(*w); + break; + } + continue; + } + if (ct.narrow(*wbb, 0) == '%') + { + result.push_back(L'%'); + result.push_back(L'%'); + ++wbb; + continue; + } + result.push_back(*wbb); + ++wbb; + } + return result; +} + +template <> +void +__time_get_storage<char>::init(const ctype<char>& ct) +{ + tm t; + char buf[100]; + // __weeks_ + for (int i = 0; i < 7; ++i) + { + t.tm_wday = i; + strftime_l(buf, 100, "%A", &t, __loc_); + __weeks_[i] = buf; + strftime_l(buf, 100, "%a", &t, __loc_); + __weeks_[i+7] = buf; + } + // __months_ + for (int i = 0; i < 12; ++i) + { + t.tm_mon = i; + strftime_l(buf, 100, "%B", &t, __loc_); + __months_[i] = buf; + strftime_l(buf, 100, "%b", &t, __loc_); + __months_[i+12] = buf; + } + // __am_pm_ + t.tm_hour = 1; + strftime_l(buf, 100, "%p", &t, __loc_); + __am_pm_[0] = buf; + t.tm_hour = 13; + strftime_l(buf, 100, "%p", &t, __loc_); + __am_pm_[1] = buf; + __c_ = __analyze('c', ct); + __r_ = __analyze('r', ct); + __x_ = __analyze('x', ct); + __X_ = __analyze('X', ct); +} + +template <> +void +__time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct) +{ + tm t = {0}; + char buf[100]; + size_t be; + wchar_t wbuf[100]; + wchar_t* wbe; + mbstate_t mb = {0}; + // __weeks_ + for (int i = 0; i < 7; ++i) + { + t.tm_wday = i; + be = strftime_l(buf, 100, "%A", &t, __loc_); + mb = mbstate_t(); + const char* bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __weeks_[i].assign(wbuf, wbe); + be = strftime_l(buf, 100, "%a", &t, __loc_); + mb = mbstate_t(); + bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __weeks_[i+7].assign(wbuf, wbe); + } + // __months_ + for (int i = 0; i < 12; ++i) + { + t.tm_mon = i; + be = strftime_l(buf, 100, "%B", &t, __loc_); + mb = mbstate_t(); + const char* bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __months_[i].assign(wbuf, wbe); + be = strftime_l(buf, 100, "%b", &t, __loc_); + mb = mbstate_t(); + bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __months_[i+12].assign(wbuf, wbe); + } + // __am_pm_ + t.tm_hour = 1; + be = strftime_l(buf, 100, "%p", &t, __loc_); + mb = mbstate_t(); + const char* bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __am_pm_[0].assign(wbuf, wbe); + t.tm_hour = 13; + be = strftime_l(buf, 100, "%p", &t, __loc_); + mb = mbstate_t(); + bb = buf; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __am_pm_[1].assign(wbuf, wbe); + __c_ = __analyze('c', ct); + __r_ = __analyze('r', ct); + __x_ = __analyze('x', ct); + __X_ = __analyze('X', ct); +} + +template <class CharT> +struct _LIBCPP_HIDDEN __time_get_temp + : public ctype_byname<CharT> +{ + explicit __time_get_temp(const char* nm) + : ctype_byname<CharT>(nm, 1) {} + explicit __time_get_temp(const string& nm) + : ctype_byname<CharT>(nm, 1) {} +}; + +template <> +__time_get_storage<char>::__time_get_storage(const char* __nm) + : __time_get(__nm) +{ + const __time_get_temp<char> ct(__nm); + init(ct); +} + +template <> +__time_get_storage<char>::__time_get_storage(const string& __nm) + : __time_get(__nm) +{ + const __time_get_temp<char> ct(__nm); + init(ct); +} + +template <> +__time_get_storage<wchar_t>::__time_get_storage(const char* __nm) + : __time_get(__nm) +{ + const __time_get_temp<wchar_t> ct(__nm); + init(ct); +} + +template <> +__time_get_storage<wchar_t>::__time_get_storage(const string& __nm) + : __time_get(__nm) +{ + const __time_get_temp<wchar_t> ct(__nm); + init(ct); +} + +template <> +time_base::dateorder +__time_get_storage<char>::__do_date_order() const +{ + unsigned i; + for (i = 0; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + ++i; + switch (__x_[i]) + { + case 'y': + case 'Y': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + switch (__x_[i]) + { + case 'm': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'd') + return time_base::ymd; + break; + case 'd': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'm') + return time_base::ydm; + break; + } + break; + case 'm': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'd') + { + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'y' || __x_[i] == 'Y') + return time_base::mdy; + break; + } + break; + case 'd': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'm') + { + for (++i; i < __x_.size(); ++i) + if (__x_[i] == '%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == 'y' || __x_[i] == 'Y') + return time_base::dmy; + break; + } + break; + } + return time_base::no_order; +} + +template <> +time_base::dateorder +__time_get_storage<wchar_t>::__do_date_order() const +{ + unsigned i; + for (i = 0; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + ++i; + switch (__x_[i]) + { + case L'y': + case L'Y': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + switch (__x_[i]) + { + case L'm': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'd') + return time_base::ymd; + break; + case L'd': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'm') + return time_base::ydm; + break; + } + break; + case L'm': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'd') + { + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'y' || __x_[i] == L'Y') + return time_base::mdy; + break; + } + break; + case L'd': + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'm') + { + for (++i; i < __x_.size(); ++i) + if (__x_[i] == L'%') + break; + if (i == __x_.size()) + break; + ++i; + if (__x_[i] == L'y' || __x_[i] == L'Y') + return time_base::dmy; + break; + } + break; + } + return time_base::no_order; +} + +// time_put + +__time_put::__time_put(const char* nm) + : __loc_(newlocale(LC_ALL_MASK, nm, 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__loc_ == 0) + throw runtime_error("time_put_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +__time_put::__time_put(const string& nm) + : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0)) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + if (__loc_ == 0) + throw runtime_error("time_put_byname" + " failed to construct for " + nm); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +__time_put::~__time_put() +{ + if (__loc_) + freelocale(__loc_); +} + +void +__time_put::__do_put(char* __nb, char*& __ne, const tm* __tm, + char __fmt, char __mod) const +{ + char fmt[] = {'%', __fmt, __mod, 0}; + if (__mod != 0) + swap(fmt[1], fmt[2]); + size_t n = strftime_l(__nb, static_cast<size_t>(__ne-__nb), fmt, __tm, __loc_); + __ne = __nb + n; +} + +void +__time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm, + char __fmt, char __mod) const +{ + char __nar[100]; + char* __ne = __nar + 100; + __do_put(__nar, __ne, __tm, __fmt, __mod); + mbstate_t mb = {0}; + const char* __nb = __nar; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(__wb, &__nb, 100, &mb, __loc_); +#else + size_t j = __mbsrtowcs_l(__wb, &__nb, 100, &mb, __loc_); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + __we = __wb + j; +} + +// moneypunct_byname + +template <class charT> +static +void +__init_pat(money_base::pattern& pat, basic_string<charT>& __curr_symbol_, + bool intl, char cs_precedes, char sep_by_space, char sign_posn, + charT space_char) +{ + const char sign = static_cast<char>(money_base::sign); + const char space = static_cast<char>(money_base::space); + const char none = static_cast<char>(money_base::none); + const char symbol = static_cast<char>(money_base::symbol); + const char value = static_cast<char>(money_base::value); + const bool symbol_contains_sep = intl && __curr_symbol_.size() == 4; + + // Comments on case branches reflect 'C11 7.11.2.1 The localeconv + // function'. "Space between sign and symbol or value" means that + // if the sign is adjacent to the symbol, there's a space between + // them, and otherwise there's a space between the sign and value. + // + // C11's localeconv specifies that the fourth character of an + // international curr_symbol is used to separate the sign and + // value when sep_by_space says to do so. C++ can't represent + // that, so we just use a space. When sep_by_space says to + // separate the symbol and value-or-sign with a space, we rearrange the + // curr_symbol to put its spacing character on the correct side of + // the symbol. + // + // We also need to avoid adding an extra space between the sign + // and value when the currency symbol is suppressed (by not + // setting showbase). We match glibc's strfmon by interpreting + // sep_by_space==1 as "omit the space when the currency symbol is + // absent". + // + // Users who want to get this right should use ICU instead. + + switch (cs_precedes) + { + case 0: // value before curr_symbol + if (symbol_contains_sep) { + // Move the separator to before the symbol, to place it + // between the value and symbol. + rotate(__curr_symbol_.begin(), __curr_symbol_.begin() + 3, + __curr_symbol_.end()); + } + switch (sign_posn) + { + case 0: // Parentheses surround the quantity and currency symbol. + pat.field[0] = sign; + pat.field[1] = value; + pat.field[2] = none; // Any space appears in the symbol. + pat.field[3] = symbol; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + // This case may have changed between C99 and C11; + // assume the currency symbol matches the intention. + case 2: // Space between sign and currency or value. + // The "sign" is two parentheses, so no space here either. + return; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + return; + default: + break; + } + break; + case 1: // The sign string precedes the quantity and currency symbol. + pat.field[0] = sign; + pat.field[3] = symbol; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = value; + pat.field[2] = none; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = value; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = space; + pat.field[2] = value; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.erase(__curr_symbol_.begin()); + } + return; + default: + break; + } + break; + case 2: // The sign string succeeds the quantity and currency symbol. + pat.field[0] = value; + pat.field[3] = sign; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = none; + pat.field[2] = symbol; + return; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + pat.field[1] = none; + pat.field[2] = symbol; + return; + case 2: // Space between sign and currency or value. + pat.field[1] = symbol; + pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not be removed if showbase is absent. + __curr_symbol_.erase(__curr_symbol_.begin()); + } + return; + default: + break; + } + break; + case 3: // The sign string immediately precedes the currency symbol. + pat.field[0] = value; + pat.field[3] = symbol; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = none; + pat.field[2] = sign; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = space; + pat.field[2] = sign; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared before the sign. + __curr_symbol_.erase(__curr_symbol_.begin()); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = sign; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + return; + default: + break; + } + break; + case 4: // The sign string immediately succeeds the currency symbol. + pat.field[0] = value; + pat.field[3] = sign; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = none; + pat.field[2] = symbol; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = none; + pat.field[2] = symbol; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = symbol; + pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not disappear when showbase is absent. + __curr_symbol_.erase(__curr_symbol_.begin()); + } + return; + default: + break; + } + break; + default: + break; + } + break; + case 1: // curr_symbol before value + switch (sign_posn) + { + case 0: // Parentheses surround the quantity and currency symbol. + pat.field[0] = sign; + pat.field[1] = symbol; + pat.field[2] = none; // Any space appears in the symbol. + pat.field[3] = value; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + // This case may have changed between C99 and C11; + // assume the currency symbol matches the intention. + case 2: // Space between sign and currency or value. + // The "sign" is two parentheses, so no space here either. + return; + case 1: // Space between currency-and-sign or currency and value. + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.insert(0, 1, space_char); + } + return; + default: + break; + } + break; + case 1: // The sign string precedes the quantity and currency symbol. + pat.field[0] = sign; + pat.field[3] = value; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = symbol; + pat.field[2] = none; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = symbol; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = space; + pat.field[2] = symbol; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.pop_back(); + } + return; + default: + break; + } + break; + case 2: // The sign string succeeds the quantity and currency symbol. + pat.field[0] = symbol; + pat.field[3] = sign; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = none; + pat.field[2] = value; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = none; + pat.field[2] = value; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = value; + pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // will appear before the sign. + __curr_symbol_.pop_back(); + } + return; + default: + break; + } + break; + case 3: // The sign string immediately precedes the currency symbol. + pat.field[0] = sign; + pat.field[3] = value; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = symbol; + pat.field[2] = none; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = symbol; + pat.field[2] = none; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[2]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = space; + pat.field[2] = symbol; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // has already appeared after the sign. + __curr_symbol_.pop_back(); + } + return; + default: + break; + } + break; + case 4: // The sign string immediately succeeds the currency symbol. + pat.field[0] = symbol; + pat.field[3] = value; + switch (sep_by_space) + { + case 0: // No space separates the currency symbol and value. + pat.field[1] = sign; + pat.field[2] = none; + return; + case 1: // Space between currency-and-sign or currency and value. + pat.field[1] = sign; + pat.field[2] = space; + if (symbol_contains_sep) { + // Remove the separator from the symbol, since it + // should not disappear when showbase is absent. + __curr_symbol_.pop_back(); + } + return; + case 2: // Space between sign and currency or value. + pat.field[1] = none; + pat.field[2] = sign; + if (!symbol_contains_sep) { + // We insert the space into the symbol instead of + // setting pat.field[1]=space so that when + // showbase is not set, the space goes away too. + __curr_symbol_.push_back(space_char); + } + return; + default: + break; + } + break; + default: + break; + } + break; + default: + break; + } + pat.field[0] = symbol; + pat.field[1] = sign; + pat.field[2] = none; + pat.field[3] = value; +} + +template<> +void +moneypunct_byname<char, false>::init(const char* nm) +{ + typedef moneypunct<char, false> base; + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("moneypunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->mon_decimal_point) + __decimal_point_ = *lc->mon_decimal_point; + else + __decimal_point_ = base::do_decimal_point(); + if (*lc->mon_thousands_sep) + __thousands_sep_ = *lc->mon_thousands_sep; + else + __thousands_sep_ = base::do_thousands_sep(); + __grouping_ = lc->mon_grouping; + __curr_symbol_ = lc->currency_symbol; + if (lc->frac_digits != CHAR_MAX) + __frac_digits_ = lc->frac_digits; + else + __frac_digits_ = base::do_frac_digits(); + if (lc->p_sign_posn == 0) + __positive_sign_ = "()"; + else + __positive_sign_ = lc->positive_sign; + if (lc->n_sign_posn == 0) + __negative_sign_ = "()"; + else + __negative_sign_ = lc->negative_sign; + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; + __init_pat(__pos_format_, __dummy_curr_symbol, false, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, false, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' '); +} + +template<> +void +moneypunct_byname<char, true>::init(const char* nm) +{ + typedef moneypunct<char, true> base; + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("moneypunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->mon_decimal_point) + __decimal_point_ = *lc->mon_decimal_point; + else + __decimal_point_ = base::do_decimal_point(); + if (*lc->mon_thousands_sep) + __thousands_sep_ = *lc->mon_thousands_sep; + else + __thousands_sep_ = base::do_thousands_sep(); + __grouping_ = lc->mon_grouping; + __curr_symbol_ = lc->int_curr_symbol; + if (lc->int_frac_digits != CHAR_MAX) + __frac_digits_ = lc->int_frac_digits; + else + __frac_digits_ = base::do_frac_digits(); +#if _WIN32 + if (lc->p_sign_posn == 0) +#else // _WIN32 + if (lc->int_p_sign_posn == 0) +#endif //_WIN32 + __positive_sign_ = "()"; + else + __positive_sign_ = lc->positive_sign; +#if _WIN32 + if(lc->n_sign_posn == 0) +#else // _WIN32 + if (lc->int_n_sign_posn == 0) +#endif // _WIN32 + __negative_sign_ = "()"; + else + __negative_sign_ = lc->negative_sign; + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; +#if _WIN32 + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' '); +#else + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->int_p_cs_precedes, lc->int_p_sep_by_space, + lc->int_p_sign_posn, ' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->int_n_cs_precedes, lc->int_n_sep_by_space, + lc->int_n_sign_posn, ' '); +#endif // _WIN32 +} + +template<> +void +moneypunct_byname<wchar_t, false>::init(const char* nm) +{ + typedef moneypunct<wchar_t, false> base; + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("moneypunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->mon_decimal_point) + __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point); + else + __decimal_point_ = base::do_decimal_point(); + if (*lc->mon_thousands_sep) + __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep); + else + __thousands_sep_ = base::do_thousands_sep(); + __grouping_ = lc->mon_grouping; + wchar_t wbuf[100]; + mbstate_t mb = {0}; + const char* bb = lc->currency_symbol; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wchar_t* wbe = wbuf + j; + __curr_symbol_.assign(wbuf, wbe); + if (lc->frac_digits != CHAR_MAX) + __frac_digits_ = lc->frac_digits; + else + __frac_digits_ = base::do_frac_digits(); + if (lc->p_sign_posn == 0) + __positive_sign_ = L"()"; + else + { + mb = mbstate_t(); + bb = lc->positive_sign; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __positive_sign_.assign(wbuf, wbe); + } + if (lc->n_sign_posn == 0) + __negative_sign_ = L"()"; + else + { + mb = mbstate_t(); + bb = lc->negative_sign; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __negative_sign_.assign(wbuf, wbe); + } + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; + __init_pat(__pos_format_, __dummy_curr_symbol, false, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, false, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' '); +} + +template<> +void +moneypunct_byname<wchar_t, true>::init(const char* nm) +{ + typedef moneypunct<wchar_t, true> base; + __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (loc == nullptr) + throw runtime_error("moneypunct_byname" + " failed to construct for " + string(nm)); +#endif // _LIBCPP_NO_EXCEPTIONS +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + lconv* lc = localeconv_l(loc.get()); +#else + lconv* lc = __localeconv_l(loc.get()); +#endif + if (*lc->mon_decimal_point) + __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point); + else + __decimal_point_ = base::do_decimal_point(); + if (*lc->mon_thousands_sep) + __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep); + else + __thousands_sep_ = base::do_thousands_sep(); + __grouping_ = lc->mon_grouping; + wchar_t wbuf[100]; + mbstate_t mb = {0}; + const char* bb = lc->int_curr_symbol; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + size_t j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + size_t j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wchar_t* wbe = wbuf + j; + __curr_symbol_.assign(wbuf, wbe); + if (lc->int_frac_digits != CHAR_MAX) + __frac_digits_ = lc->int_frac_digits; + else + __frac_digits_ = base::do_frac_digits(); +#if _WIN32 + if (lc->p_sign_posn == 0) +#else // _WIN32 + if (lc->int_p_sign_posn == 0) +#endif // _WIN32 + __positive_sign_ = L"()"; + else + { + mb = mbstate_t(); + bb = lc->positive_sign; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __positive_sign_.assign(wbuf, wbe); + } +#if _WIN32 + if (lc->n_sign_posn == 0) +#else // _WIN32 + if (lc->int_n_sign_posn == 0) +#endif // _WIN32 + __negative_sign_ = L"()"; + else + { + mb = mbstate_t(); + bb = lc->negative_sign; +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + j = mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#else + j = __mbsrtowcs_l(wbuf, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, loc.get()); +#endif + if (j == size_t(-1)) + __throw_runtime_error("locale not supported"); + wbe = wbuf + j; + __negative_sign_.assign(wbuf, wbe); + } + // Assume the positive and negative formats will want spaces in + // the same places in curr_symbol since there's no way to + // represent anything else. + string_type __dummy_curr_symbol = __curr_symbol_; +#if _WIN32 + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' '); +#else // _WIN32 + __init_pat(__pos_format_, __dummy_curr_symbol, true, + lc->int_p_cs_precedes, lc->int_p_sep_by_space, + lc->int_p_sign_posn, L' '); + __init_pat(__neg_format_, __curr_symbol_, true, + lc->int_n_cs_precedes, lc->int_n_sep_by_space, + lc->int_n_sign_posn, L' '); +#endif // _WIN32 +} + +void __do_nothing(void*) {} + +void __throw_runtime_error(const char* msg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw runtime_error(msg); +#endif +} + +template class collate<char>; +template class collate<wchar_t>; + +template class num_get<char>; +template class num_get<wchar_t>; + +template struct __num_get<char>; +template struct __num_get<wchar_t>; + +template class num_put<char>; +template class num_put<wchar_t>; + +template struct __num_put<char>; +template struct __num_put<wchar_t>; + +template class time_get<char>; +template class time_get<wchar_t>; + +template class time_get_byname<char>; +template class time_get_byname<wchar_t>; + +template class time_put<char>; +template class time_put<wchar_t>; + +template class time_put_byname<char>; +template class time_put_byname<wchar_t>; + +template class moneypunct<char, false>; +template class moneypunct<char, true>; +template class moneypunct<wchar_t, false>; +template class moneypunct<wchar_t, true>; + +template class moneypunct_byname<char, false>; +template class moneypunct_byname<char, true>; +template class moneypunct_byname<wchar_t, false>; +template class moneypunct_byname<wchar_t, true>; + +template class money_get<char>; +template class money_get<wchar_t>; + +template class __money_get<char>; +template class __money_get<wchar_t>; + +template class money_put<char>; +template class money_put<wchar_t>; + +template class __money_put<char>; +template class __money_put<wchar_t>; + +template class messages<char>; +template class messages<wchar_t>; + +template class messages_byname<char>; +template class messages_byname<wchar_t>; + +template class codecvt_byname<char, char, mbstate_t>; +template class codecvt_byname<wchar_t, char, mbstate_t>; +template class codecvt_byname<char16_t, char, mbstate_t>; +template class codecvt_byname<char32_t, char, mbstate_t>; + +template class __vector_base_common<true>; + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/memory.cpp b/contrib/libc++/src/memory.cpp new file mode 100644 index 0000000..a892e75 --- /dev/null +++ b/contrib/libc++/src/memory.cpp @@ -0,0 +1,165 @@ +//===------------------------ memory.cpp ----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "memory" + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace +{ + +template <class T> +inline T +increment(T& t) _NOEXCEPT +{ + return __sync_add_and_fetch(&t, 1); +} + +template <class T> +inline T +decrement(T& t) _NOEXCEPT +{ + return __sync_add_and_fetch(&t, -1); +} + +} // namespace + +const allocator_arg_t allocator_arg = allocator_arg_t(); + +bad_weak_ptr::~bad_weak_ptr() _NOEXCEPT {} + +const char* +bad_weak_ptr::what() const _NOEXCEPT +{ + return "bad_weak_ptr"; +} + +__shared_count::~__shared_count() +{ +} + +void +__shared_count::__add_shared() _NOEXCEPT +{ + increment(__shared_owners_); +} + +bool +__shared_count::__release_shared() _NOEXCEPT +{ + if (decrement(__shared_owners_) == -1) + { + __on_zero_shared(); + return true; + } + return false; +} + +__shared_weak_count::~__shared_weak_count() +{ +} + +void +__shared_weak_count::__add_shared() _NOEXCEPT +{ + __shared_count::__add_shared(); +} + +void +__shared_weak_count::__add_weak() _NOEXCEPT +{ + increment(__shared_weak_owners_); +} + +void +__shared_weak_count::__release_shared() _NOEXCEPT +{ + if (__shared_count::__release_shared()) + __release_weak(); +} + +void +__shared_weak_count::__release_weak() _NOEXCEPT +{ + if (decrement(__shared_weak_owners_) == -1) + __on_zero_shared_weak(); +} + +__shared_weak_count* +__shared_weak_count::lock() _NOEXCEPT +{ + long object_owners = __shared_owners_; + while (object_owners != -1) + { + if (__sync_bool_compare_and_swap(&__shared_owners_, + object_owners, + object_owners+1)) + return this; + object_owners = __shared_owners_; + } + return 0; +} + +#ifndef _LIBCPP_NO_RTTI + +const void* +__shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT +{ + return 0; +} + +#endif // _LIBCPP_NO_RTTI + +void +declare_reachable(void*) +{ +} + +void +declare_no_pointers(char*, size_t) +{ +} + +void +undeclare_no_pointers(char*, size_t) +{ +} + +pointer_safety +get_pointer_safety() _NOEXCEPT +{ + return pointer_safety::relaxed; +} + +void* +__undeclare_reachable(void* p) +{ + return p; +} + +void* +align(size_t alignment, size_t size, void*& ptr, size_t& space) +{ + void* r = nullptr; + if (size <= space) + { + char* p1 = static_cast<char*>(ptr); + char* p2 = (char*)((size_t)(p1 + (alignment - 1)) & -alignment); + size_t d = static_cast<size_t>(p2 - p1); + if (d <= space - size) + { + r = p2; + ptr = r; + space -= d; + } + } + return r; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/mutex.cpp b/contrib/libc++/src/mutex.cpp new file mode 100644 index 0000000..9aa051b --- /dev/null +++ b/contrib/libc++/src/mutex.cpp @@ -0,0 +1,249 @@ +//===------------------------- mutex.cpp ----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "mutex" +#include "limits" +#include "system_error" +#include "cassert" + +_LIBCPP_BEGIN_NAMESPACE_STD + +const defer_lock_t defer_lock = {}; +const try_to_lock_t try_to_lock = {}; +const adopt_lock_t adopt_lock = {}; + +mutex::~mutex() +{ + pthread_mutex_destroy(&__m_); +} + +void +mutex::lock() +{ + int ec = pthread_mutex_lock(&__m_); + if (ec) + __throw_system_error(ec, "mutex lock failed"); +} + +bool +mutex::try_lock() +{ + return pthread_mutex_trylock(&__m_) == 0; +} + +void +mutex::unlock() +{ + int ec = pthread_mutex_unlock(&__m_); + assert(ec == 0); +} + +// recursive_mutex + +recursive_mutex::recursive_mutex() +{ + pthread_mutexattr_t attr; + int ec = pthread_mutexattr_init(&attr); + if (ec) + goto fail; + ec = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + if (ec) + { + pthread_mutexattr_destroy(&attr); + goto fail; + } + ec = pthread_mutex_init(&__m_, &attr); + if (ec) + { + pthread_mutexattr_destroy(&attr); + goto fail; + } + ec = pthread_mutexattr_destroy(&attr); + if (ec) + { + pthread_mutex_destroy(&__m_); + goto fail; + } + return; +fail: + __throw_system_error(ec, "recursive_mutex constructor failed"); +} + +recursive_mutex::~recursive_mutex() +{ + int e = pthread_mutex_destroy(&__m_); + assert(e == 0); +} + +void +recursive_mutex::lock() +{ + int ec = pthread_mutex_lock(&__m_); + if (ec) + __throw_system_error(ec, "recursive_mutex lock failed"); +} + +void +recursive_mutex::unlock() +{ + int e = pthread_mutex_unlock(&__m_); + assert(e == 0); +} + +bool +recursive_mutex::try_lock() +{ + return pthread_mutex_trylock(&__m_) == 0; +} + +// timed_mutex + +timed_mutex::timed_mutex() + : __locked_(false) +{ +} + +timed_mutex::~timed_mutex() +{ + lock_guard<mutex> _(__m_); +} + +void +timed_mutex::lock() +{ + unique_lock<mutex> lk(__m_); + while (__locked_) + __cv_.wait(lk); + __locked_ = true; +} + +bool +timed_mutex::try_lock() +{ + unique_lock<mutex> lk(__m_, try_to_lock); + if (lk.owns_lock() && !__locked_) + { + __locked_ = true; + return true; + } + return false; +} + +void +timed_mutex::unlock() +{ + lock_guard<mutex> _(__m_); + __locked_ = false; + __cv_.notify_one(); +} + +// recursive_timed_mutex + +recursive_timed_mutex::recursive_timed_mutex() + : __count_(0), + __id_(0) +{ +} + +recursive_timed_mutex::~recursive_timed_mutex() +{ + lock_guard<mutex> _(__m_); +} + +void +recursive_timed_mutex::lock() +{ + pthread_t id = pthread_self(); + unique_lock<mutex> lk(__m_); + if (pthread_equal(id, __id_)) + { + if (__count_ == numeric_limits<size_t>::max()) + __throw_system_error(EAGAIN, "recursive_timed_mutex lock limit reached"); + ++__count_; + return; + } + while (__count_ != 0) + __cv_.wait(lk); + __count_ = 1; + __id_ = id; +} + +bool +recursive_timed_mutex::try_lock() +{ + pthread_t id = pthread_self(); + unique_lock<mutex> lk(__m_, try_to_lock); + if (lk.owns_lock() && (__count_ == 0 || pthread_equal(id, __id_))) + { + if (__count_ == numeric_limits<size_t>::max()) + return false; + ++__count_; + __id_ = id; + return true; + } + return false; +} + +void +recursive_timed_mutex::unlock() +{ + unique_lock<mutex> lk(__m_); + if (--__count_ == 0) + { + __id_ = 0; + lk.unlock(); + __cv_.notify_one(); + } +} + +// If dispatch_once_f ever handles C++ exceptions, and if one can get to it +// without illegal macros (unexpected macros not beginning with _UpperCase or +// __lowercase), and if it stops spinning waiting threads, then call_once should +// call into dispatch_once_f instead of here. Relevant radar this code needs to +// keep in sync with: 7741191. + +static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t cv = PTHREAD_COND_INITIALIZER; + +void +__call_once(volatile unsigned long& flag, void* arg, void(*func)(void*)) +{ + pthread_mutex_lock(&mut); + while (flag == 1) + pthread_cond_wait(&cv, &mut); + if (flag == 0) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + flag = 1; + pthread_mutex_unlock(&mut); + func(arg); + pthread_mutex_lock(&mut); + flag = ~0ul; + pthread_mutex_unlock(&mut); + pthread_cond_broadcast(&cv); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + pthread_mutex_lock(&mut); + flag = 0ul; + pthread_mutex_unlock(&mut); + pthread_cond_broadcast(&cv); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + } + else + pthread_mutex_unlock(&mut); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/new.cpp b/contrib/libc++/src/new.cpp new file mode 100644 index 0000000..1c171a8 --- /dev/null +++ b/contrib/libc++/src/new.cpp @@ -0,0 +1,199 @@ +//===--------------------------- new.cpp ----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include <stdlib.h> + +#include "new" + +#if __APPLE__ + #include <cxxabi.h> + + #ifndef _LIBCPPABI_VERSION + // On Darwin, there are two STL shared libraries and a lower level ABI + // shared libray. The global holding the current new handler is + // in the ABI library and named __cxa_new_handler. + #define __new_handler __cxxabiapple::__cxa_new_handler + #endif +#else // __APPLE__ + static std::new_handler __new_handler; +#endif + +#if !defined (LIBCXXRT) // && !defined(_LIBCPPABI_VERSION) + +// Implement all new and delete operators as weak definitions +// in this shared library, so that they can be overriden by programs +// that define non-weak copies of the functions. + +__attribute__((__weak__, __visibility__("default"))) +void * +operator new(std::size_t size) +#if !__has_feature(cxx_noexcept) + throw(std::bad_alloc) +#endif +{ + if (size == 0) + size = 1; + void* p; + while ((p = ::malloc(size)) == 0) + { + // If malloc fails and there is a new_handler, + // call it to try free up memory. + std::new_handler nh = std::get_new_handler(); + if (nh) + nh(); + else +#ifndef _LIBCPP_NO_EXCEPTIONS + throw std::bad_alloc(); +#else + break; +#endif + } + return p; +} + +__attribute__((__weak__, __visibility__("default"))) +void* +operator new(size_t size, const std::nothrow_t&) _NOEXCEPT +{ + void* p = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + p = ::operator new(size); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + return p; +} + +__attribute__((__weak__, __visibility__("default"))) +void* +operator new[](size_t size) +#if !__has_feature(cxx_noexcept) + throw(std::bad_alloc) +#endif +{ + return ::operator new(size); +} + +__attribute__((__weak__, __visibility__("default"))) +void* +operator new[](size_t size, const std::nothrow_t&) _NOEXCEPT +{ + void* p = 0; +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + p = ::operator new[](size); +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + } +#endif // _LIBCPP_NO_EXCEPTIONS + return p; +} + +__attribute__((__weak__, __visibility__("default"))) +void +operator delete(void* ptr) _NOEXCEPT +{ + if (ptr) + ::free(ptr); +} + +__attribute__((__weak__, __visibility__("default"))) +void +operator delete(void* ptr, const std::nothrow_t&) _NOEXCEPT +{ + ::operator delete(ptr); +} + +__attribute__((__weak__, __visibility__("default"))) +void +operator delete[] (void* ptr) _NOEXCEPT +{ + ::operator delete (ptr); +} + +__attribute__((__weak__, __visibility__("default"))) +void +operator delete[] (void* ptr, const std::nothrow_t&) _NOEXCEPT +{ + ::operator delete[](ptr); +} + +#endif // !_LIBCPPABI_VERSION && !LIBCXXRT + +namespace std +{ + +const nothrow_t nothrow = {}; + +#ifndef _LIBCPPABI_VERSION + +new_handler +set_new_handler(new_handler handler) _NOEXCEPT +{ + return __sync_lock_test_and_set(&__new_handler, handler); +} + +new_handler +get_new_handler() _NOEXCEPT +{ + return __sync_fetch_and_add(&__new_handler, (new_handler)0); +} + +#ifndef LIBCXXRT + +bad_alloc::bad_alloc() _NOEXCEPT +{ +} + +bad_alloc::~bad_alloc() _NOEXCEPT +{ +} + +const char* +bad_alloc::what() const _NOEXCEPT +{ + return "std::bad_alloc"; +} + +bad_array_new_length::bad_array_new_length() _NOEXCEPT +{ +} + +bad_array_new_length::~bad_array_new_length() _NOEXCEPT +{ +} + +const char* +bad_array_new_length::what() const _NOEXCEPT +{ + return "bad_array_new_length"; +} + +#endif +#endif //LIBCXXRT + +void +__throw_bad_alloc() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_alloc(); +#endif +} + +} // std diff --git a/contrib/libc++/src/random.cpp b/contrib/libc++/src/random.cpp new file mode 100644 index 0000000..6140b74 --- /dev/null +++ b/contrib/libc++/src/random.cpp @@ -0,0 +1,48 @@ +//===-------------------------- random.cpp --------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "random" +#include "system_error" + +#ifdef __sun__ +#define rename solaris_headers_are_broken +#endif +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> + +_LIBCPP_BEGIN_NAMESPACE_STD + +random_device::random_device(const string& __token) + : __f_(open(__token.c_str(), O_RDONLY)) +{ + if (__f_ <= 0) + __throw_system_error(errno, ("random_device failed to open " + __token).c_str()); +} + +random_device::~random_device() +{ + close(__f_); +} + +unsigned +random_device::operator()() +{ + unsigned r; + read(__f_, &r, sizeof(r)); + return r; +} + +double +random_device::entropy() const +{ + return 0; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/regex.cpp b/contrib/libc++/src/regex.cpp new file mode 100644 index 0000000..e3ec281 --- /dev/null +++ b/contrib/libc++/src/regex.cpp @@ -0,0 +1,325 @@ +//===-------------------------- regex.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "regex" +#include "algorithm" +#include "iterator" + +_LIBCPP_BEGIN_NAMESPACE_STD + +static +const char* +make_error_type_string(regex_constants::error_type ecode) +{ + switch (ecode) + { + case regex_constants::error_collate: + return "The expression contained an invalid collating element name."; + case regex_constants::error_ctype: + return "The expression contained an invalid character class name."; + case regex_constants::error_escape: + return "The expression contained an invalid escaped character, or a " + "trailing escape."; + case regex_constants::error_backref: + return "The expression contained an invalid back reference."; + case regex_constants::error_brack: + return "The expression contained mismatched [ and ]."; + case regex_constants::error_paren: + return "The expression contained mismatched ( and )."; + case regex_constants::error_brace: + return "The expression contained mismatched { and }."; + case regex_constants::error_badbrace: + return "The expression contained an invalid range in a {} expression."; + case regex_constants::error_range: + return "The expression contained an invalid character range, " + "such as [b-a] in most encodings."; + case regex_constants::error_space: + return "There was insufficient memory to convert the expression into " + "a finite state machine."; + case regex_constants::error_badrepeat: + return "One of *?+{ was not preceded by a valid regular expression."; + case regex_constants::error_complexity: + return "The complexity of an attempted match against a regular " + "expression exceeded a pre-set level."; + case regex_constants::error_stack: + return "There was insufficient memory to determine whether the regular " + "expression could match the specified character sequence."; + case regex_constants::__re_err_grammar: + return "An invalid regex grammar has been requested."; + case regex_constants::__re_err_empty: + return "An empty regex is not allowed in the POSIX grammar."; + default: + break; + } + return "Unknown error type"; +} + +regex_error::regex_error(regex_constants::error_type ecode) + : runtime_error(make_error_type_string(ecode)), + __code_(ecode) +{} + +regex_error::~regex_error() throw() {} + +namespace { + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + +struct collationnames +{ + const char* elem_; + char char_; +}; + +#pragma clang diagnostic pop + +const collationnames collatenames[] = +{ + {"A", 0x41}, + {"B", 0x42}, + {"C", 0x43}, + {"D", 0x44}, + {"E", 0x45}, + {"F", 0x46}, + {"G", 0x47}, + {"H", 0x48}, + {"I", 0x49}, + {"J", 0x4a}, + {"K", 0x4b}, + {"L", 0x4c}, + {"M", 0x4d}, + {"N", 0x4e}, + {"NUL", 0x00}, + {"O", 0x4f}, + {"P", 0x50}, + {"Q", 0x51}, + {"R", 0x52}, + {"S", 0x53}, + {"T", 0x54}, + {"U", 0x55}, + {"V", 0x56}, + {"W", 0x57}, + {"X", 0x58}, + {"Y", 0x59}, + {"Z", 0x5a}, + {"a", 0x61}, + {"alert", 0x07}, + {"ampersand", 0x26}, + {"apostrophe", 0x27}, + {"asterisk", 0x2a}, + {"b", 0x62}, + {"backslash", 0x5c}, + {"backspace", 0x08}, + {"c", 0x63}, + {"carriage-return", 0x0d}, + {"circumflex", 0x5e}, + {"circumflex-accent", 0x5e}, + {"colon", 0x3a}, + {"comma", 0x2c}, + {"commercial-at", 0x40}, + {"d", 0x64}, + {"dollar-sign", 0x24}, + {"e", 0x65}, + {"eight", 0x38}, + {"equals-sign", 0x3d}, + {"exclamation-mark", 0x21}, + {"f", 0x66}, + {"five", 0x35}, + {"form-feed", 0x0c}, + {"four", 0x34}, + {"full-stop", 0x2e}, + {"g", 0x67}, + {"grave-accent", 0x60}, + {"greater-than-sign", 0x3e}, + {"h", 0x68}, + {"hyphen", 0x2d}, + {"hyphen-minus", 0x2d}, + {"i", 0x69}, + {"j", 0x6a}, + {"k", 0x6b}, + {"l", 0x6c}, + {"left-brace", 0x7b}, + {"left-curly-bracket", 0x7b}, + {"left-parenthesis", 0x28}, + {"left-square-bracket", 0x5b}, + {"less-than-sign", 0x3c}, + {"low-line", 0x5f}, + {"m", 0x6d}, + {"n", 0x6e}, + {"newline", 0x0a}, + {"nine", 0x39}, + {"number-sign", 0x23}, + {"o", 0x6f}, + {"one", 0x31}, + {"p", 0x70}, + {"percent-sign", 0x25}, + {"period", 0x2e}, + {"plus-sign", 0x2b}, + {"q", 0x71}, + {"question-mark", 0x3f}, + {"quotation-mark", 0x22}, + {"r", 0x72}, + {"reverse-solidus", 0x5c}, + {"right-brace", 0x7d}, + {"right-curly-bracket", 0x7d}, + {"right-parenthesis", 0x29}, + {"right-square-bracket", 0x5d}, + {"s", 0x73}, + {"semicolon", 0x3b}, + {"seven", 0x37}, + {"six", 0x36}, + {"slash", 0x2f}, + {"solidus", 0x2f}, + {"space", 0x20}, + {"t", 0x74}, + {"tab", 0x09}, + {"three", 0x33}, + {"tilde", 0x7e}, + {"two", 0x32}, + {"u", 0x75}, + {"underscore", 0x5f}, + {"v", 0x76}, + {"vertical-line", 0x7c}, + {"vertical-tab", 0x0b}, + {"w", 0x77}, + {"x", 0x78}, + {"y", 0x79}, + {"z", 0x7a}, + {"zero", 0x30} +}; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" + +struct classnames +{ + const char* elem_; + ctype_base::mask mask_; +}; + +#pragma clang diagnostic pop + +const classnames ClassNames[] = +{ + {"alnum", ctype_base::alnum}, + {"alpha", ctype_base::alpha}, + {"blank", ctype_base::blank}, + {"cntrl", ctype_base::cntrl}, + {"d", ctype_base::digit}, + {"digit", ctype_base::digit}, + {"graph", ctype_base::graph}, + {"lower", ctype_base::lower}, + {"print", ctype_base::print}, + {"punct", ctype_base::punct}, + {"s", ctype_base::space}, + {"space", ctype_base::space}, + {"upper", ctype_base::upper}, + {"w", regex_traits<char>::__regex_word}, + {"xdigit", ctype_base::xdigit} +}; + +struct use_strcmp +{ + bool operator()(const collationnames& x, const char* y) + {return strcmp(x.elem_, y) < 0;} + bool operator()(const classnames& x, const char* y) + {return strcmp(x.elem_, y) < 0;} +}; + +} + +string +__get_collation_name(const char* s) +{ + const collationnames* i = + _VSTD::lower_bound(begin(collatenames), end(collatenames), s, use_strcmp()); + string r; + if (i != end(collatenames) && strcmp(s, i->elem_) == 0) + r = char(i->char_); + return r; +} + +ctype_base::mask +__get_classname(const char* s, bool __icase) +{ + const classnames* i = + _VSTD::lower_bound(begin(ClassNames), end(ClassNames), s, use_strcmp()); + ctype_base::mask r = 0; + if (i != end(ClassNames) && strcmp(s, i->elem_) == 0) + { + r = i->mask_; + if (r == regex_traits<char>::__regex_word) + r |= ctype_base::alnum | ctype_base::upper | ctype_base::lower; + else if (__icase) + { + if (r & (ctype_base::lower | ctype_base::upper)) + r |= ctype_base::alpha; + } + } + return r; +} + +template <> +void +__match_any_but_newline<char>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_) + { + switch (*__s.__current_) + { + case '\r': + case '\n': + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + break; + default: + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + break; + } + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +template <> +void +__match_any_but_newline<wchar_t>::__exec(__state& __s) const +{ + if (__s.__current_ != __s.__last_) + { + switch (*__s.__current_) + { + case '\r': + case '\n': + case 0x2028: + case 0x2029: + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + break; + default: + __s.__do_ = __state::__accept_and_consume; + ++__s.__current_; + __s.__node_ = this->first(); + break; + } + } + else + { + __s.__do_ = __state::__reject; + __s.__node_ = nullptr; + } +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/stdexcept.cpp b/contrib/libc++/src/stdexcept.cpp new file mode 100644 index 0000000..b516b0c --- /dev/null +++ b/contrib/libc++/src/stdexcept.cpp @@ -0,0 +1,187 @@ +//===------------------------ stdexcept.cpp -------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "stdexcept" +#include "new" +#include "string" +#include <cstdlib> +#include <cstring> +#include <cstdint> +#include <cstddef> +#include "system_error" +#include <cxxabi.h> + +// Note: optimize for size + +#pragma GCC visibility push(hidden) + +namespace +{ + +class __libcpp_nmstr +{ +private: + const char* str_; + + typedef std::size_t unused_t; + typedef std::int32_t count_t; + + static const std::ptrdiff_t offset = static_cast<std::ptrdiff_t>(2*sizeof(unused_t) + + sizeof(count_t)); + + count_t& count() const _NOEXCEPT {return (count_t&)(*(str_ - sizeof(count_t)));} +public: + explicit __libcpp_nmstr(const char* msg); + __libcpp_nmstr(const __libcpp_nmstr& s) _LIBCPP_CANTTHROW; + __libcpp_nmstr& operator=(const __libcpp_nmstr& s) _LIBCPP_CANTTHROW; + ~__libcpp_nmstr() _LIBCPP_CANTTHROW; + const char* c_str() const _NOEXCEPT {return str_;} +}; + +__libcpp_nmstr::__libcpp_nmstr(const char* msg) +{ + std::size_t len = strlen(msg); + str_ = new char[len + 1 + offset]; + unused_t* c = (unused_t*)str_; + c[0] = c[1] = len; + str_ += offset; + count() = 0; + std::strcpy(const_cast<char*>(c_str()), msg); +} + +inline +__libcpp_nmstr::__libcpp_nmstr(const __libcpp_nmstr& s) + : str_(s.str_) +{ + __sync_add_and_fetch(&count(), 1); +} + +__libcpp_nmstr& +__libcpp_nmstr::operator=(const __libcpp_nmstr& s) +{ + const char* p = str_; + str_ = s.str_; + __sync_add_and_fetch(&count(), 1); + if (__sync_add_and_fetch((count_t*)(p-sizeof(count_t)), -1) < 0) + delete [] (p-offset); + return *this; +} + +inline +__libcpp_nmstr::~__libcpp_nmstr() +{ + if (__sync_add_and_fetch(&count(), -1) < 0) + delete [] (str_ - offset); +} + +} + +#pragma GCC visibility pop + +namespace std // purposefully not using versioning namespace +{ + +logic_error::logic_error(const string& msg) +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr(msg.c_str()); +} + +logic_error::logic_error(const char* msg) +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr(msg); +} + +logic_error::logic_error(const logic_error& le) _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr((const __libcpp_nmstr&)le.__imp_); +} + +logic_error& +logic_error::operator=(const logic_error& le) _NOEXCEPT +{ + __libcpp_nmstr& s1 = (__libcpp_nmstr&)__imp_; + const __libcpp_nmstr& s2 = (const __libcpp_nmstr&)le.__imp_; + s1 = s2; + return *this; +} + +#ifndef _LIBCPPABI_VERSION + +logic_error::~logic_error() _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + s.~__libcpp_nmstr(); +} + +const char* +logic_error::what() const _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + return s.c_str(); +} + +#endif + +runtime_error::runtime_error(const string& msg) +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr(msg.c_str()); +} + +runtime_error::runtime_error(const char* msg) +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr(msg); +} + +runtime_error::runtime_error(const runtime_error& le) _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + ::new(&s) __libcpp_nmstr((const __libcpp_nmstr&)le.__imp_); +} + +runtime_error& +runtime_error::operator=(const runtime_error& le) _NOEXCEPT +{ + __libcpp_nmstr& s1 = (__libcpp_nmstr&)__imp_; + const __libcpp_nmstr& s2 = (const __libcpp_nmstr&)le.__imp_; + s1 = s2; + return *this; +} + +#ifndef _LIBCPPABI_VERSION + +runtime_error::~runtime_error() _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + s.~__libcpp_nmstr(); +} + +const char* +runtime_error::what() const _NOEXCEPT +{ + __libcpp_nmstr& s = (__libcpp_nmstr&)__imp_; + return s.c_str(); +} + +domain_error::~domain_error() _NOEXCEPT {} +invalid_argument::~invalid_argument() _NOEXCEPT {} +length_error::~length_error() _NOEXCEPT {} +out_of_range::~out_of_range() _NOEXCEPT {} + +range_error::~range_error() _NOEXCEPT {} +overflow_error::~overflow_error() _NOEXCEPT {} +underflow_error::~underflow_error() _NOEXCEPT {} + +#endif + +} // std diff --git a/contrib/libc++/src/string.cpp b/contrib/libc++/src/string.cpp new file mode 100644 index 0000000..750ba28 --- /dev/null +++ b/contrib/libc++/src/string.cpp @@ -0,0 +1,679 @@ +//===------------------------- string.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "string" +#include "cstdlib" +#include "cwchar" +#include "cerrno" +#if _WIN32 +#include "support/win32/support.h" +#endif // _WIN32 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template class __basic_string_common<true>; + +template class basic_string<char>; +template class basic_string<wchar_t>; + +template + string + operator+<char, char_traits<char>, allocator<char> >(char const*, string const&); + +int +stoi(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long r = strtol(p, &ptr, base); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + ptr = const_cast<char*>(p); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoi: no conversion"); + throw out_of_range("stoi: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<int>(r); +} + +int +stoi(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long r = wcstol(p, &ptr, base); + if (r < numeric_limits<int>::min() || numeric_limits<int>::max() < r) + ptr = const_cast<wchar_t*>(p); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoi: no conversion"); + throw out_of_range("stoi: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<int>(r); +} + +long +stol(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long r = strtol(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stol: no conversion"); + throw out_of_range("stol: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long +stol(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long r = wcstol(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stol: no conversion"); + throw out_of_range("stol: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long +stoul(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + unsigned long r = strtoul(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoul: no conversion"); + throw out_of_range("stoul: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long +stoul(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + unsigned long r = wcstoul(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoul: no conversion"); + throw out_of_range("stoul: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long long +stoll(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + long long r = strtoll(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoll: no conversion"); + throw out_of_range("stoll: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long long +stoll(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + long long r = wcstoll(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoll: no conversion"); + throw out_of_range("stoll: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long long +stoull(const string& str, size_t* idx, int base) +{ + char* ptr; + const char* const p = str.c_str(); + unsigned long long r = strtoull(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoull: no conversion"); + throw out_of_range("stoull: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +unsigned long long +stoull(const wstring& str, size_t* idx, int base) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + unsigned long long r = wcstoull(p, &ptr, base); + if (ptr == p) + { +#ifndef _LIBCPP_NO_EXCEPTIONS + if (r == 0) + throw invalid_argument("stoull: no conversion"); + throw out_of_range("stoull: out of range"); +#endif // _LIBCPP_NO_EXCEPTIONS + } + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +float +stof(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = strtod(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stof: out of range"); + if (ptr == p) + throw invalid_argument("stof: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<float>(r); +} + +float +stof(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = wcstod(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stof: out of range"); + if (ptr == p) + throw invalid_argument("stof: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return static_cast<float>(r); +} + +double +stod(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = strtod(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stod: out of range"); + if (ptr == p) + throw invalid_argument("stod: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +double +stod(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + double r = wcstod(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stod: out of range"); + if (ptr == p) + throw invalid_argument("stod: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long double +stold(const string& str, size_t* idx) +{ + char* ptr; + const char* const p = str.c_str(); + int errno_save = errno; + errno = 0; + long double r = strtold(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stold: out of range"); + if (ptr == p) + throw invalid_argument("stold: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +long double +stold(const wstring& str, size_t* idx) +{ + wchar_t* ptr; + const wchar_t* const p = str.c_str(); + int errno_save = errno; + errno = 0; + long double r = wcstold(p, &ptr); + swap(errno, errno_save); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (errno_save == ERANGE) + throw out_of_range("stold: out of range"); + if (ptr == p) + throw invalid_argument("stold: no conversion"); +#endif // _LIBCPP_NO_EXCEPTIONS + if (idx) + *idx = static_cast<size_t>(ptr - p); + return r; +} + +string to_string(int val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%d", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%u", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%ld", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lu", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%lld", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(unsigned long long val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%llu", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(float val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(double val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%f", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +string to_string(long double val) +{ + string s; + s.resize(s.capacity()); + while (true) + { + size_t n2 = static_cast<size_t>(snprintf(&s[0], s.size()+1, "%Lf", val)); + if (n2 <= s.size()) + { + s.resize(n2); + break; + } + s.resize(n2); + } + return s; +} + +wstring to_wstring(int val) +{ + const size_t n = (numeric_limits<int>::digits / 3) + + ((numeric_limits<int>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%d", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned val) +{ + const size_t n = (numeric_limits<unsigned>::digits / 3) + + ((numeric_limits<unsigned>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%u", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long val) +{ + const size_t n = (numeric_limits<long>::digits / 3) + + ((numeric_limits<long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%ld", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned long val) +{ + const size_t n = (numeric_limits<unsigned long>::digits / 3) + + ((numeric_limits<unsigned long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%lu", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long long val) +{ + const size_t n = (numeric_limits<long long>::digits / 3) + + ((numeric_limits<long long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%lld", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(unsigned long long val) +{ + const size_t n = (numeric_limits<unsigned long long>::digits / 3) + + ((numeric_limits<unsigned long long>::digits % 3) != 0) + + 1; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%llu", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(float val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%f", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(double val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%f", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +wstring to_wstring(long double val) +{ + const size_t n = 20; + wstring s(n, wchar_t()); + s.resize(s.capacity()); + while (true) + { + int n2 = swprintf(&s[0], s.size()+1, L"%Lf", val); + if (n2 > 0) + { + s.resize(static_cast<size_t>(n2)); + break; + } + s.resize(2*s.size()); + s.resize(s.capacity()); + } + return s; +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/strstream.cpp b/contrib/libc++/src/strstream.cpp new file mode 100644 index 0000000..8cd19e6 --- /dev/null +++ b/contrib/libc++/src/strstream.cpp @@ -0,0 +1,327 @@ +//===------------------------ strstream.cpp -------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "strstream" +#include "algorithm" +#include "climits" +#include "cstring" + +_LIBCPP_BEGIN_NAMESPACE_STD + +strstreambuf::strstreambuf(streamsize __alsize) + : __strmode_(__dynamic), + __alsize_(__alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ +} + +strstreambuf::strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*)) + : __strmode_(__dynamic), + __alsize_(__default_alsize), + __palloc_(__palloc), + __pfree_(__pfree) +{ +} + +void +strstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg) +{ + if (__n == 0) + __n = static_cast<streamsize>(strlen(__gnext)); + else if (__n < 0) + __n = INT_MAX; + if (__pbeg == nullptr) + setg(__gnext, __gnext, __gnext + __n); + else + { + setg(__gnext, __gnext, __pbeg); + setp(__pbeg, __pbeg + __n); + } +} + +strstreambuf::strstreambuf(char* __gnext, streamsize __n, char* __pbeg) + : __strmode_(), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init(__gnext, __n, __pbeg); +} + +strstreambuf::strstreambuf(const char* __gnext, streamsize __n) + : __strmode_(__constant), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init((char*)__gnext, __n, nullptr); +} + +strstreambuf::strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg) + : __strmode_(), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init((char*)__gnext, __n, (char*)__pbeg); +} + +strstreambuf::strstreambuf(const signed char* __gnext, streamsize __n) + : __strmode_(__constant), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init((char*)__gnext, __n, nullptr); +} + +strstreambuf::strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg) + : __strmode_(), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init((char*)__gnext, __n, (char*)__pbeg); +} + +strstreambuf::strstreambuf(const unsigned char* __gnext, streamsize __n) + : __strmode_(__constant), + __alsize_(__default_alsize), + __palloc_(nullptr), + __pfree_(nullptr) +{ + __init((char*)__gnext, __n, nullptr); +} + +strstreambuf::~strstreambuf() +{ + if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0) + { + if (__pfree_) + __pfree_(eback()); + else + delete [] eback(); + } +} + +void +strstreambuf::swap(strstreambuf& __rhs) +{ + streambuf::swap(__rhs); + _VSTD::swap(__strmode_, __rhs.__strmode_); + _VSTD::swap(__alsize_, __rhs.__alsize_); + _VSTD::swap(__palloc_, __rhs.__palloc_); + _VSTD::swap(__pfree_, __rhs.__pfree_); +} + +void +strstreambuf::freeze(bool __freezefl) +{ + if (__strmode_ & __dynamic) + { + if (__freezefl) + __strmode_ |= __frozen; + else + __strmode_ &= ~__frozen; + } +} + +char* +strstreambuf::str() +{ + if (__strmode_ & __dynamic) + __strmode_ |= __frozen; + return eback(); +} + +int +strstreambuf::pcount() const +{ + return static_cast<int>(pptr() - pbase()); +} + +strstreambuf::int_type +strstreambuf::overflow(int_type __c) +{ + if (__c == EOF) + return int_type(0); + if (pptr() == epptr()) + { + if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0) + return int_type(EOF); + streamsize old_size = (epptr() ? epptr() : egptr()) - eback(); + streamsize new_size = max<streamsize>(__alsize_, 2*old_size); + char* buf = nullptr; + if (__palloc_) + buf = static_cast<char*>(__palloc_(static_cast<size_t>(new_size))); + else + buf = new char[new_size]; + if (buf == nullptr) + return int_type(EOF); + memcpy(buf, eback(), static_cast<size_t>(old_size)); + ptrdiff_t ninp = gptr() - eback(); + ptrdiff_t einp = egptr() - eback(); + ptrdiff_t nout = pptr() - pbase(); + ptrdiff_t eout = epptr() - pbase(); + if (__strmode_ & __allocated) + { + if (__pfree_) + __pfree_(eback()); + else + delete [] eback(); + } + setg(buf, buf + ninp, buf + einp); + setp(buf + einp, buf + einp + eout); + pbump(static_cast<int>(nout)); + __strmode_ |= __allocated; + } + *pptr() = static_cast<char>(__c); + pbump(1); + return int_type((unsigned char)__c); +} + +strstreambuf::int_type +strstreambuf::pbackfail(int_type __c) +{ + if (eback() == gptr()) + return EOF; + if (__c == EOF) + { + gbump(-1); + return int_type(0); + } + if (__strmode_ & __constant) + { + if (gptr()[-1] == static_cast<char>(__c)) + { + gbump(-1); + return __c; + } + return EOF; + } + gbump(-1); + *gptr() = static_cast<char>(__c); + return __c; +} + +strstreambuf::int_type +strstreambuf::underflow() +{ + if (gptr() == egptr()) + { + if (egptr() >= pptr()) + return EOF; + setg(eback(), gptr(), pptr()); + } + return int_type((unsigned char)*gptr()); +} + +strstreambuf::pos_type +strstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which) +{ + off_type __p(-1); + bool pos_in = __which & ios::in; + bool pos_out = __which & ios::out; + bool legal = false; + switch (__way) + { + case ios::beg: + case ios::end: + if (pos_in || pos_out) + legal = true; + break; + case ios::cur: + if (pos_in != pos_out) + legal = true; + break; + } + if (pos_in && gptr() == nullptr) + legal = false; + if (pos_out && pptr() == nullptr) + legal = false; + if (legal) + { + off_type newoff; + char* seekhigh = epptr() ? epptr() : egptr(); + switch (__way) + { + case ios::beg: + newoff = 0; + break; + case ios::cur: + newoff = (pos_in ? gptr() : pptr()) - eback(); + break; + case ios::end: + newoff = seekhigh - eback(); + break; + } + newoff += __off; + if (0 <= newoff && newoff <= seekhigh - eback()) + { + char* newpos = eback() + newoff; + if (pos_in) + setg(eback(), newpos, _VSTD::max(newpos, egptr())); + if (pos_out) + { + // min(pbase, newpos), newpos, epptr() + __off = epptr() - newpos; + setp(min(pbase(), newpos), epptr()); + pbump(static_cast<int>((epptr() - pbase()) - __off)); + } + __p = newoff; + } + } + return pos_type(__p); +} + +strstreambuf::pos_type +strstreambuf::seekpos(pos_type __sp, ios_base::openmode __which) +{ + off_type __p(-1); + bool pos_in = __which & ios::in; + bool pos_out = __which & ios::out; + if (pos_in || pos_out) + { + if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr))) + { + off_type newoff = __sp; + char* seekhigh = epptr() ? epptr() : egptr(); + if (0 <= newoff && newoff <= seekhigh - eback()) + { + char* newpos = eback() + newoff; + if (pos_in) + setg(eback(), newpos, _VSTD::max(newpos, egptr())); + if (pos_out) + { + // min(pbase, newpos), newpos, epptr() + off_type temp = epptr() - newpos; + setp(min(pbase(), newpos), epptr()); + pbump(static_cast<int>((epptr() - pbase()) - temp)); + } + __p = newoff; + } + } + } + return pos_type(__p); +} + +istrstream::~istrstream() +{ +} + +ostrstream::~ostrstream() +{ +} + +strstream::~strstream() +{ +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/support/win32/locale_win32.cpp b/contrib/libc++/src/support/win32/locale_win32.cpp new file mode 100644 index 0000000..02b5874 --- /dev/null +++ b/contrib/libc++/src/support/win32/locale_win32.cpp @@ -0,0 +1,94 @@ +// -*- C++ -*- +//===-------------------- support/win32/locale_win32.cpp ------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "support/win32/locale_win32.h" + +#include <stdarg.h> // va_start, va_end + +// FIXME: base currently unused. Needs manual work to construct the new locale +locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) +{ + return _create_locale( mask, locale ); +} +locale_t uselocale( locale_t newloc ) +{ + locale_t old_locale = _get_current_locale(); + // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale + _configthreadlocale( _ENABLE_PER_THREAD_LOCALE ); + // uselocale sets all categories + setlocale( LC_ALL, newloc->locinfo->lc_category[LC_ALL].locale ); + // uselocale returns the old locale_t + return old_locale; +} +lconv *localeconv_l( locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return localeconv(); +} +size_t mbrlen_l( const char *__restrict__ s, size_t n, + mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbrlen( s, n, ps ); +} +size_t mbsrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src, + size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbsrtowcs( dst, src, len, ps ); +} +size_t wcrtomb_l( char *__restrict__ s, wchar_t wc, mbstate_t *__restrict__ ps, + locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wcrtomb( s, wc, ps ); +} +size_t mbrtowc_l( wchar_t *__restrict__ pwc, const char *__restrict__ s, + size_t n, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbrtowc( pwc, s, n, ps ); +} +size_t mbsnrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src, + size_t nms, size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return mbsnrtowcs( dst, src, nms, len, ps ); +} +size_t wcsnrtombs_l( char *__restrict__ dst, const wchar_t **__restrict__ src, + size_t nwc, size_t len, mbstate_t *__restrict__ ps, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wcsnrtombs( dst, src, nwc, len, ps ); +} +wint_t btowc_l( int c, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return btowc( c ); +} +int wctob_l( wint_t c, locale_t loc ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return wctob( c ); +} + +int asprintf_l( char **ret, locale_t loc, const char *format, ... ) +{ + va_list ap; + va_start( ap, format ); + int result = vasprintf_l( ret, loc, format, ap ); + va_end(ap); + return result; +} +int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap ) +{ + __locale_raii __current( uselocale(loc), uselocale ); + return vasprintf( ret, format, ap ); +} diff --git a/contrib/libc++/src/support/win32/support.cpp b/contrib/libc++/src/support/win32/support.cpp new file mode 100644 index 0000000..9e85077 --- /dev/null +++ b/contrib/libc++/src/support/win32/support.cpp @@ -0,0 +1,70 @@ +// -*- C++ -*- +//===----------------------- support/win32/support.h ----------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include <support/win32/support.h> +#include <stdarg.h> // va_start, va_end +#include <stddef.h> // size_t +#include <stdlib.h> // malloc +#include <stdio.h> // vsprintf, vsnprintf +#include <string.h> // strcpy, wcsncpy + +int asprintf(char **sptr, const char *__restrict fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int result = vasprintf(sptr, fmt, ap); + va_end(ap); + return result; +} +int vasprintf( char **sptr, const char *__restrict fmt, va_list ap ) +{ + *sptr = NULL; + int count = vsnprintf( *sptr, 0, fmt, ap ); + if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) ) + { + vsprintf( *sptr, fmt, ap ); + sptr[count] = '\0'; + } + + return count; +} + +// FIXME: use wcrtomb and avoid copy +// use mbsrtowcs which is available, first copy first nwc elements of src +size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src, + size_t nmc, size_t len, mbstate_t *__restrict ps ) +{ + char* local_src = new char[nmc+1]; + char* nmcsrc = local_src; + strncpy( nmcsrc, *src, nmc ); + nmcsrc[nmc] = '\0'; + const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps ); + // propagate error + if( nmcsrc == NULL ) + *src = NULL; + delete[] local_src; + return result; +} +// FIXME: use wcrtomb and avoid copy +// use wcsrtombs which is available, first copy first nwc elements of src +size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src, + size_t nwc, size_t len, mbstate_t *__restrict ps ) +{ + wchar_t* local_src = new wchar_t[nwc]; + wchar_t* nwcsrc = local_src; + wcsncpy(nwcsrc, *src, nwc); + nwcsrc[nwc] = '\0'; + const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps ); + // propogate error + if( nwcsrc == NULL ) + *src = NULL; + delete[] nwcsrc; + return result; +} diff --git a/contrib/libc++/src/system_error.cpp b/contrib/libc++/src/system_error.cpp new file mode 100644 index 0000000..763d62c --- /dev/null +++ b/contrib/libc++/src/system_error.cpp @@ -0,0 +1,201 @@ +//===---------------------- system_error.cpp ------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "system_error" +#include "string" +#include "cstring" + +_LIBCPP_BEGIN_NAMESPACE_STD + +// class error_category + +error_category::error_category() _NOEXCEPT +{ +} + +error_category::~error_category() _NOEXCEPT +{ +} + +error_condition +error_category::default_error_condition(int ev) const _NOEXCEPT +{ + return error_condition(ev, *this); +} + +bool +error_category::equivalent(int code, const error_condition& condition) const _NOEXCEPT +{ + return default_error_condition(code) == condition; +} + +bool +error_category::equivalent(const error_code& code, int condition) const _NOEXCEPT +{ + return *this == code.category() && code.value() == condition; +} + +string +__do_message::message(int ev) const +{ + return string(strerror(ev)); +} + +class _LIBCPP_HIDDEN __generic_error_category + : public __do_message +{ +public: + virtual const char* name() const _NOEXCEPT; + virtual string message(int ev) const; +}; + +const char* +__generic_error_category::name() const _NOEXCEPT +{ + return "generic"; +} + +string +__generic_error_category::message(int ev) const +{ +#ifdef ELAST + if (ev > ELAST) + return string("unspecified generic_category error"); +#endif // ELAST + return __do_message::message(ev); +} + +const error_category& +generic_category() _NOEXCEPT +{ + static __generic_error_category s; + return s; +} + +class _LIBCPP_HIDDEN __system_error_category + : public __do_message +{ +public: + virtual const char* name() const _NOEXCEPT; + virtual string message(int ev) const; + virtual error_condition default_error_condition(int ev) const _NOEXCEPT; +}; + +const char* +__system_error_category::name() const _NOEXCEPT +{ + return "system"; +} + +string +__system_error_category::message(int ev) const +{ +#ifdef ELAST + if (ev > ELAST) + return string("unspecified system_category error"); +#endif // ELAST + return __do_message::message(ev); +} + +error_condition +__system_error_category::default_error_condition(int ev) const _NOEXCEPT +{ +#ifdef ELAST + if (ev > ELAST) + return error_condition(ev, system_category()); +#endif // ELAST + return error_condition(ev, generic_category()); +} + +const error_category& +system_category() _NOEXCEPT +{ + static __system_error_category s; + return s; +} + +// error_condition + +string +error_condition::message() const +{ + return __cat_->message(__val_); +} + +// error_code + +string +error_code::message() const +{ + return __cat_->message(__val_); +} + +// system_error + +string +system_error::__init(const error_code& ec, string what_arg) +{ + if (ec) + { + if (!what_arg.empty()) + what_arg += ": "; + what_arg += ec.message(); + } + return _VSTD::move(what_arg); +} + +system_error::system_error(error_code ec, const string& what_arg) + : runtime_error(__init(ec, what_arg)), + __ec_(ec) +{ +} + +system_error::system_error(error_code ec, const char* what_arg) + : runtime_error(__init(ec, what_arg)), + __ec_(ec) +{ +} + +system_error::system_error(error_code ec) + : runtime_error(__init(ec, "")), + __ec_(ec) +{ +} + +system_error::system_error(int ev, const error_category& ecat, const string& what_arg) + : runtime_error(__init(error_code(ev, ecat), what_arg)), + __ec_(error_code(ev, ecat)) +{ +} + +system_error::system_error(int ev, const error_category& ecat, const char* what_arg) + : runtime_error(__init(error_code(ev, ecat), what_arg)), + __ec_(error_code(ev, ecat)) +{ +} + +system_error::system_error(int ev, const error_category& ecat) + : runtime_error(__init(error_code(ev, ecat), "")), + __ec_(error_code(ev, ecat)) +{ +} + +system_error::~system_error() _NOEXCEPT +{ +} + +void +__throw_system_error(int ev, const char* what_arg) +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw system_error(error_code(ev, system_category()), what_arg); +#endif +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/thread.cpp b/contrib/libc++/src/thread.cpp new file mode 100644 index 0000000..f27136a --- /dev/null +++ b/contrib/libc++/src/thread.cpp @@ -0,0 +1,183 @@ +//===------------------------- thread.cpp----------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "thread" +#include "exception" +#include "vector" +#include "future" +#include <sys/types.h> +#if !_WIN32 && !__sun__ +#include <sys/sysctl.h> +#endif // _WIN32 + +_LIBCPP_BEGIN_NAMESPACE_STD + +thread::~thread() +{ + if (__t_ != 0) + terminate(); +} + +void +thread::join() +{ + int ec = pthread_join(__t_, 0); +#ifndef _LIBCPP_NO_EXCEPTIONS + if (ec) + throw system_error(error_code(ec, system_category()), "thread::join failed"); +#endif // _LIBCPP_NO_EXCEPTIONS + __t_ = 0; +} + +void +thread::detach() +{ + int ec = EINVAL; + if (__t_ != 0) + { + ec = pthread_detach(__t_); + if (ec == 0) + __t_ = 0; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + if (ec) + throw system_error(error_code(ec, system_category()), "thread::detach failed"); +#endif // _LIBCPP_NO_EXCEPTIONS +} + +unsigned +thread::hardware_concurrency() +{ +#if defined(CTL_HW) && defined(HW_NCPU) + unsigned n; + int mib[2] = {CTL_HW, HW_NCPU}; + std::size_t s = sizeof(n); + sysctl(mib, 2, &n, &s, 0, 0); + return n; +#else // defined(CTL_HW) && defined(HW_NCPU) + // TODO: grovel through /proc or check cpuid on x86 and similar + // instructions on other architectures. + return 0; // Means not computable [thread.thread.static] +#endif // defined(CTL_HW) && defined(HW_NCPU) +} + +namespace this_thread +{ + +void +sleep_for(const chrono::nanoseconds& ns) +{ + using namespace chrono; + if (ns >= nanoseconds::zero()) + { + timespec ts; + ts.tv_sec = static_cast<decltype(ts.tv_sec)>(duration_cast<seconds>(ns).count()); + ts.tv_nsec = static_cast<decltype(ts.tv_nsec)>((ns - seconds(ts.tv_sec)).count()); + nanosleep(&ts, 0); + } +} + +} // this_thread + +__thread_specific_ptr<__thread_struct>& +__thread_local_data() +{ + static __thread_specific_ptr<__thread_struct> __p; + return __p; +} + +// __thread_struct_imp + +template <class T> +class _LIBCPP_HIDDEN __hidden_allocator +{ +public: + typedef T value_type; + + T* allocate(size_t __n) + {return static_cast<T*>(::operator new(__n * sizeof(T)));} + void deallocate(T* __p, size_t) {::operator delete((void*)__p);} + + size_t max_size() const {return size_t(~0) / sizeof(T);} +}; + +class _LIBCPP_HIDDEN __thread_struct_imp +{ + typedef vector<__assoc_sub_state*, + __hidden_allocator<__assoc_sub_state*> > _AsyncStates; + typedef vector<pair<condition_variable*, mutex*>, + __hidden_allocator<pair<condition_variable*, mutex*> > > _Notify; + + _AsyncStates async_states_; + _Notify notify_; + + __thread_struct_imp(const __thread_struct_imp&); + __thread_struct_imp& operator=(const __thread_struct_imp&); +public: + __thread_struct_imp() {} + ~__thread_struct_imp(); + + void notify_all_at_thread_exit(condition_variable* cv, mutex* m); + void __make_ready_at_thread_exit(__assoc_sub_state* __s); +}; + +__thread_struct_imp::~__thread_struct_imp() +{ + for (_Notify::iterator i = notify_.begin(), e = notify_.end(); + i != e; ++i) + { + i->second->unlock(); + i->first->notify_all(); + } + for (_AsyncStates::iterator i = async_states_.begin(), e = async_states_.end(); + i != e; ++i) + { + (*i)->__make_ready(); + (*i)->__release_shared(); + } +} + +void +__thread_struct_imp::notify_all_at_thread_exit(condition_variable* cv, mutex* m) +{ + notify_.push_back(pair<condition_variable*, mutex*>(cv, m)); +} + +void +__thread_struct_imp::__make_ready_at_thread_exit(__assoc_sub_state* __s) +{ + async_states_.push_back(__s); + __s->__add_shared(); +} + +// __thread_struct + +__thread_struct::__thread_struct() + : __p_(new __thread_struct_imp) +{ +} + +__thread_struct::~__thread_struct() +{ + delete __p_; +} + +void +__thread_struct::notify_all_at_thread_exit(condition_variable* cv, mutex* m) +{ + __p_->notify_all_at_thread_exit(cv, m); +} + +void +__thread_struct::__make_ready_at_thread_exit(__assoc_sub_state* __s) +{ + __p_->__make_ready_at_thread_exit(__s); +} + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/typeinfo.cpp b/contrib/libc++/src/typeinfo.cpp new file mode 100644 index 0000000..cfc64ef --- /dev/null +++ b/contrib/libc++/src/typeinfo.cpp @@ -0,0 +1,53 @@ +//===------------------------- typeinfo.cpp -------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// +#include <stdlib.h> +#if __APPLE__ +#include <cxxabi.h> +#endif + +#include "typeinfo" + +#if !(defined(_LIBCPPABI_VERSION) || defined(LIBCXXRT)) + +std::bad_cast::bad_cast() _NOEXCEPT +{ +} + +std::bad_cast::~bad_cast() _NOEXCEPT +{ +} + +const char* +std::bad_cast::what() const _NOEXCEPT +{ + return "std::bad_cast"; +} + +std::bad_typeid::bad_typeid() _NOEXCEPT +{ +} + +std::bad_typeid::~bad_typeid() _NOEXCEPT +{ +} + +const char* +std::bad_typeid::what() const _NOEXCEPT +{ + return "std::bad_typeid"; +} + +#if __APPLE__ + // On Darwin, the cxa_bad_* functions cannot be in the lower level library + // because bad_cast and bad_typeid are defined in his higher level library + void __cxxabiv1::__cxa_bad_typeid() { throw std::bad_typeid(); } + void __cxxabiv1::__cxa_bad_cast() { throw std::bad_cast(); } +#endif + +#endif // _LIBCPPABI_VERSION diff --git a/contrib/libc++/src/utility.cpp b/contrib/libc++/src/utility.cpp new file mode 100644 index 0000000..7dccffb --- /dev/null +++ b/contrib/libc++/src/utility.cpp @@ -0,0 +1,16 @@ +//===------------------------ utility.cpp ---------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "utility" + +_LIBCPP_BEGIN_NAMESPACE_STD + +const piecewise_construct_t piecewise_construct = {}; + +_LIBCPP_END_NAMESPACE_STD diff --git a/contrib/libc++/src/valarray.cpp b/contrib/libc++/src/valarray.cpp new file mode 100644 index 0000000..2d8db52 --- /dev/null +++ b/contrib/libc++/src/valarray.cpp @@ -0,0 +1,54 @@ +//===------------------------ valarray.cpp --------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +#include "valarray" + +_LIBCPP_BEGIN_NAMESPACE_STD + +template valarray<size_t>::valarray(size_t); +template valarray<size_t>::~valarray(); +template void valarray<size_t>::resize(size_t, size_t); + +void +gslice::__init(size_t __start) +{ + valarray<size_t> __indices(__size_.size()); + size_t __k = __size_.size() != 0; + for (size_t __i = 0; __i < __size_.size(); ++__i) + __k *= __size_[__i]; + __1d_.resize(__k); + if (__1d_.size()) + { + __k = 0; + __1d_[__k] = __start; + while (true) + { + size_t __i = __indices.size() - 1; + while (true) + { + if (++__indices[__i] < __size_[__i]) + { + ++__k; + __1d_[__k] = __1d_[__k-1] + __stride_[__i]; + for (size_t __j = __i + 1; __j != __indices.size(); ++__j) + __1d_[__k] -= __stride_[__j] * (__size_[__j] - 1); + break; + } + else + { + if (__i == 0) + return; + __indices[__i--] = 0; + } + } + } + } +} + +_LIBCPP_END_NAMESPACE_STD |