aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Chisnall <theraven@FreeBSD.org>2011-11-22 17:30:41 +0000
committerDavid Chisnall <theraven@FreeBSD.org>2011-11-22 17:30:41 +0000
commit1828c5696f7bf5850943ea6c660a493a5e648669 (patch)
tree5c73f10d9b3740138364680a74334d50b222cd6d
downloadsrc-1828c5696f7bf5850943ea6c660a493a5e648669.tar.gz
src-1828c5696f7bf5850943ea6c660a493a5e648669.zip
Import libcxxrt / libc++ into a vendor branch.vendor/libc++/r145065
Approved by: dim (mentor)
Notes
Notes: svn path=/vendor/libc++/dist/; revision=227825 svn path=/vendor/libc++/r145065/; revision=227826; tag=vendor/libc++/r145065
-rw-r--r--include/__bit_reference1247
-rw-r--r--include/__config405
-rw-r--r--include/__debug191
-rw-r--r--include/__functional_032130
-rw-r--r--include/__functional_base430
-rw-r--r--include/__functional_base_031087
-rw-r--r--include/__hash_table1918
-rw-r--r--include/__locale1414
-rw-r--r--include/__mutex_base439
-rw-r--r--include/__split_buffer650
-rw-r--r--include/__sso_allocator77
-rw-r--r--include/__std_stream315
-rw-r--r--include/__tree2293
-rw-r--r--include/__tuple269
-rw-r--r--include/__tuple_0327
-rw-r--r--include/algorithm5361
-rw-r--r--include/array338
-rw-r--r--include/atomic1515
-rw-r--r--include/bitset1048
-rw-r--r--include/cassert25
-rw-r--r--include/ccomplex29
-rw-r--r--include/cctype164
-rw-r--r--include/cerrno393
-rw-r--r--include/cfenv82
-rw-r--r--include/cfloat78
-rw-r--r--include/chrono873
-rw-r--r--include/cinttypes259
-rw-r--r--include/ciso64625
-rw-r--r--include/climits48
-rw-r--r--include/clocale53
-rw-r--r--include/cmath1640
-rw-r--r--include/codecvt547
-rw-r--r--include/complex1516
-rw-r--r--include/complex.h35
-rw-r--r--include/condition_variable256
-rw-r--r--include/csetjmp52
-rw-r--r--include/csignal58
-rw-r--r--include/cstdarg48
-rw-r--r--include/cstdbool32
-rw-r--r--include/cstddef102
-rw-r--r--include/cstdint191
-rw-r--r--include/cstdio163
-rw-r--r--include/cstdlib145
-rw-r--r--include/cstring112
-rw-r--r--include/ctgmath29
-rw-r--r--include/ctime72
-rw-r--r--include/cwchar204
-rw-r--r--include/cwctype213
-rw-r--r--include/deque2842
-rw-r--r--include/exception250
-rw-r--r--include/ext/__hash46
-rw-r--r--include/ext/hash_map995
-rw-r--r--include/ext/hash_set657
-rw-r--r--include/forward_list1634
-rw-r--r--include/fstream1396
-rw-r--r--include/functional1999
-rw-r--r--include/future2517
-rw-r--r--include/initializer_list105
-rw-r--r--include/iomanip504
-rw-r--r--include/ios987
-rw-r--r--include/iosfwd194
-rw-r--r--include/iostream60
-rw-r--r--include/istream1711
-rw-r--r--include/iterator1804
-rw-r--r--include/limits619
-rw-r--r--include/list2273
-rw-r--r--include/locale4485
-rw-r--r--include/map1931
-rw-r--r--include/memory4193
-rw-r--r--include/mutex562
-rw-r--r--include/new117
-rw-r--r--include/numeric197
-rw-r--r--include/ostream1295
-rw-r--r--include/queue715
-rw-r--r--include/random6601
-rw-r--r--include/ratio485
-rw-r--r--include/regex6415
-rw-r--r--include/scoped_allocator578
-rw-r--r--include/set1025
-rw-r--r--include/sstream886
-rw-r--r--include/stack290
-rw-r--r--include/stdexcept162
-rw-r--r--include/streambuf564
-rw-r--r--include/string3986
-rw-r--r--include/strstream400
-rw-r--r--include/support/win32/limits_win32.h79
-rw-r--r--include/support/win32/locale_win32.h116
-rw-r--r--include/support/win32/math_win32.h113
-rw-r--r--include/support/win32/support.h92
-rw-r--r--include/system_error643
-rw-r--r--include/tgmath.h29
-rw-r--r--include/thread446
-rw-r--r--include/tuple937
-rw-r--r--include/type_traits3082
-rw-r--r--include/typeindex103
-rw-r--r--include/typeinfo124
-rw-r--r--include/unordered_map1795
-rw-r--r--include/unordered_set1144
-rw-r--r--include/utility584
-rw-r--r--include/valarray4773
-rw-r--r--include/vector3144
-rw-r--r--src/algorithm.cpp83
-rw-r--r--src/bind.cpp30
-rw-r--r--src/chrono.cpp128
-rw-r--r--src/condition_variable.cpp70
-rw-r--r--src/debug.cpp484
-rw-r--r--src/exception.cpp206
-rw-r--r--src/future.cpp285
-rw-r--r--src/hash.cpp559
-rw-r--r--src/ios.cpp455
-rw-r--r--src/iostream.cpp53
-rw-r--r--src/locale.cpp5829
-rw-r--r--src/memory.cpp168
-rw-r--r--src/mutex.cpp250
-rw-r--r--src/new.cpp185
-rw-r--r--src/random.cpp45
-rw-r--r--src/regex.cpp315
-rw-r--r--src/stdexcept.cpp178
-rw-r--r--src/string.cpp679
-rw-r--r--src/strstream.cpp327
-rw-r--r--src/support/win32/locale_win32.cpp94
-rw-r--r--src/support/win32/support.cpp70
-rw-r--r--src/system_error.cpp201
-rw-r--r--src/thread.cpp183
-rw-r--r--src/typeinfo.cpp50
-rw-r--r--src/utility.cpp16
-rw-r--r--src/valarray.cpp54
127 files changed, 112279 insertions, 0 deletions
diff --git a/include/__bit_reference b/include/__bit_reference
new file mode 100644
index 000000000000..46213332c3e8
--- /dev/null
+++ b/include/__bit_reference
@@ -0,0 +1,1247 @@
+// -*- 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>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+template <class _C, bool _IsConst> class __bit_iterator;
+template <class _C> class __bit_const_reference;
+
+template <class _Tp>
+struct __has_storage_type
+{
+ static const bool value = false;
+};
+
+template <class _C, bool = __has_storage_type<_C>::value>
+class __bit_reference
+{
+ typedef typename _C::__storage_type __storage_type;
+ typedef typename _C::__storage_pointer __storage_pointer;
+
+ __storage_pointer __seg_;
+ __storage_type __mask_;
+
+#if defined(__clang__)
+ friend typename _C::__self;
+#else
+ friend class _C::__self;
+#endif
+ friend class __bit_const_reference<_C>;
+ friend class __bit_iterator<_C, 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<_C, false> operator&() const _NOEXCEPT
+ {return __bit_iterator<_C, 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 _C>
+class __bit_reference<_C, false>
+{
+};
+
+template <class _C, class _D>
+_LIBCPP_INLINE_VISIBILITY inline
+void
+swap(__bit_reference<_C> __x, __bit_reference<_D> __y) _NOEXCEPT
+{
+ bool __t = __x;
+ __x = __y;
+ __y = __t;
+}
+
+template <class _C>
+_LIBCPP_INLINE_VISIBILITY inline
+void
+swap(__bit_reference<_C> __x, bool& __y) _NOEXCEPT
+{
+ bool __t = __x;
+ __x = __y;
+ __y = __t;
+}
+
+template <class _C>
+_LIBCPP_INLINE_VISIBILITY inline
+void
+swap(bool& __x, __bit_reference<_C> __y) _NOEXCEPT
+{
+ bool __t = __x;
+ __x = __y;
+ __y = __t;
+}
+
+template <class _C>
+class __bit_const_reference
+{
+ typedef typename _C::__storage_type __storage_type;
+ typedef typename _C::__const_storage_pointer __storage_pointer;
+
+ __storage_pointer __seg_;
+ __storage_type __mask_;
+
+#if defined(__clang__)
+ friend typename _C::__self;
+#else
+ friend class _C::__self;
+#endif
+ friend class __bit_iterator<_C, true>;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ __bit_const_reference(const __bit_reference<_C>& __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<_C, true> operator&() const _NOEXCEPT
+ {return __bit_iterator<_C, 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 _C>
+__bit_iterator<_C, false>
+__find_bool_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C>
+__bit_iterator<_C, false>
+__find_bool_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C, class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+__bit_iterator<_C, false>
+find(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, const _Tp& __value_)
+{
+ if (static_cast<bool>(__value_))
+ return __find_bool_true(__first, static_cast<typename _C::size_type>(__last - __first));
+ return __find_bool_false(__first, static_cast<typename _C::size_type>(__last - __first));
+}
+
+// count
+
+template <class _C>
+typename __bit_iterator<_C, false>::difference_type
+__count_bool_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C>
+typename __bit_iterator<_C, false>::difference_type
+__count_bool_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C, class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __bit_iterator<_C, false>::difference_type
+count(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, const _Tp& __value_)
+{
+ if (static_cast<bool>(__value_))
+ return __count_bool_true(__first, static_cast<typename _C::size_type>(__last - __first));
+ return __count_bool_false(__first, static_cast<typename _C::size_type>(__last - __first));
+}
+
+// fill_n
+
+template <class _C>
+void
+__fill_n_false(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C>
+void
+__fill_n_true(__bit_iterator<_C, false> __first, typename _C::size_type __n)
+{
+ typedef __bit_iterator<_C, 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 _C>
+_LIBCPP_INLINE_VISIBILITY inline
+void
+fill_n(__bit_iterator<_C, false> __first, typename _C::size_type __n, bool __value_)
+{
+ if (__n > 0)
+ {
+ if (__value_)
+ __fill_n_true(__first, __n);
+ else
+ __fill_n_false(__first, __n);
+ }
+}
+
+// fill
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+fill(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __last, bool __value_)
+{
+ _VSTD::fill_n(__first, static_cast<typename _C::size_type>(__last - __first), __value_);
+}
+
+// copy
+
+template <class _C, bool _IsConst>
+__bit_iterator<_C, false>
+__copy_aligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
+ __bit_iterator<_C, false> __result)
+{
+ typedef __bit_iterator<_C, _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 _C, bool _IsConst>
+__bit_iterator<_C, false>
+__copy_unaligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
+ __bit_iterator<_C, false> __result)
+{
+ typedef __bit_iterator<_C, _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 _C, bool _IsConst>
+inline _LIBCPP_INLINE_VISIBILITY
+__bit_iterator<_C, false>
+copy(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
+{
+ if (__first.__ctz_ == __result.__ctz_)
+ return __copy_aligned(__first, __last, __result);
+ return __copy_unaligned(__first, __last, __result);
+}
+
+// copy_backward
+
+template <class _C, bool _IsConst>
+__bit_iterator<_C, false>
+__copy_backward_aligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
+ __bit_iterator<_C, false> __result)
+{
+ typedef __bit_iterator<_C, _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 _C, bool _IsConst>
+__bit_iterator<_C, false>
+__copy_backward_unaligned(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last,
+ __bit_iterator<_C, false> __result)
+{
+ typedef __bit_iterator<_C, _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;
+ unsigned __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 _C, bool _IsConst>
+inline _LIBCPP_INLINE_VISIBILITY
+__bit_iterator<_C, false>
+copy_backward(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
+{
+ if (__last.__ctz_ == __result.__ctz_)
+ return __copy_backward_aligned(__first, __last, __result);
+ return __copy_backward_unaligned(__first, __last, __result);
+}
+
+// move
+
+template <class _C, bool _IsConst>
+inline _LIBCPP_INLINE_VISIBILITY
+__bit_iterator<_C, false>
+move(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, false> __result)
+{
+ return _VSTD::copy(__first, __last, __result);
+}
+
+// move_backward
+
+template <class _C, bool _IsConst>
+inline _LIBCPP_INLINE_VISIBILITY
+__bit_iterator<_C, false>
+move_backward(__bit_iterator<_C, _IsConst> __first, __bit_iterator<_C, _IsConst> __last, __bit_iterator<_C, 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 _C>
+struct __bit_array
+{
+ typedef typename _C::difference_type difference_type;
+ typedef typename _C::__storage_type __storage_type;
+ typedef typename _C::iterator iterator;
+ static const unsigned __bits_per_word = _C::__bits_per_word;
+ static const unsigned _N = 4;
+
+ difference_type __size_;
+ __storage_type __word_[_N];
+
+ _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
+ {return static_cast<difference_type>(_N * __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 _C>
+__bit_iterator<_C, false>
+rotate(__bit_iterator<_C, false> __first, __bit_iterator<_C, false> __middle, __bit_iterator<_C, false> __last)
+{
+ typedef __bit_iterator<_C, 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 __d1 = __middle - __first;
+ difference_type __d2 = __last - __middle;
+ _I1 __r = __first + __d2;
+ while (__d1 != 0 && __d2 != 0)
+ {
+ if (__d1 <= __d2)
+ {
+ if (__d1 <= __bit_array<_C>::capacity())
+ {
+ __bit_array<_C> __b(__d1);
+ _VSTD::copy(__first, __middle, __b.begin());
+ _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
+ break;
+ }
+ else
+ {
+ __bit_iterator<_C, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
+ __first = __middle;
+ __middle = __mp;
+ __d2 -= __d1;
+ }
+ }
+ else
+ {
+ if (__d2 <= __bit_array<_C>::capacity())
+ {
+ __bit_array<_C> __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<_C, false> __mp = __first + __d2;
+ _VSTD::swap_ranges(__first, __mp, __middle);
+ __first = __mp;
+ __d1 -= __d2;
+ }
+ }
+ }
+ return __r;
+}
+
+// equal
+
+template <class _C>
+bool
+__equal_unaligned(__bit_iterator<_C, true> __first1, __bit_iterator<_C, true> __last1,
+ __bit_iterator<_C, true> __first2)
+{
+ typedef __bit_iterator<_C, 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 _C>
+bool
+__equal_aligned(__bit_iterator<_C, true> __first1, __bit_iterator<_C, true> __last1,
+ __bit_iterator<_C, true> __first2)
+{
+ typedef __bit_iterator<_C, 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 _C, bool _IC1, bool _IC2>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+equal(__bit_iterator<_C, _IC1> __first1, __bit_iterator<_C, _IC1> __last1, __bit_iterator<_C, _IC2> __first2)
+{
+ if (__first1.__ctz_ == __first2.__ctz_)
+ return __equal_aligned(__first1, __last1, __first2);
+ return __equal_unaligned(__first1, __last1, __first2);
+}
+
+template <class _C, bool _IsConst>
+class __bit_iterator
+{
+public:
+ typedef typename _C::difference_type difference_type;
+ typedef bool value_type;
+ typedef __bit_iterator pointer;
+ typedef typename conditional<_IsConst, __bit_const_reference<_C>, __bit_reference<_C> >::type reference;
+ typedef random_access_iterator_tag iterator_category;
+
+private:
+ typedef typename _C::__storage_type __storage_type;
+ typedef typename conditional<_IsConst, typename _C::__const_storage_pointer,
+ typename _C::__storage_pointer>::type __storage_pointer;
+ static const unsigned __bits_per_word = _C::__bits_per_word;
+
+ __storage_pointer __seg_;
+ unsigned __ctz_;
+
+public:
+ _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT {}
+
+ _LIBCPP_INLINE_VISIBILITY
+ __bit_iterator(const __bit_iterator<_C, 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 _C::__self;
+#else
+ friend class _C::__self;
+#endif
+ friend class __bit_reference<_C>;
+ friend class __bit_const_reference<_C>;
+ friend class __bit_iterator<_C, true>;
+ template <class _D> friend struct __bit_array;
+ template <class _D> friend void __fill_n_false(__bit_iterator<_D, false> __first, typename _D::size_type __n);
+ template <class _D> friend void __fill_n_true(__bit_iterator<_D, false> __first, typename _D::size_type __n);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_aligned(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, false> __result);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_unaligned(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, false> __result);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> copy(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, false> __result);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_backward_aligned(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, false> __result);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> __copy_backward_unaligned(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, false> __result);
+ template <class _D, bool _IC> friend __bit_iterator<_D, false> copy_backward(__bit_iterator<_D, _IC> __first,
+ __bit_iterator<_D, _IC> __last,
+ __bit_iterator<_D, 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 _D> friend __bit_iterator<_D, false> rotate(__bit_iterator<_D, false>,
+ __bit_iterator<_D, false>,
+ __bit_iterator<_D, false>);
+ template <class _D> friend bool __equal_aligned(__bit_iterator<_D, true>,
+ __bit_iterator<_D, true>,
+ __bit_iterator<_D, true>);
+ template <class _D> friend bool __equal_unaligned(__bit_iterator<_D, true>,
+ __bit_iterator<_D, true>,
+ __bit_iterator<_D, true>);
+ template <class _D, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_D, _IC1>,
+ __bit_iterator<_D, _IC1>,
+ __bit_iterator<_D, _IC2>);
+ template <class _D> friend __bit_iterator<_D, false> __find_bool_true(__bit_iterator<_D, false>,
+ typename _D::size_type);
+ template <class _D> friend __bit_iterator<_D, false> __find_bool_false(__bit_iterator<_D, false>,
+ typename _D::size_type);
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___BIT_REFERENCE
diff --git a/include/__config b/include/__config
new file mode 100644
index 000000000000..0f6c77dd9817
--- /dev/null
+++ b/include/__config
@@ -0,0 +1,405 @@
+// -*- 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
+
+#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_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
+#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 __APPLE__ || __FreeBSD__ || _WIN32
+#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__
+#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/include/__debug b/include/__debug
new file mode 100644
index 000000000000..cd3bd3a98d98
--- /dev/null
+++ b/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* _C = static_cast<_Cont*>(__c_);
+ return _C->__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* _C = static_cast<_Cont*>(__c_);
+ return _C->__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* _C = static_cast<_Cont*>(__c_);
+ return _C->__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* _C = static_cast<_Cont*>(__c_);
+ return _C->__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/include/__functional_03 b/include/__functional_03
new file mode 100644
index 000000000000..5d30ce2b7502
--- /dev/null
+++ b/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 _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R _T::*>
+mem_fn(_R _T::* __pm)
+{
+ return __mem_fn<_R _T::*>(__pm);
+}
+
+template<class _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)()>
+mem_fn(_R (_T::* __pm)())
+{
+ return __mem_fn<_R (_T::*)()>(__pm);
+}
+
+template<class _R, class _T, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0)>
+mem_fn(_R (_T::* __pm)(_A0))
+{
+ return __mem_fn<_R (_T::*)(_A0)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1)>
+mem_fn(_R (_T::* __pm)(_A0, _A1))
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1, _A2)>
+mem_fn(_R (_T::* __pm)(_A0, _A1, _A2))
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1, _A2)>(__pm);
+}
+
+template<class _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)()>
+mem_fn(_R (_T::* __pm)() const)
+{
+ return __mem_fn<_R (_T::*)()>(__pm);
+}
+
+template<class _R, class _T, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0)>
+mem_fn(_R (_T::* __pm)(_A0) const)
+{
+ return __mem_fn<_R (_T::*)(_A0)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1)>
+mem_fn(_R (_T::* __pm)(_A0, _A1) const)
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1, _A2)>
+mem_fn(_R (_T::* __pm)(_A0, _A1, _A2) const)
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1, _A2)>(__pm);
+}
+
+template<class _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)()>
+mem_fn(_R (_T::* __pm)() volatile)
+{
+ return __mem_fn<_R (_T::*)()>(__pm);
+}
+
+template<class _R, class _T, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0)>
+mem_fn(_R (_T::* __pm)(_A0) volatile)
+{
+ return __mem_fn<_R (_T::*)(_A0)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1)>
+mem_fn(_R (_T::* __pm)(_A0, _A1) volatile)
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1, _A2)>
+mem_fn(_R (_T::* __pm)(_A0, _A1, _A2) volatile)
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1, _A2)>(__pm);
+}
+
+template<class _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)()>
+mem_fn(_R (_T::* __pm)() const volatile)
+{
+ return __mem_fn<_R (_T::*)()>(__pm);
+}
+
+template<class _R, class _T, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0)>
+mem_fn(_R (_T::* __pm)(_A0) const volatile)
+{
+ return __mem_fn<_R (_T::*)(_A0)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1)>
+mem_fn(_R (_T::* __pm)(_A0, _A1) const volatile)
+{
+ return __mem_fn<_R (_T::*)(_A0, _A1)>(__pm);
+}
+
+template<class _R, class _T, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_A0, _A1, _A2)>
+mem_fn(_R (_T::* __pm)(_A0, _A1, _A2) const volatile)
+{
+ return __mem_fn<_R (_T::*)(_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 _F>
+struct __maybe_derive_from_unary_function
+{
+};
+
+template<class _R, class _A1>
+struct __maybe_derive_from_unary_function<_R(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template<class _F>
+struct __maybe_derive_from_binary_function
+{
+};
+
+template<class _R, class _A1, class _A2>
+struct __maybe_derive_from_binary_function<_R(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template<class _Fp> class __base;
+
+template<class _R>
+class __base<_R()>
+{
+ __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 _R 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 _R, class _A0>
+class __base<_R(_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 _R 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 _R, class _A0, class _A1>
+class __base<_R(_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 _R 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 _R, class _A0, class _A1, class _A2>
+class __base<_R(_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 _R 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 _F, class _Alloc, class _R>
+class __func<_F, _Alloc, _R()>
+ : public __base<_R()>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ explicit __func(_F __f) : __f_(_VSTD::move(__f)) {}
+ explicit __func(_F __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
+ virtual __base<_R()>* __clone() const;
+ virtual void __clone(__base<_R()>*) const;
+ virtual void destroy();
+ virtual void destroy_deallocate();
+ virtual _R 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 _F, class _Alloc, class _R>
+__base<_R()>*
+__func<_F, _Alloc, _R()>::__clone() const
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__func, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
+ return __hold.release();
+}
+
+template<class _F, class _Alloc, class _R>
+void
+__func<_F, _Alloc, _R()>::__clone(__base<_R()>* __p) const
+{
+ ::new (__p) __func(__f_.first(), __f_.second());
+}
+
+template<class _F, class _Alloc, class _R>
+void
+__func<_F, _Alloc, _R()>::destroy()
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R>
+void
+__func<_F, _Alloc, _R()>::destroy_deallocate()
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R>
+_R
+__func<_F, _Alloc, _R()>::operator()()
+{
+ return __invoke(__f_.first());
+}
+
+#ifndef _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R>
+const void*
+__func<_F, _Alloc, _R()>::target(const type_info& __ti) const
+{
+ if (__ti == typeid(_F))
+ return &__f_.first();
+ return (const void*)0;
+}
+
+template<class _F, class _Alloc, class _R>
+const std::type_info&
+__func<_F, _Alloc, _R()>::target_type() const
+{
+ return typeid(_F);
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0>
+class __func<_F, _Alloc, _R(_A0)>
+ : public __base<_R(_A0)>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f) : __f_(_VSTD::move(__f)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f, _Alloc __a)
+ : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
+ virtual __base<_R(_A0)>* __clone() const;
+ virtual void __clone(__base<_R(_A0)>*) const;
+ virtual void destroy();
+ virtual void destroy_deallocate();
+ virtual _R 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 _F, class _Alloc, class _R, class _A0>
+__base<_R(_A0)>*
+__func<_F, _Alloc, _R(_A0)>::__clone() const
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__func, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
+ return __hold.release();
+}
+
+template<class _F, class _Alloc, class _R, class _A0>
+void
+__func<_F, _Alloc, _R(_A0)>::__clone(__base<_R(_A0)>* __p) const
+{
+ ::new (__p) __func(__f_.first(), __f_.second());
+}
+
+template<class _F, class _Alloc, class _R, class _A0>
+void
+__func<_F, _Alloc, _R(_A0)>::destroy()
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R, class _A0>
+void
+__func<_F, _Alloc, _R(_A0)>::destroy_deallocate()
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R, class _A0>
+_R
+__func<_F, _Alloc, _R(_A0)>::operator()(_A0 __a0)
+{
+ return __invoke(__f_.first(), __a0);
+}
+
+#ifndef _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0>
+const void*
+__func<_F, _Alloc, _R(_A0)>::target(const type_info& __ti) const
+{
+ if (__ti == typeid(_F))
+ return &__f_.first();
+ return (const void*)0;
+}
+
+template<class _F, class _Alloc, class _R, class _A0>
+const std::type_info&
+__func<_F, _Alloc, _R(_A0)>::target_type() const
+{
+ return typeid(_F);
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+class __func<_F, _Alloc, _R(_A0, _A1)>
+ : public __base<_R(_A0, _A1)>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f) : __f_(_VSTD::move(__f)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f, _Alloc __a)
+ : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
+ virtual __base<_R(_A0, _A1)>* __clone() const;
+ virtual void __clone(__base<_R(_A0, _A1)>*) const;
+ virtual void destroy();
+ virtual void destroy_deallocate();
+ virtual _R 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 _F, class _Alloc, class _R, class _A0, class _A1>
+__base<_R(_A0, _A1)>*
+__func<_F, _Alloc, _R(_A0, _A1)>::__clone() const
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__func, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
+ return __hold.release();
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+void
+__func<_F, _Alloc, _R(_A0, _A1)>::__clone(__base<_R(_A0, _A1)>* __p) const
+{
+ ::new (__p) __func(__f_.first(), __f_.second());
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+void
+__func<_F, _Alloc, _R(_A0, _A1)>::destroy()
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+void
+__func<_F, _Alloc, _R(_A0, _A1)>::destroy_deallocate()
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+_R
+__func<_F, _Alloc, _R(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1)
+{
+ return __invoke(__f_.first(), __a0, __a1);
+}
+
+#ifndef _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+const void*
+__func<_F, _Alloc, _R(_A0, _A1)>::target(const type_info& __ti) const
+{
+ if (__ti == typeid(_F))
+ return &__f_.first();
+ return (const void*)0;
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1>
+const std::type_info&
+__func<_F, _Alloc, _R(_A0, _A1)>::target_type() const
+{
+ return typeid(_F);
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+class __func<_F, _Alloc, _R(_A0, _A1, _A2)>
+ : public __base<_R(_A0, _A1, _A2)>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f) : __f_(_VSTD::move(__f)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __func(_F __f, _Alloc __a)
+ : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
+ virtual __base<_R(_A0, _A1, _A2)>* __clone() const;
+ virtual void __clone(__base<_R(_A0, _A1, _A2)>*) const;
+ virtual void destroy();
+ virtual void destroy_deallocate();
+ virtual _R 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 _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+__base<_R(_A0, _A1, _A2)>*
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::__clone() const
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__func, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
+ return __hold.release();
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+void
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::__clone(__base<_R(_A0, _A1, _A2)>* __p) const
+{
+ ::new (__p) __func(__f_.first(), __f_.second());
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+void
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::destroy()
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+void
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::destroy_deallocate()
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+_R
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2)
+{
+ return __invoke(__f_.first(), __a0, __a1, __a2);
+}
+
+#ifndef _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+const void*
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::target(const type_info& __ti) const
+{
+ if (__ti == typeid(_F))
+ return &__f_.first();
+ return (const void*)0;
+}
+
+template<class _F, class _Alloc, class _R, class _A0, class _A1, class _A2>
+const std::type_info&
+__func<_F, _Alloc, _R(_A0, _A1, _A2)>::target_type() const
+{
+ return typeid(_F);
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+} // __function
+
+template<class _R>
+class _LIBCPP_VISIBLE function<_R()>
+{
+ typedef __function::__base<_R()> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+ template <class _F>
+ static bool __not_null(const _F&) {return true;}
+ template <class _R2>
+ static bool __not_null(const function<_R()>& __p) {return __p;}
+public:
+ typedef _R 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 _F>
+ function(_F,
+ typename enable_if<!is_integral<_F>::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 _F, class _Alloc>
+ function(allocator_arg_t, const _Alloc& __a, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type* = 0);
+
+ function& operator=(const function&);
+ function& operator=(nullptr_t);
+ template<class _F>
+ typename enable_if
+ <
+ !is_integral<_F>::value,
+ function&
+ >::type
+ operator=(_F);
+
+ ~function();
+
+ // 20.7.16.2.2, function modifiers:
+ void swap(function&);
+ template<class _F, class _Alloc>
+ _LIBCPP_INLINE_VISIBILITY
+ void assign(_F __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:
+ _R operator()() const;
+
+#ifndef _LIBCPP_NO_RTTI
+ // 20.7.16.2.5, function target access:
+ const std::type_info& target_type() const;
+ template <typename _T> _T* target();
+ template <typename _T> const _T* target() const;
+#endif // _LIBCPP_NO_RTTI
+};
+
+template<class _R>
+function<_R()>::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 _R>
+template<class _Alloc>
+function<_R()>::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 _R>
+template <class _F>
+function<_R()>::function(_F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, allocator<_F>, _R()> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(__f);
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, allocator<_F>(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R>
+template <class _F, class _Alloc>
+function<_R()>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, _Alloc, _R()> _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
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, _Alloc(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R>
+function<_R()>&
+function<_R()>::operator=(const function& __f)
+{
+ function(__f).swap(*this);
+ return *this;
+}
+
+template<class _R>
+function<_R()>&
+function<_R()>::operator=(nullptr_t)
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+ __f_ = 0;
+}
+
+template<class _R>
+template <class _F>
+typename enable_if
+<
+ !is_integral<_F>::value,
+ function<_R()>&
+>::type
+function<_R()>::operator=(_F __f)
+{
+ function(_VSTD::move(__f)).swap(*this);
+ return *this;
+}
+
+template<class _R>
+function<_R()>::~function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R>
+void
+function<_R()>::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 _R>
+_R
+function<_R()>::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 _R>
+const std::type_info&
+function<_R()>::target_type() const
+{
+ if (__f_ == 0)
+ return typeid(void);
+ return __f_->target_type();
+}
+
+template<class _R>
+template <typename _T>
+_T*
+function<_R()>::target()
+{
+ if (__f_ == 0)
+ return (_T*)0;
+ return (_T*)__f_->target(typeid(_T));
+}
+
+template<class _R>
+template <typename _T>
+const _T*
+function<_R()>::target() const
+{
+ if (__f_ == 0)
+ return (const _T*)0;
+ return (const _T*)__f_->target(typeid(_T));
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _R, class _A0>
+class _LIBCPP_VISIBLE function<_R(_A0)>
+ : public unary_function<_A0, _R>
+{
+ typedef __function::__base<_R(_A0)> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+ template <class _F>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const _F&) {return true;}
+ template <class _R2, class _B0>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (*__p)(_B0)) {return __p;}
+ template <class _R2, class _C>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)()) {return __p;}
+ template <class _R2, class _C>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)() const) {return __p;}
+ template <class _R2, class _C>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)() volatile) {return __p;}
+ template <class _R2, class _C>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)() const volatile) {return __p;}
+ template <class _R2, class _B0>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const function<_R(_B0)>& __p) {return __p;}
+public:
+ typedef _R 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 _F>
+ function(_F,
+ typename enable_if<!is_integral<_F>::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 _F, class _Alloc>
+ function(allocator_arg_t, const _Alloc& __a, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type* = 0);
+
+ function& operator=(const function&);
+ function& operator=(nullptr_t);
+ template<class _F>
+ typename enable_if
+ <
+ !is_integral<_F>::value,
+ function&
+ >::type
+ operator=(_F);
+
+ ~function();
+
+ // 20.7.16.2.2, function modifiers:
+ void swap(function&);
+ template<class _F, class _Alloc>
+ _LIBCPP_INLINE_VISIBILITY
+ void assign(_F __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:
+ _R operator()(_A0) const;
+
+#ifndef _LIBCPP_NO_RTTI
+ // 20.7.16.2.5, function target access:
+ const std::type_info& target_type() const;
+ template <typename _T> _T* target();
+ template <typename _T> const _T* target() const;
+#endif // _LIBCPP_NO_RTTI
+};
+
+template<class _R, class _A0>
+function<_R(_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 _R, class _A0>
+template<class _Alloc>
+function<_R(_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 _R, class _A0>
+template <class _F>
+function<_R(_A0)>::function(_F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, allocator<_F>, _R(_A0)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(__f);
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, allocator<_F>(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0>
+template <class _F, class _Alloc>
+function<_R(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, _Alloc, _R(_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
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, _Alloc(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0>
+function<_R(_A0)>&
+function<_R(_A0)>::operator=(const function& __f)
+{
+ function(__f).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0>
+function<_R(_A0)>&
+function<_R(_A0)>::operator=(nullptr_t)
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+ __f_ = 0;
+}
+
+template<class _R, class _A0>
+template <class _F>
+typename enable_if
+<
+ !is_integral<_F>::value,
+ function<_R(_A0)>&
+>::type
+function<_R(_A0)>::operator=(_F __f)
+{
+ function(_VSTD::move(__f)).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0>
+function<_R(_A0)>::~function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R, class _A0>
+void
+function<_R(_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 _R, class _A0>
+_R
+function<_R(_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 _R, class _A0>
+const std::type_info&
+function<_R(_A0)>::target_type() const
+{
+ if (__f_ == 0)
+ return typeid(void);
+ return __f_->target_type();
+}
+
+template<class _R, class _A0>
+template <typename _T>
+_T*
+function<_R(_A0)>::target()
+{
+ if (__f_ == 0)
+ return (_T*)0;
+ return (_T*)__f_->target(typeid(_T));
+}
+
+template<class _R, class _A0>
+template <typename _T>
+const _T*
+function<_R(_A0)>::target() const
+{
+ if (__f_ == 0)
+ return (const _T*)0;
+ return (const _T*)__f_->target(typeid(_T));
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _R, class _A0, class _A1>
+class _LIBCPP_VISIBLE function<_R(_A0, _A1)>
+ : public binary_function<_A0, _A1, _R>
+{
+ typedef __function::__base<_R(_A0, _A1)> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+ template <class _F>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const _F&) {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 _C, class _B1>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1)) {return __p;}
+ template <class _R2, class _C, class _B1>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1) const) {return __p;}
+ template <class _R2, class _C, class _B1>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1) volatile) {return __p;}
+ template <class _R2, class _C, class _B1>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1) const volatile) {return __p;}
+ template <class _R2, class _B0, class _B1>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const function<_R(_B0, _B1)>& __p) {return __p;}
+public:
+ typedef _R 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 _F>
+ function(_F,
+ typename enable_if<!is_integral<_F>::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 _F, class _Alloc>
+ function(allocator_arg_t, const _Alloc& __a, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type* = 0);
+
+ function& operator=(const function&);
+ function& operator=(nullptr_t);
+ template<class _F>
+ typename enable_if
+ <
+ !is_integral<_F>::value,
+ function&
+ >::type
+ operator=(_F);
+
+ ~function();
+
+ // 20.7.16.2.2, function modifiers:
+ void swap(function&);
+ template<class _F, class _Alloc>
+ _LIBCPP_INLINE_VISIBILITY
+ void assign(_F __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:
+ _R 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 _T> _T* target();
+ template <typename _T> const _T* target() const;
+#endif // _LIBCPP_NO_RTTI
+};
+
+template<class _R, class _A0, class _A1>
+function<_R(_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 _R, class _A0, class _A1>
+template<class _Alloc>
+function<_R(_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 _R, class _A0, class _A1>
+template <class _F>
+function<_R(_A0, _A1)>::function(_F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, allocator<_F>, _R(_A0, _A1)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(__f);
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, allocator<_F>(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0, class _A1>
+template <class _F, class _Alloc>
+function<_R(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, _Alloc, _R(_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
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, _Alloc(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0, class _A1>
+function<_R(_A0, _A1)>&
+function<_R(_A0, _A1)>::operator=(const function& __f)
+{
+ function(__f).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0, class _A1>
+function<_R(_A0, _A1)>&
+function<_R(_A0, _A1)>::operator=(nullptr_t)
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+ __f_ = 0;
+}
+
+template<class _R, class _A0, class _A1>
+template <class _F>
+typename enable_if
+<
+ !is_integral<_F>::value,
+ function<_R(_A0, _A1)>&
+>::type
+function<_R(_A0, _A1)>::operator=(_F __f)
+{
+ function(_VSTD::move(__f)).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0, class _A1>
+function<_R(_A0, _A1)>::~function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R, class _A0, class _A1>
+void
+function<_R(_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 _R, class _A0, class _A1>
+_R
+function<_R(_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 _R, class _A0, class _A1>
+const std::type_info&
+function<_R(_A0, _A1)>::target_type() const
+{
+ if (__f_ == 0)
+ return typeid(void);
+ return __f_->target_type();
+}
+
+template<class _R, class _A0, class _A1>
+template <typename _T>
+_T*
+function<_R(_A0, _A1)>::target()
+{
+ if (__f_ == 0)
+ return (_T*)0;
+ return (_T*)__f_->target(typeid(_T));
+}
+
+template<class _R, class _A0, class _A1>
+template <typename _T>
+const _T*
+function<_R(_A0, _A1)>::target() const
+{
+ if (__f_ == 0)
+ return (const _T*)0;
+ return (const _T*)__f_->target(typeid(_T));
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template<class _R, class _A0, class _A1, class _A2>
+class _LIBCPP_VISIBLE function<_R(_A0, _A1, _A2)>
+{
+ typedef __function::__base<_R(_A0, _A1, _A2)> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+ template <class _F>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const _F&) {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 _C, class _B1, class _B2>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1, _B2)) {return __p;}
+ template <class _R2, class _C, class _B1, class _B2>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1, _B2) const) {return __p;}
+ template <class _R2, class _C, class _B1, class _B2>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_B1, _B2) volatile) {return __p;}
+ template <class _R2, class _C, class _B1, class _B2>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__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<_R(_B0, _B1, _B2)>& __p) {return __p;}
+public:
+ typedef _R 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 _F>
+ function(_F,
+ typename enable_if<!is_integral<_F>::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 _F, class _Alloc>
+ function(allocator_arg_t, const _Alloc& __a, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type* = 0);
+
+ function& operator=(const function&);
+ function& operator=(nullptr_t);
+ template<class _F>
+ typename enable_if
+ <
+ !is_integral<_F>::value,
+ function&
+ >::type
+ operator=(_F);
+
+ ~function();
+
+ // 20.7.16.2.2, function modifiers:
+ void swap(function&);
+ template<class _F, class _Alloc>
+ _LIBCPP_INLINE_VISIBILITY
+ void assign(_F __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:
+ _R 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 _T> _T* target();
+ template <typename _T> const _T* target() const;
+#endif // _LIBCPP_NO_RTTI
+};
+
+template<class _R, class _A0, class _A1, class _A2>
+function<_R(_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 _R, class _A0, class _A1, class _A2>
+template<class _Alloc>
+function<_R(_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 _R, class _A0, class _A1, class _A2>
+template <class _F>
+function<_R(_A0, _A1, _A2)>::function(_F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, allocator<_F>, _R(_A0, _A1, _A2)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(__f);
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, allocator<_F>(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+template <class _F, class _Alloc>
+function<_R(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
+ typename enable_if<!is_integral<_F>::value>::type*)
+ : __f_(0)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, _Alloc, _R(_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
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(__f, _Alloc(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+function<_R(_A0, _A1, _A2)>&
+function<_R(_A0, _A1, _A2)>::operator=(const function& __f)
+{
+ function(__f).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+function<_R(_A0, _A1, _A2)>&
+function<_R(_A0, _A1, _A2)>::operator=(nullptr_t)
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+ __f_ = 0;
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+template <class _F>
+typename enable_if
+<
+ !is_integral<_F>::value,
+ function<_R(_A0, _A1, _A2)>&
+>::type
+function<_R(_A0, _A1, _A2)>::operator=(_F __f)
+{
+ function(_VSTD::move(__f)).swap(*this);
+ return *this;
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+function<_R(_A0, _A1, _A2)>::~function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+void
+function<_R(_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 _R, class _A0, class _A1, class _A2>
+_R
+function<_R(_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 _R, class _A0, class _A1, class _A2>
+const std::type_info&
+function<_R(_A0, _A1, _A2)>::target_type() const
+{
+ if (__f_ == 0)
+ return typeid(void);
+ return __f_->target_type();
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+template <typename _T>
+_T*
+function<_R(_A0, _A1, _A2)>::target()
+{
+ if (__f_ == 0)
+ return (_T*)0;
+ return (_T*)__f_->target(typeid(_T));
+}
+
+template<class _R, class _A0, class _A1, class _A2>
+template <typename _T>
+const _T*
+function<_R(_A0, _A1, _A2)>::target() const
+{
+ if (__f_ == 0)
+ return (const _T*)0;
+ return (const _T*)__f_->target(typeid(_T));
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(const function<_F>& __f, nullptr_t) {return !__f;}
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(nullptr_t, const function<_F>& __f) {return !__f;}
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(const function<_F>& __f, nullptr_t) {return (bool)__f;}
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(nullptr_t, const function<_F>& __f) {return (bool)__f;}
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(function<_F>& __x, function<_F>& __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 _N> 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 _N>
+struct __is_placeholder<placeholders::__ph<_N> >
+ : public integral_constant<int, _N> {};
+
+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 _F, class _BoundArgs, class _TupleUj>
+struct __bind_return;
+
+template <class _F, class ..._BoundArgs, class _TupleUj>
+struct __bind_return<_F, tuple<_BoundArgs...>, _TupleUj>
+{
+ typedef typename __ref_return
+ <
+ _F&,
+ typename __mu_return
+ <
+ _BoundArgs,
+ _TupleUj
+ >::type...
+ >::type type;
+};
+
+template <class _F, class ..._BoundArgs, class _TupleUj>
+struct __bind_return<_F, const tuple<_BoundArgs...>, _TupleUj>
+{
+ typedef typename __ref_return
+ <
+ _F&,
+ typename __mu_return
+ <
+ const _BoundArgs,
+ _TupleUj
+ >::type...
+ >::type type;
+};
+
+template <class _F, class _BoundArgs, size_t ..._Indx, class _Args>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __bind_return<_F, _BoundArgs, _Args>::type
+__apply_functor(_F& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
+ _Args&& __args)
+{
+ return __invoke(__f, __mu(get<_Indx>(__bound_args), __args)...);
+}
+
+template<class _F, class ..._BoundArgs>
+class __bind
+{
+ _F __f_;
+ tuple<_BoundArgs...> __bound_args_;
+
+ typedef typename __make_tuple_indices<sizeof...(_BoundArgs)>::type __indices;
+public:
+ template <class _G, class ..._BA>
+ explicit __bind(_G&& __f, _BA&& ...__bound_args)
+ : __f_(_VSTD::forward<_G>(__f)),
+ __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {}
+
+ template <class ..._Args>
+ typename __bind_return<_F, 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<_F, tuple<_BoundArgs...>, tuple<_Args&&...> >::type
+ operator()(_Args&& ...__args) const
+ {
+ return __apply_functor(__f_, __bound_args_, __indices(),
+ tuple<_Args&&...>(__args...));
+ }
+};
+
+template<class _F, class ..._BoundArgs>
+struct __is_bind_expression<__bind<_F, _BoundArgs...> > : public true_type {};
+
+template<class _R, class _F, class ..._BoundArgs>
+class __bind_r
+ : public __bind<_F, _BoundArgs...>
+{
+ typedef __bind<_F, _BoundArgs...> base;
+public:
+ typedef _R result_type;
+
+ template <class _G, class ..._BA>
+ explicit __bind_r(_G&& __f, _BA&& ...__bound_args)
+ : base(_VSTD::forward<_G>(__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 _R, class _F, class ..._BoundArgs>
+struct __is_bind_expression<__bind_r<_R, _F, _BoundArgs...> > : public true_type {};
+
+template<class _F, class ..._BoundArgs>
+inline _LIBCPP_INLINE_VISIBILITY
+__bind<typename decay<_F>::type, typename decay<_BoundArgs>::type...>
+bind(_F&& __f, _BoundArgs&&... __bound_args)
+{
+ typedef __bind<typename decay<_F>::type, typename decay<_BoundArgs>::type...> type;
+ return type(_VSTD::forward<_F>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
+}
+
+template<class _R, class _F, class ..._BoundArgs>
+inline _LIBCPP_INLINE_VISIBILITY
+__bind_r<_R, typename decay<_F>::type, typename decay<_BoundArgs>::type...>
+bind(_F&& __f, _BoundArgs&&... __bound_args)
+{
+ typedef __bind_r<_R, typename decay<_F>::type, typename decay<_BoundArgs>::type...> type;
+ return type(_VSTD::forward<_F>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
+}
+*/
+
+#endif // _LIBCPP_FUNCTIONAL_03
diff --git a/include/__functional_base b/include/__functional_base
new file mode 100644
index 000000000000..8d8e4b5e6e9a
--- /dev/null
+++ b/include/__functional_base
@@ -0,0 +1,430 @@
+// -*- 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;
+};
+
+#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 _A, class _R>
+ static unary_function<_A, _R>
+ __test(const volatile unary_function<_A, _R>*);
+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 _R>
+ static binary_function<_A1, _A2, _R>
+ __test(const volatile binary_function<_A1, _A2, _R>*);
+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 _R>
+struct __weak_result_type<_R ()>
+{
+ typedef _R result_type;
+};
+
+template <class _R>
+struct __weak_result_type<_R (&)()>
+{
+ typedef _R result_type;
+};
+
+template <class _R>
+struct __weak_result_type<_R (*)()>
+{
+ typedef _R result_type;
+};
+
+// 1 argument case
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (&)(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (*)(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)()>
+ : public unary_function<_C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() const>
+ : public unary_function<const _C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() volatile>
+ : public unary_function<volatile _C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() const volatile>
+ : public unary_function<const volatile _C*, _R>
+{
+};
+
+// 2 argument case
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (*)(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (&)(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1)>
+ : public binary_function<_C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) const>
+ : public binary_function<const _C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) volatile>
+ : public binary_function<volatile _C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) const volatile>
+ : public binary_function<const volatile _C*, _A1, _R>
+{
+};
+
+// 3 or more arguments
+
+template <class _R, class _A1, class _A2, class _A3, class ..._A4>
+struct __weak_result_type<_R (_A1, _A2, _A3, _A4...)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _A1, class _A2, class _A3, class ..._A4>
+struct __weak_result_type<_R (&)(_A1, _A2, _A3, _A4...)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _A1, class _A2, class _A3, class ..._A4>
+struct __weak_result_type<_R (*)(_A1, _A2, _A3, _A4...)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2, class ..._A3>
+struct __weak_result_type<_R (_C::*)(_A1, _A2, _A3...)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2, class ..._A3>
+struct __weak_result_type<_R (_C::*)(_A1, _A2, _A3...) const>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2, class ..._A3>
+struct __weak_result_type<_R (_C::*)(_A1, _A2, _A3...) volatile>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2, class ..._A3>
+struct __weak_result_type<_R (_C::*)(_A1, _A2, _A3...) const volatile>
+{
+ typedef _R result_type;
+};
+
+// __invoke
+
+// bullets 1 and 2
+
+template <class _F, class _A0, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+__invoke(_F&& __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 _F, class _A0, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+__invoke(_F&& __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 _F, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype(_VSTD::forward<_A0>(__a0).*__f)
+{
+ return _VSTD::forward<_A0>(__a0).*__f;
+}
+
+template <class _F, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype((*_VSTD::forward<_A0>(__a0)).*__f)
+{
+ return (*_VSTD::forward<_A0>(__a0)).*__f;
+}
+
+// bullet 5
+
+template <class _F, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+__invoke(_F&& __f, _Args&& ...__args)
+ -> decltype(_VSTD::forward<_F>(__f)(_VSTD::forward<_Args>(__args)...))
+{
+ return _VSTD::forward<_F>(__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&& __t) = delete;
+template <class _Tp> void cref(const _Tp&& __t) = delete;
+
+#else // _LIBCPP_HAS_NO_DELETED_FUNCTIONS
+
+template <class _Tp> void ref(const _Tp&& __t);// = delete;
+template <class _Tp> void cref(const _Tp&& __t);// = 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/include/__functional_base_03 b/include/__functional_base_03
new file mode 100644
index 000000000000..fabda5bc3d4b
--- /dev/null
+++ b/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 _A, class _R>
+ static unary_function<_A, _R>
+ __test(const volatile unary_function<_A, _R>*);
+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 _R>
+ static binary_function<_A1, _A2, _R>
+ __test(const volatile binary_function<_A1, _A2, _R>*);
+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 _R>
+struct __weak_result_type<_R ()>
+{
+ typedef _R result_type;
+};
+
+template <class _R>
+struct __weak_result_type<_R (&)()>
+{
+ typedef _R result_type;
+};
+
+template <class _R>
+struct __weak_result_type<_R (*)()>
+{
+ typedef _R result_type;
+};
+
+// 1 argument case
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (&)(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _A1>
+struct __weak_result_type<_R (*)(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)()>
+ : public unary_function<_C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() const>
+ : public unary_function<const _C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() volatile>
+ : public unary_function<volatile _C*, _R>
+{
+};
+
+template <class _R, class _C>
+struct __weak_result_type<_R (_C::*)() const volatile>
+ : public unary_function<const volatile _C*, _R>
+{
+};
+
+// 2 argument case
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (*)(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _A1, class _A2>
+struct __weak_result_type<_R (&)(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1)>
+ : public binary_function<_C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) const>
+ : public binary_function<const _C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) volatile>
+ : public binary_function<volatile _C*, _A1, _R>
+{
+};
+
+template <class _R, class _C, class _A1>
+struct __weak_result_type<_R (_C::*)(_A1) const volatile>
+ : public binary_function<const volatile _C*, _A1, _R>
+{
+};
+
+// 3 or more arguments
+
+template <class _R, class _A1, class _A2, class _A3>
+struct __weak_result_type<_R (_A1, _A2, _A3)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _A1, class _A2, class _A3>
+struct __weak_result_type<_R (&)(_A1, _A2, _A3)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _A1, class _A2, class _A3>
+struct __weak_result_type<_R (*)(_A1, _A2, _A3)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2>
+struct __weak_result_type<_R (_C::*)(_A1, _A2)>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2>
+struct __weak_result_type<_R (_C::*)(_A1, _A2) const>
+{
+ typedef _R result_type;
+};
+
+template <class _R, class _C, class _A1, class _A2>
+struct __weak_result_type<_R (_C::*)(_A1, _A2) volatile>
+{
+ typedef _R 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 _R, class _C, class _A0>
+// struct __ref_return1_member_data1<_R _C::*, _A0, true>
+// {
+// typedef typename __apply_cv<_A0, _R>::type& type;
+// };
+//
+// template <class _R, class _C, class _A0>
+// struct __ref_return1_member_data1<_R _C::*, _A0, false>
+// {
+// static _A0 __a;
+// typedef typename __apply_cv<decltype(*__a), _R>::type& type;
+// };
+//
+// template <class _Tp, class _A0>
+// struct __ref_return1_member_data;
+//
+// template <class _R, class _C, class _A0>
+// struct __ref_return1_member_data<_R _C::*, _A0>
+// : public __ref_return1_member_data1<_R _C::*, _A0,
+// is_same<typename remove_cv<_C>::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 _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(), _T1& __t1)
+{
+ return (__t1.*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0), _T1& __t1, _A0& __a0)
+{
+ return (__t1.*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1), _T1& __t1, _A0& __a0, _A1& __a1)
+{
+ return (__t1.*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return (__t1.*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() const, _T1& __t1)
+{
+ return (__t1.*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) const, _T1& __t1, _A0& __a0)
+{
+ return (__t1.*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) const, _T1& __t1, _A0& __a0, _A1& __a1)
+{
+ return (__t1.*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return (__t1.*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() volatile, _T1& __t1)
+{
+ return (__t1.*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) volatile, _T1& __t1, _A0& __a0)
+{
+ return (__t1.*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1& __t1, _A0& __a0, _A1& __a1)
+{
+ return (__t1.*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return (__t1.*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() const volatile, _T1& __t1)
+{
+ return (__t1.*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) const volatile, _T1& __t1, _A0& __a0)
+{
+ return (__t1.*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1& __t1, _A0& __a0, _A1& __a1)
+{
+ return (__t1.*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return (__t1.*__f)(__a0, __a1, __a2);
+}
+
+// second bullet
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(), _T1 __t1)
+{
+ return ((*__t1).*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0), _T1 __t1, _A0& __a0)
+{
+ return ((*__t1).*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1), _T1 __t1, _A0& __a0, _A1& __a1)
+{
+ return ((*__t1).*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2), _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return ((*__t1).*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() const, _T1 __t1)
+{
+ return ((*__t1).*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) const, _T1 __t1, _A0& __a0)
+{
+ return ((*__t1).*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) const, _T1 __t1, _A0& __a0, _A1& __a1)
+{
+ return ((*__t1).*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) const, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return ((*__t1).*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() volatile, _T1 __t1)
+{
+ return ((*__t1).*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) volatile, _T1 __t1, _A0& __a0)
+{
+ return ((*__t1).*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) volatile, _T1 __t1, _A0& __a0, _A1& __a1)
+{
+ return ((*__t1).*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return ((*__t1).*__f)(__a0, __a1, __a2);
+}
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)() const volatile, _T1 __t1)
+{
+ return ((*__t1).*__f)();
+}
+
+template <class _R, class _T, class _T1, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0) const volatile, _T1 __t1, _A0& __a0)
+{
+ return ((*__t1).*__f)(__a0);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1) const volatile, _T1 __t1, _A0& __a0, _A1& __a1)
+{
+ return ((*__t1).*__f)(__a0, __a1);
+}
+
+template <class _R, class _T, class _T1, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ _R
+>::type
+__invoke(_R (_T::*__f)(_A0, _A1, _A2) const volatile, _T1 __t1, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return ((*__t1).*__f)(__a0, __a1, __a2);
+}
+
+// third bullet
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename enable_if
+<
+ is_base_of<_T, typename remove_reference<_T1>::type>::value,
+ typename __apply_cv<_T1, _R>::type&
+>::type
+__invoke(_R _T::* __f, _T1& __t1)
+{
+ return __t1.*__f;
+}
+
+template <class _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__invoke(_R _T::*)
+{
+}
+
+// template <class _D, class _R, class _T, class _T1>
+// inline _LIBCPP_INLINE_VISIBILITY
+// typename enable_if
+// <
+// is_base_of<_T, typename remove_reference<_T1>::type>::value,
+// typename __ref_return1<_R _T::*, _T1>::type
+// >::type
+// __invoke(_R _T::* __f, _T1& __t1)
+// {
+// return __t1.*__f;
+// }
+
+// forth bullet
+
+template <class _T1, class _R, bool>
+struct __4th_helper
+{
+};
+
+template <class _T1, class _R>
+struct __4th_helper<_T1, _R, true>
+{
+ typedef typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _R>::type type;
+};
+
+template <class _R, class _T, class _T1>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __4th_helper<_T1, _R,
+ !is_base_of<_T,
+ typename remove_reference<_T1>::type
+ >::value
+ >::type&
+__invoke(_R _T::* __f, _T1& __t1)
+{
+ return (*__t1).*__f;
+}
+
+// template <class _D, class _R, class _T, class _T1>
+// inline _LIBCPP_INLINE_VISIBILITY
+// typename enable_if
+// <
+// !is_base_of<_T, typename remove_reference<_T1>::type>::value,
+// typename __ref_return1<_R _T::*, _T1>::type
+// >::type
+// __invoke(_R _T::* __f, _T1 __t1)
+// {
+// return (*__t1).*__f;
+// }
+
+// fifth bullet
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+decltype(declval<_F>()())
+__invoke(_F __f)
+{
+ return __f();
+}
+
+template <class _F, class _A0>
+inline _LIBCPP_INLINE_VISIBILITY
+decltype(declval<_F>()(declval<_A0&>()))
+__invoke(_F __f, _A0& __a0)
+{
+ return __f(__a0);
+}
+
+template <class _F, class _A0, class _A1>
+inline _LIBCPP_INLINE_VISIBILITY
+decltype(declval<_F>()(declval<_A0&>(), declval<_A1&>()))
+__invoke(_F __f, _A0& __a0, _A1& __a1)
+{
+ return __f(__a0, __a1);
+}
+
+template <class _F, class _A0, class _A1, class _A2>
+inline _LIBCPP_INLINE_VISIBILITY
+decltype(declval<_F>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>()))
+__invoke(_F __f, _A0& __a0, _A1& __a1, _A2& __a2)
+{
+ return __f(__a0, __a1, __a2);
+}
+
+// template <class _R, class _F>
+// inline _LIBCPP_INLINE_VISIBILITY
+// _R
+// __invoke(_F& __f)
+// {
+// return __f();
+// }
+//
+// template <class _R, class _F, class _A0>
+// inline _LIBCPP_INLINE_VISIBILITY
+// typename enable_if
+// <
+// !is_member_pointer<_F>::value,
+// _R
+// >::type
+// __invoke(_F& __f, _A0& __a0)
+// {
+// return __f(__a0);
+// }
+//
+// template <class _R, class _F, class _A0, class _A1>
+// inline _LIBCPP_INLINE_VISIBILITY
+// _R
+// __invoke(_F& __f, _A0& __a0, _A1& __a1)
+// {
+// return __f(__a0, __a1);
+// }
+//
+// template <class _R, class _F, class _A0, class _A1, class _A2>
+// inline _LIBCPP_INLINE_VISIBILITY
+// _R
+// __invoke(_F& __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 _F, bool = __has_result_type<__weak_result_type<_F> >::value>
+struct __invoke_return
+{
+ typedef typename __weak_result_type<_F>::result_type type;
+};
+
+template <class _F>
+struct __invoke_return<_F, false>
+{
+ typedef decltype(__invoke(_VSTD::declval<_F>())) type;
+};
+
+template <class _Tp, class _A0>
+struct __invoke_return0
+{
+ typedef decltype(__invoke(_VSTD::declval<_Tp>(), _VSTD::declval<_A0>())) type;
+};
+
+template <class _R, class _T, class _A0>
+struct __invoke_return0<_R _T::*, _A0>
+{
+ typedef typename __apply_cv<_A0, _R>::type& type;
+};
+
+template <class _R, class _T, class _A0>
+struct __invoke_return0<_R _T::*, _A0*>
+{
+ typedef typename __apply_cv<_A0, _R>::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/include/__hash_table b/include/__hash_table
new file mode 100644
index 000000000000..4399caad658b
--- /dev/null
+++ b/include/__hash_table
@@ -0,0 +1,1918 @@
+// -*- 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>
+
+#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 __node::__first_node __first_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;
+
+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 _P>
+ pair<iterator, bool> __insert_unique(_P&& __x);
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template <class _P>
+ iterator __insert_multi(_P&& __x);
+ template <class _P>
+ iterator __insert_multi(const_iterator __p, _P&& __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> _D;
+ typedef unique_ptr<__node, _D> __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& __u, 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 _A>
+ _LIBCPP_INLINE_VISIBILITY
+ static
+ void
+ __swap_alloc(_A& __x, _A& __y)
+ _NOEXCEPT_(
+ !allocator_traits<_A>::propagate_on_container_swap::value ||
+ __is_nothrow_swappable<_A>::value)
+ {
+ __swap_alloc(__x, __y,
+ integral_constant<bool,
+ allocator_traits<_A>::propagate_on_container_swap::value
+ >());
+ }
+
+ template <class _A>
+ _LIBCPP_INLINE_VISIBILITY
+ static
+ void
+ __swap_alloc(_A& __x, _A& __y, true_type)
+ _NOEXCEPT_(__is_nothrow_swappable<_A>::value)
+ {
+ using _VSTD::swap;
+ swap(__x, __y);
+ }
+
+ template <class _A>
+ _LIBCPP_INLINE_VISIBILITY
+ static
+ void
+ __swap_alloc(_A& __x, _A& __y, 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 _P>
+pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
+__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_unique(_P&& __x)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_P>(__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 _P>
+typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
+__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(_P&& __x)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_P>(__x));
+ iterator __r = __node_insert_multi(__h.get());
+ __h.release();
+ return __r;
+}
+
+template <class _Tp, class _Hash, class _Equal, class _Alloc>
+template <class _P>
+typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
+__hash_table<_Tp, _Hash, _Equal, _Alloc>::__insert_multi(const_iterator __p,
+ _P&& __x)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_P>(__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), _D(__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), _D(__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), _D(__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), _D(__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, _D(__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/include/__locale b/include/__locale
new file mode 100644
index 000000000000..28cb3ef65292
--- /dev/null
+++ b/include/__locale
@@ -0,0 +1,1414 @@
+// -*- 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__)
+# 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) + *__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;
+#else // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__
+ 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_[__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_[*__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_[*__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_[*__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 _N>
+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 _N>
+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/include/__mutex_base b/include/__mutex_base
new file mode 100644
index 000000000000..55687659a03a
--- /dev/null
+++ b/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
+// 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/include/__split_buffer b/include/__split_buffer
new file mode 100644
index 000000000000..33ce42da31a4
--- /dev/null
+++ b/include/__split_buffer
@@ -0,0 +1,650 @@
+// -*- C++ -*-
+#ifndef _LIBCPP_SPLIT_BUFFER
+#define _LIBCPP_SPLIT_BUFFER
+
+#include <__config>
+#include <type_traits>
+#include <algorithm>
+
+#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);
+ 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, is_trivially_destructible<value_type>());}
+ void __destruct_at_end(pointer __new_last, false_type) _NOEXCEPT;
+ 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& __c, 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& __x, __alloc_rr& __y, 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> _I;
+ __construct_at_end(_I(__c.begin()), _I(__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 * (__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 * (__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 * (__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 * (__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 * (__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/include/__sso_allocator b/include/__sso_allocator
new file mode 100644
index 000000000000..16354d83cc5b
--- /dev/null
+++ b/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 _N> class _LIBCPP_HIDDEN __sso_allocator;
+
+template <size_t _N>
+class _LIBCPP_HIDDEN __sso_allocator<void, _N>
+{
+public:
+ typedef const void* const_pointer;
+ typedef void value_type;
+};
+
+template <class _Tp, size_t _N>
+class _LIBCPP_HIDDEN __sso_allocator
+{
+ typename aligned_storage<sizeof(_Tp) * _N>::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, _N>&) throw()
+ : __allocated_(false) {}
+private:
+ __sso_allocator& operator=(const __sso_allocator&);
+public:
+ _LIBCPP_INLINE_VISIBILITY pointer allocate(size_type __n, typename __sso_allocator<void, _N>::const_pointer = 0)
+ {
+ if (!__allocated_ && __n <= _N)
+ {
+ __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/include/__std_stream b/include/__std_stream
new file mode 100644
index 000000000000..6df6556da767
--- /dev/null
+++ b/include/__std_stream
@@ -0,0 +1,315 @@
+// -*- 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>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+static const unsigned __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)
+ {
+ char __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();
+ {
+ char __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(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/include/__tree b/include/__tree
new file mode 100644
index 000000000000..ad5d2f4b8eaa
--- /dev/null
+++ b/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 _V>
+ pair<iterator, bool> __insert_unique(_V&& __v);
+ template <class _V>
+ iterator __insert_unique(const_iterator __p, _V&& __v);
+ template <class _V>
+ iterator __insert_multi(_V&& __v);
+ template <class _V>
+ iterator __insert_multi(const_iterator __p, _V&& __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> _D;
+ typedef unique_ptr<__node, _D> __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), _D(__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 _V>
+pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
+__tree<_Tp, _Compare, _Allocator>::__insert_unique(_V&& __v)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_V>(__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 _V>
+typename __tree<_Tp, _Compare, _Allocator>::iterator
+__tree<_Tp, _Compare, _Allocator>::__insert_unique(const_iterator __p, _V&& __v)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_V>(__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 _V>
+typename __tree<_Tp, _Compare, _Allocator>::iterator
+__tree<_Tp, _Compare, _Allocator>::__insert_multi(_V&& __v)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_V>(__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 _V>
+typename __tree<_Tp, _Compare, _Allocator>::iterator
+__tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, _V&& __v)
+{
+ __node_holder __h = __construct_node(_VSTD::forward<_V>(__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), _D(__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> _P;
+ __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> _P;
+ __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 _P(iterator(__rt),
+ iterator(
+ __rt->__right_ != nullptr ?
+ static_cast<__node_pointer>(__tree_min(__rt->__right_))
+ : __result));
+ }
+ return _P(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> _P;
+ __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 _P(const_iterator(__rt),
+ const_iterator(
+ __rt->__right_ != nullptr ?
+ static_cast<__node_const_pointer>(__tree_min(__rt->__right_))
+ : __result));
+ }
+ return _P(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> _P;
+ __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 _P(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), __rt),
+ __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result));
+ }
+ return _P(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> _P;
+ __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 _P(__lower_bound(__k, static_cast<__node_const_pointer>(__rt->__left_), __rt),
+ __upper_bound(__k, static_cast<__node_const_pointer>(__rt->__right_), __result));
+ }
+ return _P(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, _D(__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/include/__tuple b/include/__tuple
new file mode 100644
index 000000000000..15193b4d1074
--- /dev/null
+++ b/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> class _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/include/__tuple_03 b/include/__tuple_03
new file mode 100644
index 000000000000..a28ac0800ae9
--- /dev/null
+++ b/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/include/algorithm b/include/algorithm
new file mode 100644
index 000000000000..a89b9dd65eab
--- /dev/null
+++ b/include/algorithm
@@ -0,0 +1,5361 @@
+// -*- 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>
+
+#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 __builtin_ctz (__x);}
+inline _LIBCPP_INLINE_VISIBILITY unsigned long __ctz(unsigned long __x) {return __builtin_ctzl (__x);}
+inline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);}
+
+// Precondition: __x != 0
+inline _LIBCPP_INLINE_VISIBILITY unsigned __clz(unsigned __x) {return __builtin_clz (__x);}
+inline _LIBCPP_INLINE_VISIBILITY unsigned long __clz(unsigned long __x) {return __builtin_clzl (__x);}
+inline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __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.second = __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 _X, size_t _R>
+struct __log2_imp
+{
+ static const size_t value = _X & ((unsigned long long)(1) << _R) ? _R
+ : __log2_imp<_X, _R - 1>::value;
+};
+
+template <unsigned long long _X>
+struct __log2_imp<_X, 0>
+{
+ static const size_t value = 0;
+};
+
+template <size_t _R>
+struct __log2_imp<0, _R>
+{
+ static const size_t value = _R + 1;
+};
+
+template <class _UI, _UI _X>
+struct __log2
+{
+ static const size_t value = __log2_imp<_X,
+ 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 _R = _Engine::_Max - _Engine::_Min
+ + _Working_result_type(1);
+ static const size_t __m = __log2<_Working_result_type, _R>::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, _R != 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 (_R == 0)
+ __y0_ = _R;
+ else if (__w0_ < _WDt)
+ __y0_ = (_R >> __w0_) << __w0_;
+ else
+ __y0_ = 0;
+ if (_R - __y0_ > __y0_ / __n_)
+ {
+ ++__n_;
+ __w0_ = __w_ / __n_;
+ if (__w0_ < _WDt)
+ __y0_ = (_R >> __w0_) << __w0_;
+ else
+ __y0_ = 0;
+ }
+ __n0_ = __n_ - __w_ % __n_;
+ if (__w0_ < _WDt - 1)
+ __y1_ = (_R >> (__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 _S = 0;
+ for (size_t __k = 0; __k < __n0_; ++__k)
+ {
+ _Engine_result_type __u;
+ do
+ {
+ __u = __e_() - _Engine::min();
+ } while (__u >= __y0_);
+ if (__w0_ < _WDt)
+ _S <<= __w0_;
+ else
+ _S = 0;
+ _S += __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)
+ _S <<= __w0_ + 1;
+ else
+ _S = 0;
+ _S += __u & __mask1_;
+ }
+ return _S;
+}
+
+// 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 _R = __p.b() - __p.a() + _UIntType(1);
+ if (_R == 1)
+ return __p.a();
+ const size_t _Dt = numeric_limits<_UIntType>::digits;
+ typedef __independent_bits_engine<_URNG, _UIntType> _Eng;
+ if (_R == 0)
+ return static_cast<result_type>(_Eng(__g, _Dt)());
+ size_t __w = _Dt - __clz(_R) - 1;
+ if ((_R & (_UIntType(~0) >> (_Dt - __w))) != 0)
+ ++__w;
+ _Eng __e(__g, __w);
+ _UIntType __u;
+ do
+ {
+ __u = __e();
+ } while (__u >= _R);
+ 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 const/*expr*/ result_type min() {return _Min;}
+ static const/*expr*/ 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> _D;
+ typedef typename _D::param_type _P;
+ difference_type __d = __last - __first;
+ if (__d > 1)
+ {
+ _D __uid;
+ __rs_default __g = __rs_get();
+ for (--__last, --__d; __first < __last; ++__first, --__d)
+ {
+ difference_type __i = __uid(__g, _P(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> _D;
+ typedef typename _D::param_type _P;
+ difference_type __d = __last - __first;
+ if (__d > 1)
+ {
+ _D __uid;
+ for (--__last, --__d; __first < __last; ++__first, --__d)
+ {
+ difference_type __i = __uid(__g, _P(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:
+ 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/include/array b/include/array
new file mode 100644
index 000000000000..c11f4bd74f5f
--- /dev/null
+++ b/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/include/atomic b/include/atomic
new file mode 100644
index 000000000000..244f42d0aafa
--- /dev/null
+++ b/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
+{
+ _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) : __a_(__d) {}
+#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)
+{
+ __o->__a_ = __d;
+}
+
+template <class _Tp>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+atomic_init(atomic<_Tp>* __o, _Tp __d)
+{
+ __o->__a_ = __d;
+}
+
+// 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
+{
+ 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) : __a_(__b) {}
+
+#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/include/bitset b/include/bitset
new file mode 100644
index 000000000000..c970f3290717
--- /dev/null
+++ b/include/bitset
@@ -0,0 +1,1048 @@
+// -*- 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
+
+_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)
+{
+ __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)
+{
+ __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 class __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 __pos) _NOEXCEPT
+ {return iterator(0, 0);}
+ _LIBCPP_INLINE_VISIBILITY const_iterator __make_iter(size_t __pos) 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 _M = _VSTD::min(__rlen, _Size);
+ size_t __i = 0;
+ for (; __i < _M; ++__i)
+ {
+ _CharT __c = __str[_M - 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 _M = _VSTD::min(__rlen, _Size);
+ size_t __i = 0;
+ for (; __i < _M; ++__i)
+ {
+ _CharT __c = __str[__pos + _M - 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/include/cassert b/include/cassert
new file mode 100644
index 000000000000..3775990640a9
--- /dev/null
+++ b/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/include/ccomplex b/include/ccomplex
new file mode 100644
index 000000000000..6ed116445e64
--- /dev/null
+++ b/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/include/cctype b/include/cctype
new file mode 100644
index 000000000000..e33244e7daa2
--- /dev/null
+++ b/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/include/cerrno b/include/cerrno
new file mode 100644
index 000000000000..9804e4e3dcfe
--- /dev/null
+++ b/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/include/cfenv b/include/cfenv
new file mode 100644
index 000000000000..dd7db37f8e48
--- /dev/null
+++ b/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/include/cfloat b/include/cfloat
new file mode 100644
index 000000000000..5fa56550fa6a
--- /dev/null
+++ b/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/include/chrono b/include/chrono
new file mode 100644
index 000000000000..1c79f4bbe809
--- /dev/null
+++ b/include/chrono
@@ -0,0 +1,873 @@
+// -*- 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>
+
+#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/include/cinttypes b/include/cinttypes
new file mode 100644
index 000000000000..786692b8fec3
--- /dev/null
+++ b/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/include/ciso646 b/include/ciso646
new file mode 100644
index 000000000000..b2efc72a9aa1
--- /dev/null
+++ b/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/include/climits b/include/climits
new file mode 100644
index 000000000000..81ffecdf6eef
--- /dev/null
+++ b/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/include/clocale b/include/clocale
new file mode 100644
index 000000000000..f8b8f0dd34b6
--- /dev/null
+++ b/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/include/cmath b/include/cmath
new file mode 100644
index 000000000000..ab67112ef172
--- /dev/null
+++ b/include/cmath
@@ -0,0 +1,1640 @@
+// -*- 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);}
+
+// 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);}
+
+// exp
+
+using ::exp;
+using ::expf;
+
+#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
+
+using ::fmod;
+using ::fmodf;
+
+#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
+
+using ::log;
+using ::logf;
+
+#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
+
+using ::pow;
+using ::powf;
+
+#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
+
+using ::sqrt;
+using ::sqrtf;
+
+#ifndef _MSC_VER
+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 _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
+
+using ::nan;
+using ::nanf;
+
+// 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
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_CMATH
diff --git a/include/codecvt b/include/codecvt
new file mode 100644
index 000000000000..6c44e3434746
--- /dev/null
+++ b/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/include/complex b/include/complex
new file mode 100644
index 000000000000..e7f63eac3a1e
--- /dev/null
+++ b/include/complex
@@ -0,0 +1,1516 @@
+// -*- 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; 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; 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; 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; 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/include/complex.h b/include/complex.h
new file mode 100644
index 000000000000..7003d31a89cd
--- /dev/null
+++ b/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/include/condition_variable b/include/condition_variable
new file mode 100644
index 000000000000..b4da556f6356
--- /dev/null
+++ b/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/include/csetjmp b/include/csetjmp
new file mode 100644
index 000000000000..d0b2c078967d
--- /dev/null
+++ b/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/include/csignal b/include/csignal
new file mode 100644
index 000000000000..97282661872a
--- /dev/null
+++ b/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/include/cstdarg b/include/cstdarg
new file mode 100644
index 000000000000..c8b6999242f7
--- /dev/null
+++ b/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/include/cstdbool b/include/cstdbool
new file mode 100644
index 000000000000..2c764a61f211
--- /dev/null
+++ b/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/include/cstddef b/include/cstddef
new file mode 100644
index 000000000000..48317ba0063e
--- /dev/null
+++ b/include/cstddef
@@ -0,0 +1,102 @@
+// -*- 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(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/include/cstdint b/include/cstdint
new file mode 100644
index 000000000000..7a187d3ebf28
--- /dev/null
+++ b/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/include/cstdio b/include/cstdio
new file mode 100644
index 000000000000..2a6ec762deae
--- /dev/null
+++ b/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/include/cstdlib b/include/cstdlib
new file mode 100644
index 000000000000..5d8a9d73464b
--- /dev/null
+++ b/include/cstdlib
@@ -0,0 +1,145 @@
+// -*- 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;
+
+#ifndef _MSC_VER // MSVC already has the correct prototype in <stdlib.h.h> #ifdef __cplusplus
+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/include/cstring b/include/cstring
new file mode 100644
index 000000000000..dd49d802d5e0
--- /dev/null
+++ b/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)
+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/include/ctgmath b/include/ctgmath
new file mode 100644
index 000000000000..535eb7dccd15
--- /dev/null
+++ b/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/include/ctime b/include/ctime
new file mode 100644
index 000000000000..fc4eb26f5430
--- /dev/null
+++ b/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/include/cwchar b/include/cwchar
new file mode 100644
index 000000000000..8e788fc764e1
--- /dev/null
+++ b/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/include/cwctype b/include/cwctype
new file mode 100644
index 000000000000..4f89b52db27c
--- /dev/null
+++ b/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/include/deque b/include/deque
new file mode 100644
index 000000000000..ab9ba58b0286
--- /dev/null
+++ b/include/deque
@@ -0,0 +1,2842 @@
+// -*- 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>
+
+_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 _P, class _R, class _MP>
+ _LIBCPP_INLINE_VISIBILITY
+ __deque_iterator(const __deque_iterator<value_type, _P, _R, _MP, difference_type, __block_size>& __it,
+ typename enable_if<is_convertible<_P, 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 _A> friend class __deque_base;
+ template <class _Tp, class _A> friend class _LIBCPP_VISIBLE deque;
+ template <class _V, class _P, class _R, class _MP, class _D, _D>
+ 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& __c, 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& __x, allocator_type& __y, 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& __c, 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> _I;
+ assign(_I(__c.begin()), _I(__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> _I;
+ assign(_I(__c.begin()), _I(__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/include/exception b/include/exception
new file mode 100644
index 000000000000..0a747f50fb3d
--- /dev/null
+++ b/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
+ // 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 _E>
+exception_ptr
+make_exception_ptr(_E __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 _E>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+rethrow_if_nested(const _E& __e, typename enable_if<
+ is_polymorphic<_E>::value
+ >::type* = 0)
+{
+ const nested_exception* __nep = dynamic_cast<const nested_exception*>(&__e);
+ if (__nep)
+ __nep->rethrow_nested();
+}
+
+template <class _E>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+rethrow_if_nested(const _E& __e, typename enable_if<
+ !is_polymorphic<_E>::value
+ >::type* = 0)
+{
+}
+
+} // std
+
+#endif // _LIBCPP_EXCEPTION
diff --git a/include/ext/__hash b/include/ext/__hash
new file mode 100644
index 000000000000..8e9635d07f57
--- /dev/null
+++ b/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/include/ext/hash_map b/include/ext/hash_map
new file mode 100644
index 000000000000..9e62e7a777d6
--- /dev/null
+++ b/include/ext/hash_map
@@ -0,0 +1,995 @@
+// -*- 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>
+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>
+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> _D;
+ typedef unique_ptr<__node, _D> __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), _D(__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> _D;
+ typedef unique_ptr<__node, _D> __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/include/ext/hash_set b/include/ext/hash_set
new file mode 100644
index 000000000000..14daf7bc29e4
--- /dev/null
+++ b/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/include/forward_list b/include/forward_list
new file mode 100644
index 000000000000..61fe290d9e2f
--- /dev/null
+++ b/include/forward_list
@@ -0,0 +1,1634 @@
+// -*- 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>
+
+#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> _D;
+ unique_ptr<__node, _D> __h(nullptr, _D(__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> _I;
+ insert_after(cbefore_begin(), _I(__x.begin()), _I(__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> _I;
+ assign(_I(__x.begin()), _I(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(__node_traits::allocate(__a, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __h(nullptr, _D(__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> _D;
+ unique_ptr<__node, _D> __h(nullptr, _D(__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> _C;
+ typedef typename _C::const_iterator _I;
+ _I __ix = __x.begin();
+ _I __ex = __x.end();
+ _I __iy = __y.begin();
+ _I __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/include/fstream b/include/fstream
new file mode 100644
index 000000000000..b6a2ab0e158a
--- /dev/null
+++ b/include/fstream
@@ -0,0 +1,1396 @@
+// -*- 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>
+
+#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 ((__cm_ & ios_base::out) && 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/include/functional b/include/functional
new file mode 100644
index 000000000000..59b132c4515c
--- /dev/null
+++ b/include/functional
@@ -0,0 +1,1999 @@
+// -*- 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 _M;
+}
+
+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;}
+};
+
+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;}
+};
+
+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 _R, class _T>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R _T::*>
+mem_fn(_R _T::* __pm)
+{
+ return __mem_fn<_R _T::*>(__pm);
+}
+
+template<class _R, class _T, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_Args...)>
+mem_fn(_R (_T::* __pm)(_Args...))
+{
+ return __mem_fn<_R (_T::*)(_Args...)>(__pm);
+}
+
+template<class _R, class _T, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_Args...) const>
+mem_fn(_R (_T::* __pm)(_Args...) const)
+{
+ return __mem_fn<_R (_T::*)(_Args...) const>(__pm);
+}
+
+template<class _R, class _T, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_Args...) volatile>
+mem_fn(_R (_T::* __pm)(_Args...) volatile)
+{
+ return __mem_fn<_R (_T::*)(_Args...) volatile>(__pm);
+}
+
+template<class _R, class _T, class ..._Args>
+inline _LIBCPP_INLINE_VISIBILITY
+__mem_fn<_R (_T::*)(_Args...) const volatile>
+mem_fn(_R (_T::* __pm)(_Args...) const volatile)
+{
+ return __mem_fn<_R (_T::*)(_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 _R, class ..._ArgTypes>
+struct __maybe_derive_from_unary_function
+{
+};
+
+template<class _R, class _A1>
+struct __maybe_derive_from_unary_function<_R(_A1)>
+ : public unary_function<_A1, _R>
+{
+};
+
+template<class _R, class ..._ArgTypes>
+struct __maybe_derive_from_binary_function
+{
+};
+
+template<class _R, class _A1, class _A2>
+struct __maybe_derive_from_binary_function<_R(_A1, _A2)>
+ : public binary_function<_A1, _A2, _R>
+{
+};
+
+template<class _Fp> class __base;
+
+template<class _R, class ..._ArgTypes>
+class __base<_R(_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 _R 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 _F, class _Alloc, class _R, class ..._ArgTypes>
+class __func<_F, _Alloc, _R(_ArgTypes...)>
+ : public __base<_R(_ArgTypes...)>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __func(_F __f) : __f_(_VSTD::move(__f)) {}
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __func(_F __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
+ virtual __base<_R(_ArgTypes...)>* __clone() const;
+ virtual void __clone(__base<_R(_ArgTypes...)>*) const;
+ virtual void destroy() _NOEXCEPT;
+ virtual void destroy_deallocate() _NOEXCEPT;
+ virtual _R 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 _F, class _Alloc, class _R, class ..._ArgTypes>
+__base<_R(_ArgTypes...)>*
+__func<_F, _Alloc, _R(_ArgTypes...)>::__clone() const
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__func, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) __func(__f_.first(), _Alloc(__a));
+ return __hold.release();
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__func<_F, _Alloc, _R(_ArgTypes...)>::__clone(__base<_R(_ArgTypes...)>* __p) const
+{
+ ::new (__p) __func(__f_.first(), __f_.second());
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__func<_F, _Alloc, _R(_ArgTypes...)>::destroy() _NOEXCEPT
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__func<_F, _Alloc, _R(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT
+{
+ typedef typename _Alloc::template rebind<__func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+_R
+__func<_F, _Alloc, _R(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
+{
+ return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
+}
+
+#ifndef _LIBCPP_NO_RTTI
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+const void*
+__func<_F, _Alloc, _R(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT
+{
+ if (__ti == typeid(_F))
+ return &__f_.first();
+ return (const void*)0;
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+const std::type_info&
+__func<_F, _Alloc, _R(_ArgTypes...)>::target_type() const _NOEXCEPT
+{
+ return typeid(_F);
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+} // __function
+
+template<class _R, class ..._ArgTypes>
+class _LIBCPP_VISIBLE function<_R(_ArgTypes...)>
+ : public __function::__maybe_derive_from_unary_function<_R(_ArgTypes...)>,
+ public __function::__maybe_derive_from_binary_function<_R(_ArgTypes...)>
+{
+ typedef __function::__base<_R(_ArgTypes...)> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+ template <class _F>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const _F&) {return true;}
+ template <class _R2, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (*__p)(_A...)) {return __p;}
+ template <class _R2, class _C, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_A...)) {return __p;}
+ template <class _R2, class _C, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_A...) const) {return __p;}
+ template <class _R2, class _C, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_A...) volatile) {return __p;}
+ template <class _R2, class _C, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(_R2 (_C::*__p)(_A...) const volatile) {return __p;}
+ template <class _R2, class ..._A>
+ _LIBCPP_INLINE_VISIBILITY
+ static bool __not_null(const function<_R(_A...)>& __p) {return __p;}
+
+ template <class _F, bool = __invokable<_F&, _ArgTypes...>::value>
+ struct __callable;
+ template <class _F>
+ struct __callable<_F, true>
+ {
+ static const bool value =
+ is_convertible<typename __invoke_of<_F&, _ArgTypes...>::type,
+ _R>::value;
+ };
+ template <class _F>
+ struct __callable<_F, false>
+ {
+ static const bool value = false;
+ };
+public:
+ typedef _R 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 _F>
+ function(_F,
+ typename enable_if<__callable<_F>::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 _F, class _Alloc>
+ function(allocator_arg_t, const _Alloc& __a, _F __f,
+ typename enable_if<__callable<_F>::value>::type* = 0);
+
+ function& operator=(const function&);
+ function& operator=(function&&) _NOEXCEPT;
+ function& operator=(nullptr_t) _NOEXCEPT;
+ template<class _F>
+ typename enable_if
+ <
+ __callable<typename decay<_F>::type>::value,
+ function&
+ >::type
+ operator=(_F&&);
+
+ ~function();
+
+ // function modifiers:
+ void swap(function&) _NOEXCEPT;
+ template<class _F, class _Alloc>
+ _LIBCPP_INLINE_VISIBILITY
+ void assign(_F&& __f, const _Alloc& __a)
+ {function(allocator_arg, __a, _VSTD::forward<_F>(__f)).swap(*this);}
+
+ // function capacity:
+ _LIBCPP_INLINE_VISIBILITY
+ /*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:
+ _R operator()(_ArgTypes...) const;
+
+#ifndef _LIBCPP_NO_RTTI
+ // 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;
+#endif // _LIBCPP_NO_RTTI
+};
+
+template<class _R, class ..._ArgTypes>
+function<_R(_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 _R, class ..._ArgTypes>
+template <class _Alloc>
+function<_R(_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 _R, class ..._ArgTypes>
+function<_R(_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 _R, class ..._ArgTypes>
+template <class _Alloc>
+function<_R(_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 _R, class ..._ArgTypes>
+template <class _F>
+function<_R(_ArgTypes...)>::function(_F __f,
+ typename enable_if<__callable<_F>::value>::type*)
+ : __f_(0)
+{
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, allocator<_F>, _R(_ArgTypes...)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_F>::value)
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(_VSTD::move(__f));
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(_VSTD::move(__f), allocator<_F>(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class ..._ArgTypes>
+template <class _F, class _Alloc>
+function<_R(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a0, _F __f,
+ typename enable_if<__callable<_F>::value>::type*)
+ : __f_(0)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ if (__not_null(__f))
+ {
+ typedef __function::__func<_F, _Alloc, _R(_ArgTypes...)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_) && is_nothrow_copy_constructible<_F>::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
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a));
+ __f_ = __hold.release();
+ }
+ }
+}
+
+template<class _R, class ..._ArgTypes>
+function<_R(_ArgTypes...)>&
+function<_R(_ArgTypes...)>::operator=(const function& __f)
+{
+ function(__f).swap(*this);
+ return *this;
+}
+
+template<class _R, class ..._ArgTypes>
+function<_R(_ArgTypes...)>&
+function<_R(_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 _R, class ..._ArgTypes>
+function<_R(_ArgTypes...)>&
+function<_R(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+ __f_ = 0;
+}
+
+template<class _R, class ..._ArgTypes>
+template <class _F>
+typename enable_if
+<
+ function<_R(_ArgTypes...)>::template __callable<typename decay<_F>::type>::value,
+ function<_R(_ArgTypes...)>&
+>::type
+function<_R(_ArgTypes...)>::operator=(_F&& __f)
+{
+ function(_VSTD::forward<_F>(__f)).swap(*this);
+ return *this;
+}
+
+template<class _R, class ..._ArgTypes>
+function<_R(_ArgTypes...)>::~function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R, class ..._ArgTypes>
+void
+function<_R(_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 _R, class ..._ArgTypes>
+_R
+function<_R(_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 _R, class ..._ArgTypes>
+const std::type_info&
+function<_R(_ArgTypes...)>::target_type() const _NOEXCEPT
+{
+ if (__f_ == 0)
+ return typeid(void);
+ return __f_->target_type();
+}
+
+template<class _R, class ..._ArgTypes>
+template <typename _T>
+_T*
+function<_R(_ArgTypes...)>::target() _NOEXCEPT
+{
+ if (__f_ == 0)
+ return (_T*)0;
+ return (_T*)__f_->target(typeid(_T));
+}
+
+template<class _R, class ..._ArgTypes>
+template <typename _T>
+const _T*
+function<_R(_ArgTypes...)>::target() const _NOEXCEPT
+{
+ if (__f_ == 0)
+ return (const _T*)0;
+ return (const _T*)__f_->target(typeid(_T));
+}
+
+#endif // _LIBCPP_NO_RTTI
+
+template <class _R, class... _ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(const function<_R(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;}
+
+template <class _R, class... _ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(nullptr_t, const function<_R(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;}
+
+template <class _R, class... _ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(const function<_R(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;}
+
+template <class _R, class... _ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(nullptr_t, const function<_R(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;}
+
+template <class _R, class... _ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(function<_R(_ArgTypes...)>& __x, function<_R(_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 _N> 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 _N>
+struct __is_placeholder<placeholders::__ph<_N> >
+ : public integral_constant<int, _N> {};
+
+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& __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 _F, class _BoundArgs, class _TupleUj>
+struct __bind_return;
+
+template <class _F, class ..._BoundArgs, class _TupleUj>
+struct __bind_return<_F, tuple<_BoundArgs...>, _TupleUj>
+{
+ typedef typename __invoke_of
+ <
+ _F&,
+ typename __mu_return
+ <
+ _BoundArgs,
+ _TupleUj
+ >::type...
+ >::type type;
+};
+
+template <class _F, class ..._BoundArgs, class _TupleUj>
+struct __bind_return<_F, const tuple<_BoundArgs...>, _TupleUj>
+{
+ typedef typename __invoke_of
+ <
+ _F&,
+ typename __mu_return
+ <
+ const _BoundArgs,
+ _TupleUj
+ >::type...
+ >::type type;
+};
+
+template <class _F, class _BoundArgs, size_t ..._Indx, class _Args>
+inline _LIBCPP_INLINE_VISIBILITY
+typename __bind_return<_F, _BoundArgs, _Args>::type
+__apply_functor(_F& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>,
+ _Args&& __args)
+{
+ return __invoke(__f, __mu(get<_Indx>(__bound_args), __args)...);
+}
+
+template<class _F, class ..._BoundArgs>
+class __bind
+ : public __weak_result_type<typename decay<_F>::type>
+{
+ typedef typename decay<_F>::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 _G, class ..._BA>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __bind(_G&& __f, _BA&& ...__bound_args)
+ : __f_(_VSTD::forward<_G>(__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 _F, class ..._BoundArgs>
+struct __is_bind_expression<__bind<_F, _BoundArgs...> > : public true_type {};
+
+template<class _R, class _F, class ..._BoundArgs>
+class __bind_r
+ : public __bind<_F, _BoundArgs...>
+{
+ typedef __bind<_F, _BoundArgs...> base;
+public:
+ typedef _R 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 _G, class ..._BA>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __bind_r(_G&& __f, _BA&& ...__bound_args)
+ : base(_VSTD::forward<_G>(__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 _R, class _F, class ..._BoundArgs>
+struct __is_bind_expression<__bind_r<_R, _F, _BoundArgs...> > : public true_type {};
+
+template<class _F, class ..._BoundArgs>
+inline _LIBCPP_INLINE_VISIBILITY
+__bind<_F, _BoundArgs...>
+bind(_F&& __f, _BoundArgs&&... __bound_args)
+{
+ typedef __bind<_F, _BoundArgs...> type;
+ return type(_VSTD::forward<_F>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...);
+}
+
+template<class _R, class _F, class ..._BoundArgs>
+inline _LIBCPP_INLINE_VISIBILITY
+__bind_r<_R, _F, _BoundArgs...>
+bind(_F&& __f, _BoundArgs&&... __bound_args)
+{
+ typedef __bind_r<_R, _F, _BoundArgs...> type;
+ return type(_VSTD::forward<_F>(__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 unary_function<long long, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(long long __v) const _NOEXCEPT
+ {
+ size_t __r = 0;
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ for (unsigned __i = 0; __i < sizeof(argument_type)/sizeof(size_t); ++__i)
+ __r ^= __p[__i];
+ return __r;
+ }
+};
+
+template <>
+struct _LIBCPP_VISIBLE hash<unsigned long long>
+ : public unary_function<unsigned long long, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(unsigned long long __v) const _NOEXCEPT
+ {
+ size_t __r = 0;
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ for (unsigned __i = 0; __i < sizeof(argument_type)/sizeof(size_t); ++__i)
+ __r ^= __p[__i];
+ return __r;
+ }
+};
+
+template <>
+struct _LIBCPP_VISIBLE hash<float>
+ : public unary_function<float, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(float __v) const _NOEXCEPT
+ {
+ if (__v == 0)
+ return 0;
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ return *__p;
+ }
+};
+
+template <>
+struct _LIBCPP_VISIBLE hash<double>
+ : public unary_function<double, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(double __v) const _NOEXCEPT
+ {
+ if (__v == 0)
+ return 0;
+ size_t __r = 0;
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ for (unsigned __i = 0; __i < sizeof(argument_type)/sizeof(size_t); ++__i)
+ __r ^= __p[__i];
+ return __r;
+ }
+};
+
+template <>
+struct _LIBCPP_VISIBLE hash<long double>
+ : public unary_function<long double, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(long double __v) const _NOEXCEPT
+ {
+ if (__v == 0)
+ return 0;
+ size_t __r = 0;
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ for (unsigned __i = 0; __i < sizeof(argument_type)/sizeof(size_t); ++__i)
+ __r ^= __p[__i];
+ return __r;
+ }
+};
+
+// struct hash<T*> in <memory>
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_FUNCTIONAL
diff --git a/include/future b/include/future
new file mode 100644
index 000000000000..f6896a3a0fce
--- /dev/null
+++ b/include/future
@@ -0,0 +1,2517 @@
+// -*- 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
+struct _LIBCPP_VISIBLE future_errc
+{
+enum _ {
+ broken_promise,
+ future_already_retrieved,
+ promise_already_satisfied,
+ no_state
+};
+
+ _ __v_;
+
+ _LIBCPP_INLINE_VISIBILITY future_errc(_ __v) : __v_(__v) {}
+ _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;}
+
+};
+
+template <>
+struct _LIBCPP_VISIBLE is_error_code_enum<future_errc> : public true_type {};
+
+//enum class launch
+struct _LIBCPP_VISIBLE launch
+{
+enum _ {
+ async = 1,
+ deferred = 2,
+ any = async | deferred
+};
+
+ _ __v_;
+
+ _LIBCPP_INLINE_VISIBILITY launch(_ __v) : __v_(__v) {}
+ _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;}
+
+};
+
+//enum class future_status
+struct _LIBCPP_VISIBLE future_status
+{
+enum _ {
+ ready,
+ timeout,
+ deferred
+};
+
+ _ __v_;
+
+ _LIBCPP_INLINE_VISIBILITY future_status(_ __v) : __v_(__v) {}
+ _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;}
+
+};
+
+_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 _R>
+class __assoc_state
+ : public __assoc_sub_state
+{
+ typedef __assoc_sub_state base;
+ typedef typename aligned_storage<sizeof(_R), alignment_of<_R>::value>::type _U;
+protected:
+ _U __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
+
+ _R move();
+ typename add_lvalue_reference<_R>::type copy();
+};
+
+template <class _R>
+void
+__assoc_state<_R>::__on_zero_shared() _NOEXCEPT
+{
+ if (this->__state_ & base::__constructed)
+ reinterpret_cast<_R*>(&__value_)->~_R();
+ delete this;
+}
+
+template <class _R>
+template <class _Arg>
+void
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__assoc_state<_R>::set_value(_Arg&& __arg)
+#else
+__assoc_state<_R>::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_) _R(_VSTD::forward<_Arg>(__arg));
+ this->__state_ |= base::__constructed | base::ready;
+ __lk.unlock();
+ __cv_.notify_all();
+}
+
+template <class _R>
+template <class _Arg>
+void
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__assoc_state<_R>::set_value_at_thread_exit(_Arg&& __arg)
+#else
+__assoc_state<_R>::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_) _R(_VSTD::forward<_Arg>(__arg));
+ this->__state_ |= base::__constructed;
+ __thread_local_data()->__make_ready_at_thread_exit(this);
+ __lk.unlock();
+}
+
+template <class _R>
+_R
+__assoc_state<_R>::move()
+{
+ unique_lock<mutex> __lk(this->__mut_);
+ this->__sub_wait(__lk);
+ if (this->__exception_ != nullptr)
+ rethrow_exception(this->__exception_);
+ return _VSTD::move(*reinterpret_cast<_R*>(&__value_));
+}
+
+template <class _R>
+typename add_lvalue_reference<_R>::type
+__assoc_state<_R>::copy()
+{
+ unique_lock<mutex> __lk(this->__mut_);
+ this->__sub_wait(__lk);
+ if (this->__exception_ != nullptr)
+ rethrow_exception(this->__exception_);
+ return *reinterpret_cast<_R*>(&__value_);
+}
+
+template <class _R>
+class __assoc_state<_R&>
+ : public __assoc_sub_state
+{
+ typedef __assoc_sub_state base;
+ typedef _R* _U;
+protected:
+ _U __value_;
+
+ virtual void __on_zero_shared() _NOEXCEPT;
+public:
+
+ void set_value(_R& __arg);
+ void set_value_at_thread_exit(_R& __arg);
+
+ _R& copy();
+};
+
+template <class _R>
+void
+__assoc_state<_R&>::__on_zero_shared() _NOEXCEPT
+{
+ delete this;
+}
+
+template <class _R>
+void
+__assoc_state<_R&>::set_value(_R& __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 _R>
+void
+__assoc_state<_R&>::set_value_at_thread_exit(_R& __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 _R>
+_R&
+__assoc_state<_R&>::copy()
+{
+ unique_lock<mutex> __lk(this->__mut_);
+ this->__sub_wait(__lk);
+ if (this->__exception_ != nullptr)
+ rethrow_exception(this->__exception_);
+ return *__value_;
+}
+
+template <class _R, class _Alloc>
+class __assoc_state_alloc
+ : public __assoc_state<_R>
+{
+ typedef __assoc_state<_R> base;
+ _Alloc __alloc_;
+
+ virtual void __on_zero_shared() _NOEXCEPT;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __assoc_state_alloc(const _Alloc& __a)
+ : __alloc_(__a) {}
+};
+
+template <class _R, class _Alloc>
+void
+__assoc_state_alloc<_R, _Alloc>::__on_zero_shared() _NOEXCEPT
+{
+ if (this->__state_ & base::__constructed)
+ reinterpret_cast<_R*>(&this->__value_)->~_R();
+ typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
+ this->~__assoc_state_alloc();
+ __a.deallocate(this, 1);
+}
+
+template <class _R, class _Alloc>
+class __assoc_state_alloc<_R&, _Alloc>
+ : public __assoc_state<_R&>
+{
+ typedef __assoc_state<_R&> base;
+ _Alloc __alloc_;
+
+ virtual void __on_zero_shared() _NOEXCEPT;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __assoc_state_alloc(const _Alloc& __a)
+ : __alloc_(__a) {}
+};
+
+template <class _R, class _Alloc>
+void
+__assoc_state_alloc<_R&, _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 _R, class _F>
+class __deferred_assoc_state
+ : public __assoc_state<_R>
+{
+ typedef __assoc_state<_R> base;
+
+ _F __func_;
+
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ explicit __deferred_assoc_state(_F&& __f);
+#endif
+
+ virtual void __execute();
+};
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _R, class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+__deferred_assoc_state<_R, _F>::__deferred_assoc_state(_F&& __f)
+ : __func_(_VSTD::forward<_F>(__f))
+{
+ this->__set_deferred();
+}
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _R, class _F>
+void
+__deferred_assoc_state<_R, _F>::__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 _F>
+class __deferred_assoc_state<void, _F>
+ : public __assoc_sub_state
+{
+ typedef __assoc_sub_state base;
+
+ _F __func_;
+
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ explicit __deferred_assoc_state(_F&& __f);
+#endif
+
+ virtual void __execute();
+};
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+__deferred_assoc_state<void, _F>::__deferred_assoc_state(_F&& __f)
+ : __func_(_VSTD::forward<_F>(__f))
+{
+ this->__set_deferred();
+}
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _F>
+void
+__deferred_assoc_state<void, _F>::__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 _R, class _F>
+class __async_assoc_state
+ : public __assoc_state<_R>
+{
+ typedef __assoc_state<_R> base;
+
+ _F __func_;
+
+ virtual void __on_zero_shared() _NOEXCEPT;
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ explicit __async_assoc_state(_F&& __f);
+#endif
+
+ virtual void __execute();
+};
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _R, class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+__async_assoc_state<_R, _F>::__async_assoc_state(_F&& __f)
+ : __func_(_VSTD::forward<_F>(__f))
+{
+}
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _R, class _F>
+void
+__async_assoc_state<_R, _F>::__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 _R, class _F>
+void
+__async_assoc_state<_R, _F>::__on_zero_shared() _NOEXCEPT
+{
+ this->wait();
+ base::__on_zero_shared();
+}
+
+template <class _F>
+class __async_assoc_state<void, _F>
+ : public __assoc_sub_state
+{
+ typedef __assoc_sub_state base;
+
+ _F __func_;
+
+ virtual void __on_zero_shared() _NOEXCEPT;
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ explicit __async_assoc_state(_F&& __f);
+#endif
+
+ virtual void __execute();
+};
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _F>
+inline _LIBCPP_INLINE_VISIBILITY
+__async_assoc_state<void, _F>::__async_assoc_state(_F&& __f)
+ : __func_(_VSTD::forward<_F>(__f))
+{
+}
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _F>
+void
+__async_assoc_state<void, _F>::__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 _F>
+void
+__async_assoc_state<void, _F>::__on_zero_shared() _NOEXCEPT
+{
+ this->wait();
+ base::__on_zero_shared();
+}
+
+template <class _R> class promise;
+template <class _R> class shared_future;
+
+// future
+
+template <class _R> class future;
+
+template <class _R, class _F>
+future<_R>
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__make_deferred_assoc_state(_F&& __f);
+#else
+__make_deferred_assoc_state(_F __f);
+#endif
+
+template <class _R, class _F>
+future<_R>
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__make_async_assoc_state(_F&& __f);
+#else
+__make_async_assoc_state(_F __f);
+#endif
+
+template <class _R>
+class _LIBCPP_VISIBLE future
+{
+ __assoc_state<_R>* __state_;
+
+ explicit future(__assoc_state<_R>* __state);
+
+ template <class> friend class promise;
+ template <class> friend class shared_future;
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template <class _R1, class _F>
+ friend future<_R1> __make_deferred_assoc_state(_F&& __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F&& __f);
+#else
+ template <class _R1, class _F>
+ friend future<_R1> __make_deferred_assoc_state(_F __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F __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<_R> share();
+
+ // retrieving the value
+ _R 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 _R>
+future<_R>::future(__assoc_state<_R>* __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 _R>
+future<_R>::~future()
+{
+ if (__state_)
+ __state_->__release_shared();
+}
+
+template <class _R>
+_R
+future<_R>::get()
+{
+ unique_ptr<__shared_count, __release_shared_count> __(__state_);
+ __assoc_state<_R>* __s = __state_;
+ __state_ = nullptr;
+ return __s->move();
+}
+
+template <class _R>
+class _LIBCPP_VISIBLE future<_R&>
+{
+ __assoc_state<_R&>* __state_;
+
+ explicit future(__assoc_state<_R&>* __state);
+
+ template <class> friend class promise;
+ template <class> friend class shared_future;
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template <class _R1, class _F>
+ friend future<_R1> __make_deferred_assoc_state(_F&& __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F&& __f);
+#else
+ template <class _R1, class _F>
+ friend future<_R1> __make_deferred_assoc_state(_F __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F __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<_R&> share();
+
+ // retrieving the value
+ _R& 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 _R>
+future<_R&>::future(__assoc_state<_R&>* __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 _R>
+future<_R&>::~future()
+{
+ if (__state_)
+ __state_->__release_shared();
+}
+
+template <class _R>
+_R&
+future<_R&>::get()
+{
+ unique_ptr<__shared_count, __release_shared_count> __(__state_);
+ __assoc_state<_R&>* __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 _F>
+ friend future<_R1> __make_deferred_assoc_state(_F&& __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F&& __f);
+#else
+ template <class _R1, class _F>
+ friend future<_R1> __make_deferred_assoc_state(_F __f);
+ template <class _R1, class _F>
+ friend future<_R1> __make_async_assoc_state(_F __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 _R>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(future<_R>& __x, future<_R>& __y)
+{
+ __x.swap(__y);
+}
+
+// promise<R>
+
+template <class _Callable> class packaged_task;
+
+template <class _R>
+class _LIBCPP_VISIBLE promise
+{
+ __assoc_state<_R>* __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<_R> get_future();
+
+ // setting the result
+ void set_value(const _R& __r);
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ void set_value(_R&& __r);
+#endif
+ void set_exception(exception_ptr __p);
+
+ // setting the result with deferred notification
+ void set_value_at_thread_exit(const _R& __r);
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ void set_value_at_thread_exit(_R&& __r);
+#endif
+ void set_exception_at_thread_exit(exception_ptr __p);
+};
+
+template <class _R>
+promise<_R>::promise()
+ : __state_(new __assoc_state<_R>)
+{
+}
+
+template <class _R>
+template <class _Alloc>
+promise<_R>::promise(allocator_arg_t, const _Alloc& __a0)
+{
+ typedef typename _Alloc::template rebind<__assoc_state_alloc<_R, _Alloc> >::other _A2;
+ typedef __allocator_destructor<_A2> _D2;
+ _A2 __a(__a0);
+ unique_ptr<__assoc_state_alloc<_R, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
+ ::new(__hold.get()) __assoc_state_alloc<_R, _Alloc>(__a0);
+ __state_ = __hold.release();
+}
+
+template <class _R>
+promise<_R>::~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 _R>
+future<_R>
+promise<_R>::get_future()
+{
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ if (__state_ == nullptr)
+ throw future_error(make_error_code(future_errc::no_state));
+#endif
+ return future<_R>(__state_);
+}
+
+template <class _R>
+void
+promise<_R>::set_value(const _R& __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 _R>
+void
+promise<_R>::set_value(_R&& __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 _R>
+void
+promise<_R>::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 _R>
+void
+promise<_R>::set_value_at_thread_exit(const _R& __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 _R>
+void
+promise<_R>::set_value_at_thread_exit(_R&& __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 _R>
+void
+promise<_R>::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 _R>
+class _LIBCPP_VISIBLE promise<_R&>
+{
+ __assoc_state<_R&>* __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<_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 _R>
+promise<_R&>::promise()
+ : __state_(new __assoc_state<_R&>)
+{
+}
+
+template <class _R>
+template <class _Alloc>
+promise<_R&>::promise(allocator_arg_t, const _Alloc& __a0)
+{
+ typedef typename _Alloc::template rebind<__assoc_state_alloc<_R&, _Alloc> >::other _A2;
+ typedef __allocator_destructor<_A2> _D2;
+ _A2 __a(__a0);
+ unique_ptr<__assoc_state_alloc<_R&, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
+ ::new(__hold.get()) __assoc_state_alloc<_R&, _Alloc>(__a0);
+ __state_ = __hold.release();
+}
+
+template <class _R>
+promise<_R&>::~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 _R>
+future<_R&>
+promise<_R&>::get_future()
+{
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ if (__state_ == nullptr)
+ throw future_error(make_error_code(future_errc::no_state));
+#endif
+ return future<_R&>(__state_);
+}
+
+template <class _R>
+void
+promise<_R&>::set_value(_R& __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 _R>
+void
+promise<_R&>::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 _R>
+void
+promise<_R&>::set_value_at_thread_exit(_R& __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 _R>
+void
+promise<_R&>::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 _R>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(promise<_R>& __x, promise<_R>& __y)
+{
+ __x.swap(__y);
+}
+
+template <class _R, class _Alloc>
+ struct _LIBCPP_VISIBLE uses_allocator<promise<_R>, _Alloc>
+ : public true_type {};
+
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+
+// packaged_task
+
+template<class _Fp> class __packaged_task_base;
+
+template<class _R, class ..._ArgTypes>
+class __packaged_task_base<_R(_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 _R operator()(_ArgTypes&& ...) = 0;
+};
+
+template<class _FD, class _Alloc, class _FB> class __packaged_task_func;
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+class __packaged_task_func<_F, _Alloc, _R(_ArgTypes...)>
+ : public __packaged_task_base<_R(_ArgTypes...)>
+{
+ __compressed_pair<_F, _Alloc> __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __packaged_task_func(const _F& __f) : __f_(__f) {}
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __packaged_task_func(_F&& __f) : __f_(_VSTD::move(__f)) {}
+ _LIBCPP_INLINE_VISIBILITY
+ __packaged_task_func(const _F& __f, const _Alloc& __a)
+ : __f_(__f, __a) {}
+ _LIBCPP_INLINE_VISIBILITY
+ __packaged_task_func(_F&& __f, const _Alloc& __a)
+ : __f_(_VSTD::move(__f), __a) {}
+ virtual void __move_to(__packaged_task_base<_R(_ArgTypes...)>*);
+ virtual void destroy();
+ virtual void destroy_deallocate();
+ virtual _R operator()(_ArgTypes&& ... __args);
+};
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__packaged_task_func<_F, _Alloc, _R(_ArgTypes...)>::__move_to(
+ __packaged_task_base<_R(_ArgTypes...)>* __p)
+{
+ ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__packaged_task_func<_F, _Alloc, _R(_ArgTypes...)>::destroy()
+{
+ __f_.~__compressed_pair<_F, _Alloc>();
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+void
+__packaged_task_func<_F, _Alloc, _R(_ArgTypes...)>::destroy_deallocate()
+{
+ typedef typename _Alloc::template rebind<__packaged_task_func>::other _A;
+ _A __a(__f_.second());
+ __f_.~__compressed_pair<_F, _Alloc>();
+ __a.deallocate(this, 1);
+}
+
+template<class _F, class _Alloc, class _R, class ..._ArgTypes>
+_R
+__packaged_task_func<_F, _Alloc, _R(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
+{
+ return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
+}
+
+template <class _Callable> class __packaged_task_function;
+
+template<class _R, class ..._ArgTypes>
+class __packaged_task_function<_R(_ArgTypes...)>
+{
+ typedef __packaged_task_base<_R(_ArgTypes...)> __base;
+ aligned_storage<3*sizeof(void*)>::type __buf_;
+ __base* __f_;
+
+public:
+ typedef _R result_type;
+
+ // construct/copy/destroy:
+ _LIBCPP_INLINE_VISIBILITY
+ __packaged_task_function() : __f_(nullptr) {}
+ template<class _F>
+ __packaged_task_function(_F&& __f);
+ template<class _F, class _Alloc>
+ __packaged_task_function(allocator_arg_t, const _Alloc& __a, _F&& __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&);
+
+ _R operator()(_ArgTypes...) const;
+};
+
+template<class _R, class ..._ArgTypes>
+__packaged_task_function<_R(_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 _R, class ..._ArgTypes>
+template <class _F>
+__packaged_task_function<_R(_ArgTypes...)>::__packaged_task_function(_F&& __f)
+ : __f_(nullptr)
+{
+ typedef typename remove_reference<_F>::type _FR;
+ typedef __packaged_task_func<_FR, allocator<_FR>, _R(_ArgTypes...)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(_VSTD::forward<_F>(__f));
+ }
+ else
+ {
+ typedef allocator<_FF> _A;
+ _A __a;
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(_VSTD::forward<_F>(__f), allocator<_FR>(__a));
+ __f_ = __hold.release();
+ }
+}
+
+template<class _R, class ..._ArgTypes>
+template <class _F, class _Alloc>
+__packaged_task_function<_R(_ArgTypes...)>::__packaged_task_function(
+ allocator_arg_t, const _Alloc& __a0, _F&& __f)
+ : __f_(nullptr)
+{
+ typedef allocator_traits<_Alloc> __alloc_traits;
+ typedef typename remove_reference<_F>::type _FR;
+ typedef __packaged_task_func<_FR, _Alloc, _R(_ArgTypes...)> _FF;
+ if (sizeof(_FF) <= sizeof(__buf_))
+ {
+ __f_ = (__base*)&__buf_;
+ ::new (__f_) _FF(_VSTD::forward<_F>(__f));
+ }
+ else
+ {
+ typedef typename __alloc_traits::template
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ rebind_alloc<_FF>
+#else
+ rebind_alloc<_FF>::other
+#endif
+ _A;
+ _A __a(__a0);
+ typedef __allocator_destructor<_A> _D;
+ unique_ptr<__base, _D> __hold(__a.allocate(1), _D(__a, 1));
+ ::new (__hold.get()) _FF(_VSTD::forward<_F>(__f), _Alloc(__a));
+ __f_ = __hold.release();
+ }
+}
+
+template<class _R, class ..._ArgTypes>
+__packaged_task_function<_R(_ArgTypes...)>&
+__packaged_task_function<_R(_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 _R, class ..._ArgTypes>
+__packaged_task_function<_R(_ArgTypes...)>::~__packaged_task_function()
+{
+ if (__f_ == (__base*)&__buf_)
+ __f_->destroy();
+ else if (__f_)
+ __f_->destroy_deallocate();
+}
+
+template<class _R, class ..._ArgTypes>
+void
+__packaged_task_function<_R(_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 _R, class ..._ArgTypes>
+inline _LIBCPP_INLINE_VISIBILITY
+_R
+__packaged_task_function<_R(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
+{
+ return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
+}
+
+template<class _R, class ..._ArgTypes>
+class _LIBCPP_VISIBLE packaged_task<_R(_ArgTypes...)>
+{
+public:
+ typedef _R 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 _F>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit packaged_task(_F&& __f) : __f_(_VSTD::forward<_F>(__f)) {}
+ template <class _F, class _Allocator>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit packaged_task(allocator_arg_t, const _Allocator& __a, _F&& __f)
+ : __f_(allocator_arg, __a, _VSTD::forward<_F>(__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 _R, class ..._ArgTypes>
+void
+packaged_task<_R(_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 _R, class ..._ArgTypes>
+void
+packaged_task<_R(_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 _R, class ..._ArgTypes>
+void
+packaged_task<_R(_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 _F>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit packaged_task(_F&& __f) : __f_(_VSTD::forward<_F>(__f)) {}
+ template <class _F, class _Allocator>
+ _LIBCPP_INLINE_VISIBILITY
+ explicit packaged_task(allocator_arg_t, const _Allocator& __a, _F&& __f)
+ : __f_(allocator_arg, __a, _VSTD::forward<_F>(__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 _R, class _F>
+future<_R>
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__make_deferred_assoc_state(_F&& __f)
+#else
+__make_deferred_assoc_state(_F __f)
+#endif
+{
+ unique_ptr<__deferred_assoc_state<_R, _F>, __release_shared_count>
+ __h(new __deferred_assoc_state<_R, _F>(_VSTD::forward<_F>(__f)));
+ return future<_R>(__h.get());
+}
+
+template <class _R, class _F>
+future<_R>
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+__make_async_assoc_state(_F&& __f)
+#else
+__make_async_assoc_state(_F __f)
+#endif
+{
+ unique_ptr<__async_assoc_state<_R, _F>, __release_shared_count>
+ __h(new __async_assoc_state<_R, _F>(_VSTD::forward<_F>(__f)));
+ _VSTD::thread(&__async_assoc_state<_R, _F>::__execute, __h.get()).detach();
+ return future<_R>(__h.get());
+}
+
+template <class _F, class... _Args>
+class __async_func
+{
+ tuple<_F, _Args...> __f_;
+
+public:
+ typedef typename __invoke_of<_F, _Args...>::type _R;
+
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __async_func(_F&& __f, _Args&&... __args)
+ : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
+
+ _LIBCPP_INLINE_VISIBILITY
+ __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
+
+ _R operator()()
+ {
+ typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
+ return __execute(_Index());
+ }
+private:
+ template <size_t ..._Indices>
+ _R
+ __execute(__tuple_indices<_Indices...>)
+ {
+ return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
+ }
+};
+
+template <class _F, class... _Args>
+future<typename __invoke_of<typename decay<_F>::type, typename decay<_Args>::type...>::type>
+async(launch __policy, _F&& __f, _Args&&... __args)
+{
+ typedef __async_func<typename decay<_F>::type, typename decay<_Args>::type...> _BF;
+ typedef typename _BF::_R _R;
+ future<_R> __r;
+ if (__policy & launch::async)
+ __r = _VSTD::__make_async_assoc_state<_R>(_BF(__decay_copy(_VSTD::forward<_F>(__f)),
+ __decay_copy(_VSTD::forward<_Args>(__args))...));
+ else if (__policy & launch::deferred)
+ __r = _VSTD::__make_deferred_assoc_state<_R>(_BF(__decay_copy(_VSTD::forward<_F>(__f)),
+ __decay_copy(_VSTD::forward<_Args>(__args))...));
+ return __r;
+}
+
+template <class _F, class... _Args>
+inline _LIBCPP_INLINE_VISIBILITY
+future<typename __invoke_of<typename decay<_F>::type, typename decay<_Args>::type...>::type>
+async(_F&& __f, _Args&&... __args)
+{
+ return _VSTD::async(launch::any, _VSTD::forward<_F>(__f),
+ _VSTD::forward<_Args>(__args)...);
+}
+
+#endif // _LIBCPP_HAS_NO_VARIADICS
+
+// shared_future
+
+template <class _R>
+class _LIBCPP_VISIBLE shared_future
+{
+ __assoc_state<_R>* __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<_R>&& __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 _R& 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 _R>
+shared_future<_R>::~shared_future()
+{
+ if (__state_)
+ __state_->__release_shared();
+}
+
+template <class _R>
+shared_future<_R>&
+shared_future<_R>::operator=(const shared_future& __rhs)
+{
+ if (__rhs.__state_)
+ __rhs.__state_->__add_shared();
+ if (__state_)
+ __state_->__release_shared();
+ __state_ = __rhs.__state_;
+ return *this;
+}
+
+template <class _R>
+class _LIBCPP_VISIBLE shared_future<_R&>
+{
+ __assoc_state<_R&>* __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<_R&>&& __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
+ _R& 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 _R>
+shared_future<_R&>::~shared_future()
+{
+ if (__state_)
+ __state_->__release_shared();
+}
+
+template <class _R>
+shared_future<_R&>&
+shared_future<_R&>::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 _R>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(shared_future<_R>& __x, shared_future<_R>& __y)
+{
+ __x.swap(__y);
+}
+
+template <class _R>
+inline _LIBCPP_INLINE_VISIBILITY
+shared_future<_R>
+future<_R>::share()
+{
+ return shared_future<_R>(_VSTD::move(*this));
+}
+
+template <class _R>
+inline _LIBCPP_INLINE_VISIBILITY
+shared_future<_R&>
+future<_R&>::share()
+{
+ return shared_future<_R&>(_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/include/initializer_list b/include/initializer_list
new file mode 100644
index 000000000000..3263906d6374
--- /dev/null
+++ b/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 _E>
+class _LIBCPP_VISIBLE initializer_list
+{
+ const _E* __begin_;
+ size_t __size_;
+
+ _LIBCPP_ALWAYS_INLINE
+ initializer_list(const _E* __b, size_t __s) _NOEXCEPT
+ : __begin_(__b),
+ __size_(__s)
+ {}
+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;
+
+ _LIBCPP_ALWAYS_INLINE initializer_list() _NOEXCEPT : __begin_(nullptr), __size_(0) {}
+
+ _LIBCPP_ALWAYS_INLINE size_t size() const _NOEXCEPT {return __size_;}
+ _LIBCPP_ALWAYS_INLINE const _E* begin() const _NOEXCEPT {return __begin_;}
+ _LIBCPP_ALWAYS_INLINE const _E* end() const _NOEXCEPT {return __begin_ + __size_;}
+};
+
+template<class _E>
+inline _LIBCPP_INLINE_VISIBILITY
+const _E*
+begin(initializer_list<_E> __il) _NOEXCEPT
+{
+ return __il.begin();
+}
+
+template<class _E>
+inline _LIBCPP_INLINE_VISIBILITY
+const _E*
+end(initializer_list<_E> __il) _NOEXCEPT
+{
+ return __il.end();
+}
+
+#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
+
+} // std
+
+#endif // _LIBCPP_INITIALIZER_LIST
diff --git a/include/iomanip b/include/iomanip
new file mode 100644
index 000000000000..15704046227f
--- /dev/null
+++ b/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 _M>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is, const __iom_t7<_M>& __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> _I;
+ typedef money_get<_CharT, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ const _F& __mf = use_facet<_F>(__is.getloc());
+ __mf.get(_I(__is), _I(), __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 _M>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os, const __iom_t8<_M>& __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> _O;
+ typedef money_put<_CharT, _O> _F;
+ const _F& __mf = use_facet<_F>(__os.getloc());
+ if (__mf.put(_O(__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 _C, class _Traits>
+ friend
+ basic_istream<_C, _Traits>&
+ operator>>(basic_istream<_C, _Traits>& __is, const __iom_t9<_C>& __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> _I;
+ typedef time_get<_CharT, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ const _F& __tf = use_facet<_F>(__is.getloc());
+ __tf.get(_I(__is), _I(), __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 _C, class _Traits>
+ friend
+ basic_ostream<_C, _Traits>&
+ operator<<(basic_ostream<_C, _Traits>& __os, const __iom_t10<_C>& __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> _O;
+ typedef time_put<_CharT, _O> _F;
+ const _F& __tf = use_facet<_F>(__os.getloc());
+ if (__tf.put(_O(__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/include/ios b/include/ios
new file mode 100644
index 000000000000..7ea63a31ca71
--- /dev/null
+++ b/include/ios
@@ -0,0 +1,987 @@
+// -*- 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
+struct _LIBCPP_VISIBLE io_errc
+{
+enum _ {
+ stream = 1
+};
+ _ __v_;
+
+ _LIBCPP_ALWAYS_INLINE io_errc(_ __v) : __v_(__v) {}
+ _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;}
+};
+
+template <>
+struct _LIBCPP_VISIBLE is_error_code_enum<io_errc> : public true_type { };
+template <>
+struct _LIBCPP_VISIBLE is_error_code_enum<io_errc::_> : public true_type { };
+
+_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 // 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/include/iosfwd b/include/iosfwd
new file mode 100644
index 000000000000..7e5ac7321f54
--- /dev/null
+++ b/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/include/iostream b/include/iostream
new file mode 100644
index 000000000000..53cd146cc595
--- /dev/null
+++ b/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/include/istream b/include/istream
new file mode 100644
index 000000000000..24d9f3a9f63a
--- /dev/null
+++ b/include/istream
@@ -0,0 +1,1711 @@
+// -*- 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>
+
+#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
+ // 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> _I;
+ const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
+ _I __i(__is);
+ _I __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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ long __temp;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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> _I;
+ typedef num_get<char_type, _I> _F;
+ ios_base::iostate __err = ios_base::goodbit;
+ long __temp;
+ use_facet<_F>(this->getloc()).get(_I(*this), _I(), *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, __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, __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)
+ {
+ ios_base::iostate __err = ios_base::goodbit;
+ 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/include/iterator b/include/iterator
new file mode 100644
index 000000000000..13c2c341e238
--- /dev/null
+++ b/include/iterator
@@ -0,0 +1,1804 @@
+// -*- 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 _CharT operator*() const {return __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 _I, class _O> _O copy(_I, _I, _O);
+template <class _B1, class _B2> _B2 copy_backward(_B1, _B1, _B2);
+template <class _I, class _O> _O move(_I, _I, _O);
+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 _I, class _O> friend _O copy(_I, _I, _O);
+ template <class _B1, class _B2> friend _B2 copy_backward(_B1, _B1, _B2);
+ template <class _I, class _O> friend _O move(_I, _I, _O);
+ 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 _C>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+begin(_C& __c) -> decltype(__c.begin())
+{
+ return __c.begin();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+begin(const _C& __c) -> decltype(__c.begin())
+{
+ return __c.begin();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+end(_C& __c) -> decltype(__c.end())
+{
+ return __c.end();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+auto
+end(const _C& __c) -> decltype(__c.end())
+{
+ return __c.end();
+}
+
+#else // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+typename _C::iterator
+begin(_C& __c)
+{
+ return __c.begin();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+typename _C::const_iterator
+begin(const _C& __c)
+{
+ return __c.begin();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+typename _C::iterator
+end(_C& __c)
+{
+ return __c.end();
+}
+
+template <class _C>
+inline _LIBCPP_INLINE_VISIBILITY
+typename _C::const_iterator
+end(const _C& __c)
+{
+ return __c.end();
+}
+
+#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_TRAILING_RETURN)
+
+template <class _T, size_t _N>
+inline _LIBCPP_INLINE_VISIBILITY
+_T*
+begin(_T (&__array)[_N])
+{
+ return __array;
+}
+
+template <class _T, size_t _N>
+inline _LIBCPP_INLINE_VISIBILITY
+_T*
+end(_T (&__array)[_N])
+{
+ return __array + _N;
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_ITERATOR
diff --git a/include/limits b/include/limits
new file mode 100644
index 000000000000..14b49b1385b3
--- /dev/null
+++ b/include/limits
@@ -0,0 +1,619 @@
+// -*- 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>
+
+#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/include/list b/include/list
new file mode 100644
index 000000000000..345f24dbbe4d
--- /dev/null
+++ b/include/list
@@ -0,0 +1,2273 @@
+// -*- 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>
+
+#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> _I;
+ assign(_I(__c.begin()), _I(__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> _I;
+ assign(_I(__c.begin()), _I(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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> _D;
+ unique_ptr<__node, _D> __hold(__node_alloc_traits::allocate(__na, 1), _D(__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/include/locale b/include/locale
new file mode 100644
index 000000000000..b2afbd40e07b
--- /dev/null
+++ b/include/locale
@@ -0,0 +1,4485 @@
+// -*- 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
+
+#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;
+typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii;
+
+// 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 = _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 (__ct == __thousands_sep && __grouping.size() != 0)
+ {
+ 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 (__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 class __num_get<char>;
+extern template class __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;
+ 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 class __num_put<char>;
+extern template class __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*__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*__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();
+ int __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();
+ int __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;
+ }
+ int __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 ctype<char_type>& __ct = use_facet<ctype<char_type> >(__iob.getloc());
+ 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& __fmt = this->__c();
+ __b = get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.size());
+ }
+ break;
+ case 'd':
+ case 'e':
+ __get_day(__tm->tm_mday, __b, __e, __err, __ct);
+ break;
+ case 'D':
+ {
+ const char_type __fmt[] = {'%', 'm', '/', '%', 'd', '/', '%', 'y'};
+ __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0]));
+ }
+ break;
+ case 'F':
+ {
+ const char_type __fmt[] = {'%', 'Y', '-', '%', 'm', '-', '%', 'd'};
+ __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[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 __fmt[] = {'%', 'I', ':', '%', 'M', ':', '%', 'S', ' ', '%', 'p'};
+ __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0]));
+ }
+ break;
+ case 'R':
+ {
+ const char_type __fmt[] = {'%', 'H', ':', '%', 'M'};
+ __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[0]));
+ }
+ break;
+ case 'S':
+ __get_second(__tm->tm_sec, __b, __e, __err, __ct);
+ break;
+ case 'T':
+ {
+ const char_type __fmt[] = {'%', 'H', ':', '%', 'M', ':', '%', 'S'};
+ __b = get(__b, __e, __iob, __err, __tm, __fmt, __fmt + sizeof(__fmt)/sizeof(__fmt[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& __fmt = this->__X();
+ __b = get(__b, __e, __iob, __err, __tm, __fmt.data(), __fmt.data() + __fmt.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& __iob,
+ 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 = (__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 = __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;
+ 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))
+ ++__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))
+ ++__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;
+ string_type* __k = __scan_keyword(__b, __e, &__sym, &__sym+1,
+ __ct, __et);
+ if (__sb && __k != &__sym)
+ {
+ __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 unsigned __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(__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 unsigned __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 = 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 = 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 == 0)
+ __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 - __fd) * 2 + __sn.size() + __sym.size() + __fd + 1
+ : __sn.size() + __sym.size() + __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 = __digits.size() > __fd ?
+ (__digits.size() - __fd) * 2 + __sn.size() + __sym.size() + __fd + 1
+ : __sn.size() + __sym.size() + __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 __s = __to_nxt - &__bs[0];
+ __bs.resize(2 * __s);
+ __to = &__bs[0] + __s;
+ __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/include/map b/include/map
new file mode 100644
index 000000000000..8bb75550dbaa
--- /dev/null
+++ b/include/map
@@ -0,0 +1,1931 @@
+// -*- 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>
+class __map_value_compare
+ : private _Compare
+{
+ typedef pair<typename std::remove_const<_Key>::type, _Tp> _P;
+ 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 _P& __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 _P& __x, const _CP& __y) const
+ {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _P& __x, const _P& __y) const
+ {return static_cast<const _Compare&>(*this)(__x.first, __y.first);}
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _P& __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 _P& __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> _P;
+ 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 _P& __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 _P& __x, const _CP& __y) const
+ {return comp(__x.first, __y.first);}
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _P& __x, const _P& __y) const
+ {return comp(__x.first, __y.first);}
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _P& __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 _P& __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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ pair<iterator, bool> insert(_P&& __p)
+ {return __tree_.__insert_unique(_VSTD::forward<_P>(__p));}
+
+ template <class _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(const_iterator __pos, _P&& __p)
+ {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_P>(__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> _D;
+ typedef unique_ptr<__node, _D> __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), _D(__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), _D(__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), _D(__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), _D(__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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(_P&& __p)
+ {return __tree_.__insert_multi(_VSTD::forward<_P>(__p));}
+
+ template <class _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(const_iterator __pos, _P&& __p)
+ {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_P>(__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> _D;
+ typedef unique_ptr<__node, _D> __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), _D(__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), _D(__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), _D(__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/include/memory b/include/memory
new file mode 100644
index 000000000000..878dda8730d9
--- /dev/null
+++ b/include/memory
@@ -0,0 +1,4193 @@
+// -*- 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>
+#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
+
+// allocator_arg_t
+
+struct _LIBCPP_VISIBLE allocator_arg_t { };
+
+extern const allocator_arg_t allocator_arg;
+
+// 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;};
+};
+
+// 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 _T>
+inline _LIBCPP_INLINE_VISIBILITY
+_T*
+__to_raw_pointer(_T* __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
+{
+};
+
+#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);}
+
+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 __hint, 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;}
+};
+
+// 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
+
+// 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 _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,
+ bool = is_empty<_T2>::value>
+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, int = 0)
+ : __first_(_VSTD::forward<_T1_param>(__t1)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0)
+ : __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;
+ }
+
+#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, int = 0)
+ : _T1(_VSTD::forward<_T1_param>(__t1)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __libcpp_compressed_pair_imp(_T2_param __t2, int* = 0)
+ : __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;
+ }
+
+#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;
+ }
+
+#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;
+ }
+
+#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& __x)
+ _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, int = 0)
+ : base(_VSTD::forward<_T1_param>(__t1)) {}
+ _LIBCPP_INLINE_VISIBILITY explicit __compressed_pair(_T2_param __t2, int* = 0)
+ : 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;
+ }
+#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);}
+
+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[]>
+{
+ _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
+ {
+ static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
+ delete [] __ptr;
+ }
+private:
+ template <class _Up> void operator() (_Up*) const;
+};
+
+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_;
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ unique_ptr(const unique_ptr&);
+ unique_ptr& operator=(const unique_ptr&);
+ template <class _Up, class _Ep>
+ unique_ptr(const unique_ptr<_Up, _Ep>&);
+ template <class _Up, class _Ep>
+ unique_ptr& operator=(const unique_ptr<_Up, _Ep>&);
+#else // _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,
+ 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 operator int __nat::*() const
+ _NOEXCEPT
+ {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
+
+ _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_;
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ unique_ptr(const unique_ptr&);
+ unique_ptr& operator=(const unique_ptr&);
+#else // _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 _P,
+ class = typename enable_if<is_same<_P, pointer>::value>::type
+ >
+ _LIBCPP_INLINE_VISIBILITY explicit unique_ptr(_P __p) _NOEXCEPT
+ : __ptr_(__p)
+ {
+ static_assert(!is_pointer<deleter_type>::value,
+ "unique_ptr constructed with null function pointer deleter");
+ }
+
+ template <class _P,
+ class = typename enable_if<is_same<_P, pointer>::value>::type
+ >
+ _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __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 _P,
+ class = typename enable_if<is_same<_P, pointer>::value ||
+ is_same<_P, nullptr_t>::value>::type
+ >
+ _LIBCPP_INLINE_VISIBILITY unique_ptr(_P __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;
+ }
+#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 operator int __nat::*() const _NOEXCEPT
+ {return __ptr_.first() ? &__nat::__for_bool_ : 0;}
+
+ _LIBCPP_INLINE_VISIBILITY pointer release() _NOEXCEPT
+ {
+ pointer __t = __ptr_.first();
+ __ptr_.first() = pointer();
+ return __t;
+ }
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template <class _P,
+ class = typename enable_if<is_same<_P, pointer>::value>::type
+ >
+ _LIBCPP_INLINE_VISIBILITY void reset(_P __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) {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 __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 _Tp> struct hash;
+
+template<class _Tp>
+struct _LIBCPP_VISIBLE hash<_Tp*>
+ : public unary_function<_Tp*, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(_Tp* __v) const _NOEXCEPT
+ {
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ return *__p;
+ }
+};
+
+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)
+{
+ __destruct_n __d(0);
+ typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
+ unique_ptr<value_type, __destruct_n&> __h(&*__r, __d);
+ for (; __f != __l; ++__f, ++__r, __d.__incr((value_type*)0))
+ ::new(&*__r) value_type(*__f);
+ __h.release();
+ return __r;
+}
+
+template <class _InputIterator, class _Size, class _ForwardIterator>
+_ForwardIterator
+uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r)
+{
+ __destruct_n __d(0);
+ typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
+ unique_ptr<value_type, __destruct_n&> __h(&*__r, __d);
+ for (; __n > 0; ++__f, ++__r, __d.__incr((value_type*)0), --__n)
+ ::new(&*__r) value_type(*__f);
+ __h.release();
+ return __r;
+}
+
+template <class _ForwardIterator, class _Tp>
+void
+uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x)
+{
+ __destruct_n __d(0);
+ typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
+ unique_ptr<value_type, __destruct_n&> __h(&*__f, __d);
+ for (; __f != __l; ++__f, __d.__incr((value_type*)0))
+ ::new(&*__f) value_type(__x);
+ __h.release();
+}
+
+template <class _ForwardIterator, class _Size, class _Tp>
+_ForwardIterator
+uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
+{
+ __destruct_n __d(0);
+ typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
+ unique_ptr<value_type, __destruct_n&> __h(&*__f, __d);
+ for (; __n > 0; ++__f, --__n, __d.__incr((value_type*)0))
+ ::new(&*__f) value_type(__x);
+ __h.release();
+ 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_(_VSTD::move(__a), _Tp(_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> explicit shared_ptr(_Yp* __p);
+ template<class _Yp, class _Dp> shared_ptr(_Yp* __p, _Dp __d);
+ template<class _Yp, class _Dp, class _Alloc> 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> shared_ptr(auto_ptr<_Yp>&& __r);
+#else
+ template<class _Yp> shared_ptr(auto_ptr<_Yp> __r);
+#endif
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+private:
+ template <class _Yp, class _Dp> shared_ptr(const unique_ptr<_Yp, _Dp>& __r);// = delete;
+public:
+ template <class _Yp, class _Dp> shared_ptr(unique_ptr<_Yp, _Dp>&&,
+ typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat());
+ template <class _Yp, class _Dp> 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> shared_ptr(unique_ptr<_Yp, _Dp>,
+ typename enable_if<!is_lvalue_reference<_Dp>::value, __nat>::type = __nat());
+ template <class _Yp, class _Dp> 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> shared_ptr& operator=(const shared_ptr<_Yp>& __r) _NOEXCEPT;
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ shared_ptr& operator=(shared_ptr&& __r) _NOEXCEPT;
+ template<class _Yp> shared_ptr& operator=(shared_ptr<_Yp>&& __r);
+ template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp>&& __r);
+#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template<class _Yp> shared_ptr& operator=(auto_ptr<_Yp> __r);
+#endif
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+private:
+ template <class _Yp, class _Dp> shared_ptr& operator=(const unique_ptr<_Yp, _Dp>& __r);// = delete;
+public:
+ template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp>&& __r);
+#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ template <class _Yp, class _Dp> shared_ptr& operator=(unique_ptr<_Yp, _Dp> __r);
+#endif
+
+ void swap(shared_ptr& __r) _NOEXCEPT;
+ void reset() _NOEXCEPT;
+ template<class _Yp> void reset(_Yp* __p) _NOEXCEPT;
+ template<class _Yp, class _Dp> void reset(_Yp* __p, _Dp __d);
+ template<class _Yp, class _Dp, class _Alloc> void 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
+ /*explicit*/ operator bool() const _NOEXCEPT {return get() != 0;}
+ template <class _U>
+ _LIBCPP_INLINE_VISIBILITY
+ bool owner_before(shared_ptr<_U> const& __p) const
+ {return __cntrl_ < __p.__cntrl_;}
+ template <class _U>
+ _LIBCPP_INLINE_VISIBILITY
+ bool owner_before(weak_ptr<_U> 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>
+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>
+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>
+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>
+#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>
+#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>
+#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
+shared_ptr<_Tp>&
+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
+shared_ptr<_Tp>&
+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
+shared_ptr<_Tp>&
+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
+shared_ptr<_Tp>&
+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
+shared_ptr<_Tp>&
+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
+shared_ptr<_Tp>&
+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
+void
+shared_ptr<_Tp>::reset(_Yp* __p)
+{
+ shared_ptr(__p).swap(*this);
+}
+
+template<class _Tp>
+template<class _Yp, class _Dp>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+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
+void
+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
+shared_ptr<_Tp>
+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
+shared_ptr<_Tp>
+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
+{
+ return __x.get() < __y.get();
+}
+
+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
+shared_ptr<_Tp>
+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
+shared_ptr<_Tp>
+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>
+shared_ptr<_Tp>
+const_pointer_cast(const shared_ptr<_Up>& __r) _NOEXCEPT
+{
+ return shared_ptr<_Tp>(__r, const_cast<_Tp*>(__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;
+
+ ~weak_ptr();
+
+ weak_ptr& operator=(weak_ptr const& __r) _NOEXCEPT;
+ template<class _Yp> weak_ptr& operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT;
+ template<class _Yp> weak_ptr& 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();
+}
+
+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
+weak_ptr<_Tp>&
+weak_ptr<_Tp>::operator=(weak_ptr<_Yp> const& __r) _NOEXCEPT
+{
+ weak_ptr(__r).swap(*this);
+ return *this;
+}
+
+template<class _Tp>
+template<class _Yp>
+inline _LIBCPP_INLINE_VISIBILITY
+weak_ptr<_Tp>&
+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 _Y>
+inline _LIBCPP_INLINE_VISIBILITY
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Y> 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/include/mutex b/include/mutex
new file mode 100644
index 000000000000..37e74d6d5752
--- /dev/null
+++ b/include/mutex
@@ -0,0 +1,562 @@
+// -*- 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
+
+#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 _F>
+class __call_once_param
+{
+ _F __f_;
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __call_once_param(_F&& __f) : __f_(_VSTD::move(__f)) {}
+#else
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __call_once_param(const _F& __f) : __f_(__f) {}
+#endif
+
+ _LIBCPP_INLINE_VISIBILITY
+ void operator()()
+ {
+ typedef typename __make_tuple_indices<tuple_size<_F>::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 _F>
+class __call_once_param
+{
+ _F __f_;
+public:
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __call_once_param(_F&& __f) : __f_(_VSTD::move(__f)) {}
+#else
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __call_once_param(const _F& __f) : __f_(__f) {}
+#endif
+
+ _LIBCPP_INLINE_VISIBILITY
+ void operator()()
+ {
+ __f_();
+ }
+};
+
+#endif
+
+template <class _F>
+void
+__call_once_proxy(void* __vp)
+{
+ __call_once_param<_F>* __p = static_cast<__call_once_param<_F>*>(__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 (__builtin_expect(__flag.__state_ , ~0ul) != ~0ul)
+ {
+ typedef tuple<typename decay<_Callable>::type, typename decay<_Args>::type...> _G;
+ __call_once_param<_G> __p(_G(__decay_copy(_VSTD::forward<_Callable>(__func)),
+ __decay_copy(_VSTD::forward<_Args>(__args))...));
+ __call_once(__flag.__state_, &__p, &__call_once_proxy<_G>);
+ }
+}
+
+#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/include/new b/include/new
new file mode 100644
index 000000000000..5bcbad0cd046
--- /dev/null
+++ b/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/include/numeric b/include/numeric
new file mode 100644
index 000000000000..c201a5f57cbb
--- /dev/null
+++ b/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/include/ostream b/include/ostream
new file mode 100644
index 000000000000..53064961ca9b
--- /dev/null
+++ b/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
+ // 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> _I;
+ typedef ostreambuf_iterator<_CharT, _Traits> _O;
+ _I __i(__sb);
+ _I __eof;
+ _O __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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> > _F;
+ const _F& __f = use_facet<_F>(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> _I;
+ if (__pad_and_output(_I(__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> _I;
+ if (__pad_and_output(_I(__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> _I;
+ if (__pad_and_output(_I(__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> _I;
+ if (__pad_and_output(_I(__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> _I;
+ if (__pad_and_output(_I(__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> _I;
+ size_t __len = _Traits::length(__str);
+ if (__pad_and_output(_I(__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> _I;
+ 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(_I(__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> _I;
+ size_t __len = _Traits::length(__str);
+ if (__pad_and_output(_I(__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> _I;
+ size_t __len = _Traits::length((const char*)__str);
+ if (__pad_and_output(_I(__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> _I;
+ size_t __len = _Traits::length((const char*)__str);
+ if (__pad_and_output(_I(__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> _O;
+ _O __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> _O;
+ _O __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 __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> _I;
+ size_t __len = __str.size();
+ if (__pad_and_output(_I(__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 _Y>
+inline _LIBCPP_INLINE_VISIBILITY
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Y> 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/include/queue b/include/queue
new file mode 100644
index 000000000000..e05ab8f8b0ff
--- /dev/null
+++ b/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/include/random b/include/random
new file mode 100644
index 000000000000..c5c33c0fb323
--- /dev/null
+++ b/include/random
@@ -0,0 +1,6601 @@
+// -*- 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>
+
+#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 _M,
+ bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_M-__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 _A, unsigned long long _C, unsigned long long _M>
+struct __lce_ta<_A, _C, _M, 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>(_A);
+ const result_type __c = static_cast<result_type>(_C);
+ const result_type __m = static_cast<result_type>(_M);
+ // 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(~0), true>
+{
+ typedef unsigned result_type;
+ _LIBCPP_INLINE_VISIBILITY
+ static result_type next(result_type __x)
+ {
+ const result_type __a = static_cast<result_type>(_A);
+ const result_type __m = static_cast<result_type>(_M);
+ // 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(~0), false>
+{
+ typedef unsigned result_type;
+ _LIBCPP_INLINE_VISIBILITY
+ static result_type next(result_type __x)
+ {
+ const result_type __a = static_cast<result_type>(_A);
+ const result_type __c = static_cast<result_type>(_C);
+ const result_type __m = static_cast<result_type>(_M);
+ return (__a * __x + __c) % __m;
+ }
+};
+
+template <unsigned long long _A, unsigned long long _C>
+struct __lce_ta<_A, _C, 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>(_A);
+ const result_type __c = static_cast<result_type>(_C);
+ 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 _U, _U _A, _U _C, _U _N>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const linear_congruential_engine<_U, _A, _C, _N>&);
+
+template <class _CharT, class _Traits,
+ class _U, _U _A, _U _C, _U _N>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ linear_congruential_engine<_U, _A, _C, _N>& __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 _M = 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> explicit linear_congruential_engine(_Sseq& __q,
+ _LIBCPP_INLINE_VISIBILITY
+ 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, _M>::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 _U, _U _A, _U _C, _U _N>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const linear_congruential_engine<_U, _A, _C, _N>&);
+
+ template <class _CharT, class _Traits,
+ class _U, _U _A, _U _C, _U _N>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ linear_congruential_engine<_U, _A, _C, _N>& __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 _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+bool
+operator==(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y);
+
+template <class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+bool
+operator!=(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y);
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x);
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __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> explicit mersenne_twister_engine(_Sseq& __q,
+ _LIBCPP_INLINE_VISIBILITY
+ 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 _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+ friend
+ bool
+ operator==(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y);
+
+ template <class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+ friend
+ bool
+ operator!=(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y);
+
+ template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x);
+
+ template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __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 __x) {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 __x) {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 _Y = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask);
+ const size_t __k = (__i_ + __m) % __n;
+ __x_[__i_] = __x_[__k] ^ __rshift<1>(_Y) ^ (__a * (_Y & 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 _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+bool
+operator==(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y)
+{
+ if (__x.__i_ == __y.__i_)
+ return _VSTD::equal(__x.__x_, __x.__x_ + _N, __y.__x_);
+ if (__x.__i_ == 0 || __y.__i_ == 0)
+ {
+ size_t __j = _VSTD::min(_N - __x.__i_, _N - __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_ + _N, __y.__x_);
+ return _VSTD::equal(__x.__x_, __x.__x_ + (_N - __j), __y.__x_ + __j);
+ }
+ if (__x.__i_ < __y.__i_)
+ {
+ size_t __j = _N - __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_ + _N,
+ __y.__x_))
+ return false;
+ return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
+ __y.__x_ + (_N - (__x.__i_ + __j)));
+ }
+ size_t __j = _N - __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_ + _N,
+ __x.__x_))
+ return false;
+ return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
+ __x.__x_ + (_N - (__y.__i_ + __j)));
+}
+
+template <class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __y)
+{
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __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 < _N; ++__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 _W, size_t _N, size_t _M, size_t _R,
+ _UI _A, size_t _U, _UI _D, size_t _S,
+ _UI _B, size_t _T, _UI _C, size_t _L, _UI _F>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ mersenne_twister_engine<_UI, _W, _N, _M, _R, _A, _U, _D, _S,
+ _B, _T, _C, _L, _F>& __x)
+{
+ __save_flags<_CharT, _Traits> _(__is);
+ __is.flags(ios_base::dec | ios_base::skipws);
+ _UI __t[_N];
+ for (size_t __i = 0; __i < _N; ++__i)
+ __is >> __t[__i];
+ if (!__is.fail())
+ {
+ for (size_t __i = 0; __i < _N; ++__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 _W, size_t _S, size_t _R>
+bool
+operator==(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y);
+
+template<class _UI, size_t _W, size_t _S, size_t _R>
+bool
+operator!=(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y);
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _S, size_t _R>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x);
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _S, size_t _R>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_engine<_UI, _W, _S, _R>& __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> explicit subtract_with_carry_engine(_Sseq& __q,
+ _LIBCPP_INLINE_VISIBILITY
+ 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 _W, size_t _S, size_t _R>
+ friend
+ bool
+ operator==(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y);
+
+ template<class _UI, size_t _W, size_t _S, size_t _R>
+ friend
+ bool
+ operator!=(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y);
+
+ template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _S, size_t _R>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x);
+
+ template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _S, size_t _R>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_engine<_UI, _W, _S, _R>& __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 _W, size_t _S, size_t _R>
+bool
+operator==(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y)
+{
+ if (__x.__c_ != __y.__c_)
+ return false;
+ if (__x.__i_ == __y.__i_)
+ return _VSTD::equal(__x.__x_, __x.__x_ + _R, __y.__x_);
+ if (__x.__i_ == 0 || __y.__i_ == 0)
+ {
+ size_t __j = _VSTD::min(_R - __x.__i_, _R - __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_ + _R, __y.__x_);
+ return _VSTD::equal(__x.__x_, __x.__x_ + (_R - __j), __y.__x_ + __j);
+ }
+ if (__x.__i_ < __y.__i_)
+ {
+ size_t __j = _R - __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_ + _R,
+ __y.__x_))
+ return false;
+ return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_,
+ __y.__x_ + (_R - (__x.__i_ + __j)));
+ }
+ size_t __j = _R - __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_ + _R,
+ __x.__x_))
+ return false;
+ return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_,
+ __x.__x_ + (_R - (__y.__i_ + __j)));
+}
+
+template<class _UI, size_t _W, size_t _S, size_t _R>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __x,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __y)
+{
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits,
+ class _UI, size_t _W, size_t _S, size_t _R>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_engine<_UI, _W, _S, _R>& __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 < _R; ++__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 _W, size_t _S, size_t _R>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_engine<_UI, _W, _S, _R>& __x)
+{
+ __save_flags<_CharT, _Traits> _(__is);
+ __is.flags(ios_base::dec | ios_base::skipws);
+ _UI __t[_R+1];
+ for (size_t __i = 0; __i < _R+1; ++__i)
+ __is >> __t[__i];
+ if (!__is.fail())
+ {
+ for (size_t __i = 0; __i < _R; ++__i)
+ __x.__x_[__i] = __t[__i];
+ __x.__c_ = __t[_R];
+ __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 _P, size_t _R>
+ friend
+ bool
+ operator==(
+ const discard_block_engine<_Eng, _P, _R>& __x,
+ const discard_block_engine<_Eng, _P, _R>& __y);
+
+ template<class _Eng, size_t _P, size_t _R>
+ friend
+ bool
+ operator!=(
+ const discard_block_engine<_Eng, _P, _R>& __x,
+ const discard_block_engine<_Eng, _P, _R>& __y);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _P, size_t _R>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const discard_block_engine<_Eng, _P, _R>& __x);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _P, size_t _R>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ discard_block_engine<_Eng, _P, _R>& __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 _P, size_t _R>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(const discard_block_engine<_Eng, _P, _R>& __x,
+ const discard_block_engine<_Eng, _P, _R>& __y)
+{
+ return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_;
+}
+
+template<class _Eng, size_t _P, size_t _R>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(const discard_block_engine<_Eng, _P, _R>& __x,
+ const discard_block_engine<_Eng, _P, _R>& __y)
+{
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits,
+ class _Eng, size_t _P, size_t _R>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const discard_block_engine<_Eng, _P, _R>& __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 _P, size_t _R>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ discard_block_engine<_Eng, _P, _R>& __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 _W, size_t _M>
+ class __get_n
+ {
+ static const size_t _Dt = numeric_limits<_UI>::digits;
+ static const size_t _N = _W / _M + (_W % _M != 0);
+ static const size_t _W0 = _W / _N;
+ static const _UI _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0;
+ public:
+ static const size_t value = _R0 - _Y0 > _Y0 / _N ? _N + 1 : _N;
+ };
+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 _R = _Engine::_Max - _Engine::_Min
+ + _Working_result_type(1);
+ static const size_t __m = __log2<_Working_result_type, _R>::value;
+ static const size_t __n = __get_n<_Working_result_type, _R, __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 :
+ (_R >> __w0) << __w0;
+ static const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 :
+ (_R >> (__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> explicit independent_bits_engine(_Sseq& __q,
+ _LIBCPP_INLINE_VISIBILITY
+ 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, _R != 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 _W, class _UI>
+ friend
+ bool
+ operator==(
+ const independent_bits_engine<_Eng, _W, _UI>& __x,
+ const independent_bits_engine<_Eng, _W, _UI>& __y);
+
+ template<class _Eng, size_t _W, class _UI>
+ friend
+ bool
+ operator!=(
+ const independent_bits_engine<_Eng, _W, _UI>& __x,
+ const independent_bits_engine<_Eng, _W, _UI>& __y);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _W, class _UI>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const independent_bits_engine<_Eng, _W, _UI>& __x);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _W, class _UI>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ independent_bits_engine<_Eng, _W, _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 __x) {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 _S = 0;
+ for (size_t __k = 0; __k < __n0; ++__k)
+ {
+ _Engine_result_type __u;
+ do
+ {
+ __u = __e_() - _Engine::min();
+ } while (__u >= __y0);
+ _S = static_cast<result_type>(__lshift<__w0>(_S) + (__u & __mask0));
+ }
+ for (size_t __k = __n0; __k < __n; ++__k)
+ {
+ _Engine_result_type __u;
+ do
+ {
+ __u = __e_() - _Engine::min();
+ } while (__u >= __y1);
+ _S = static_cast<result_type>(__lshift<__w0+1>(_S) + (__u & __mask1));
+ }
+ return _S;
+}
+
+template<class _Eng, size_t _W, class _UI>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator==(
+ const independent_bits_engine<_Eng, _W, _UI>& __x,
+ const independent_bits_engine<_Eng, _W, _UI>& __y)
+{
+ return __x.base() == __y.base();
+}
+
+template<class _Eng, size_t _W, class _UI>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(
+ const independent_bits_engine<_Eng, _W, _UI>& __x,
+ const independent_bits_engine<_Eng, _W, _UI>& __y)
+{
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits,
+ class _Eng, size_t _W, class _UI>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const independent_bits_engine<_Eng, _W, _UI>& __x)
+{
+ return __os << __x.base();
+}
+
+template <class _CharT, class _Traits,
+ class _Eng, size_t _W, class _UI>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ independent_bits_engine<_Eng, _W, _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 _N, uint64_t _D>
+class __uratio
+{
+ static_assert(_D != 0, "__uratio divide by 0");
+ static const uint64_t __gcd = __ugcd<_N, _D>::value;
+public:
+ static const uint64_t num = _N / __gcd;
+ static const uint64_t den = _D / __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 _R = _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> explicit shuffle_order_engine(_Sseq& __q,
+ _LIBCPP_INLINE_VISIBILITY
+ 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, _R != 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 _K>
+ friend
+ bool
+ operator==(
+ const shuffle_order_engine<_Eng, _K>& __x,
+ const shuffle_order_engine<_Eng, _K>& __y);
+
+ template<class _Eng, size_t _K>
+ friend
+ bool
+ operator!=(
+ const shuffle_order_engine<_Eng, _K>& __x,
+ const shuffle_order_engine<_Eng, _K>& __y);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _K>
+ friend
+ basic_ostream<_CharT, _Traits>&
+ operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const shuffle_order_engine<_Eng, _K>& __x);
+
+ template <class _CharT, class _Traits,
+ class _Eng, size_t _K>
+ friend
+ basic_istream<_CharT, _Traits>&
+ operator>>(basic_istream<_CharT, _Traits>& __is,
+ shuffle_order_engine<_Eng, _K>& __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, _R>());}
+
+ _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 _N, uint64_t _D>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if
+ <
+ (__uratio<_N, _D>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)),
+ result_type
+ >::type
+ __eval(__uratio<_N, _D>)
+ {return __evalf<__uratio<_N, _D>::num, __uratio<_N, _D>::den>();}
+
+ template <uint64_t _N, uint64_t _D>
+ _LIBCPP_INLINE_VISIBILITY
+ typename enable_if
+ <
+ __uratio<_N, _D>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min),
+ result_type
+ >::type
+ __eval(__uratio<_N, _D>)
+ {
+ const size_t __j = static_cast<size_t>(__uratio<_N, _D>::num * (_Y_ - _Min)
+ / __uratio<_N, _D>::den);
+ _Y_ = _V_[__j];
+ _V_[__j] = __e_();
+ return _Y_;
+ }
+
+ template <uint64_t __n, uint64_t __d>
+ _LIBCPP_INLINE_VISIBILITY
+ result_type __evalf()
+ {
+ const double _F = __d == 0 ?
+ __n / (2. * 0x8000000000000000ull) :
+ __n / (double)__d;
+ const size_t __j = static_cast<size_t>(_F * (_Y_ - _Min));
+ _Y_ = _V_[__j];
+ _V_[__j] = __e_();
+ return _Y_;
+ }
+};
+
+template<class _Eng, size_t _K>
+bool
+operator==(
+ const shuffle_order_engine<_Eng, _K>& __x,
+ const shuffle_order_engine<_Eng, _K>& __y)
+{
+ return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _K, __y._V_) &&
+ __x.__e_ == __y.__e_;
+}
+
+template<class _Eng, size_t _K>
+inline _LIBCPP_INLINE_VISIBILITY
+bool
+operator!=(
+ const shuffle_order_engine<_Eng, _K>& __x,
+ const shuffle_order_engine<_Eng, _K>& __y)
+{
+ return !(__x == __y);
+}
+
+template <class _CharT, class _Traits,
+ class _Eng, size_t _K>
+basic_ostream<_CharT, _Traits>&
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+ const shuffle_order_engine<_Eng, _K>& __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 < _K; ++__i)
+ __os << __sp << __x._V_[__i];
+ return __os << __sp << __x._Y_;
+}
+
+template <class _CharT, class _Traits,
+ class _Eng, size_t _K>
+basic_istream<_CharT, _Traits>&
+operator>>(basic_istream<_CharT, _Traits>& __is,
+ shuffle_order_engine<_Eng, _K>& __x)
+{
+ typedef typename shuffle_order_engine<_Eng, _K>::result_type result_type;
+ __save_flags<_CharT, _Traits> _(__is);
+ __is.flags(ios_base::dec | ios_base::skipws);
+ _Eng __e;
+ result_type _V[_K+1];
+ __is >> __e;
+ for (size_t __i = 0; __i < _K+1; ++__i)
+ __is >> _V[__i];
+ if (!__is.fail())
+ {
+ __x.__e_ = __e;
+ for (size_t __i = 0; __i < _K; ++__i)
+ __x._V_[__i] = _V[__i];
+ __x._Y_ = _V[_K];
+ }
+ 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 const/*expr*/ result_type min() { return _Min;}
+ _LIBCPP_INLINE_VISIBILITY
+ static const/*expr*/ 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 _T(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 * _T(__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 * _T(__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 * _T(__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 * _T(__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 _R = _URNG::_Max - _URNG::_Min + _RealType(1);
+ _RealType __base = _R;
+ _RealType _S = __g() - _URNG::_Min;
+ for (size_t __i = 1; __i < __k; ++__i, __base *= _R)
+ _S += (__g() - _URNG::_Min) * __base;
+ return _S / __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 _U;
+ if (_V_hot_)
+ {
+ _V_hot_ = false;
+ _U = _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 _F = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s);
+ _V_ = __v * _F;
+ _V_hot_ = true;
+ _U = __u * _F;
+ }
+ return _U * __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 _V = 0;
+ bool _V_hot = false;
+ __is >> __mean >> __stddev >> _V_hot;
+ if (_V_hot)
+ __is >> _V;
+ if (!__is.fail())
+ {
+ __x.param(param_type(__mean, __stddev));
+ __x._V_hot_ = _V_hot;
+ __x._V_ = _V;
+ }
+ 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 _S = 0;
+ for (size_t __i = 0; __i < __areas_.size(); ++__i)
+ {
+ __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) *
+ (__b_[__i+1] - __b_[__i]) * .5;
+ _S += __areas_[__i];
+ }
+ for (size_t __i = __areas_.size(); __i > 1;)
+ {
+ --__i;
+ __areas_[__i] = __areas_[__i-1] / _S;
+ }
+ __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] /= _S;
+}
+
+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/include/ratio b/include/ratio
new file mode 100644
index 000000000000..654cb3312e94
--- /dev/null
+++ b/include/ratio
@@ -0,0 +1,485 @@
+// -*- 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>
+
+#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 _Q>
+struct __ratio_less1<_R1, _R2, _Odd, _Q, 0, _Q, 0>
+{
+ static const bool value = false;
+};
+
+template <class _R1, class _R2, bool _Odd, intmax_t _Q, intmax_t _M2>
+struct __ratio_less1<_R1, _R2, _Odd, _Q, 0, _Q, _M2>
+{
+ static const bool value = !_Odd;
+};
+
+template <class _R1, class _R2, bool _Odd, intmax_t _Q, intmax_t _M1>
+struct __ratio_less1<_R1, _R2, _Odd, _Q, _M1, _Q, 0>
+{
+ static const bool value = _Odd;
+};
+
+template <class _R1, class _R2, bool _Odd, intmax_t _Q, intmax_t _M1,
+ intmax_t _M2>
+struct __ratio_less1<_R1, _R2, _Odd, _Q, _M1, _Q, _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/include/regex b/include/regex
new file mode 100644
index 000000000000..048fbefc9e9c
--- /dev/null
+++ b/include/regex
@@ -0,0 +1,6415 @@
+// -*- 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>
+
+#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 _B, class _A, class _C, class _T>
+ friend
+ bool
+ regex_search(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
+ regex_constants::match_flag_type);
+
+ template <class _A, class _C, class _T>
+ friend
+ bool
+ regex_search(const _C*, const _C*, match_results<const _C*, _A>&,
+ const basic_regex<_C, _T>&, regex_constants::match_flag_type);
+
+ template <class _B, class _C, class _T>
+ friend
+ bool
+ regex_search(_B, _B, const basic_regex<_C, _T>&,
+ regex_constants::match_flag_type);
+
+ template <class _C, class _T>
+ friend
+ bool
+ regex_search(const _C*, const _C*,
+ const basic_regex<_C, _T>&, regex_constants::match_flag_type);
+
+ template <class _C, class _A, class _T>
+ friend
+ bool
+ regex_search(const _C*, match_results<const _C*, _A>&, const basic_regex<_C, _T>&,
+ regex_constants::match_flag_type);
+
+ template <class _ST, class _SA, class _C, class _T>
+ friend
+ bool
+ regex_search(const basic_string<_C, _ST, _SA>& __s,
+ const basic_regex<_C, _T>& __e,
+ regex_constants::match_flag_type __flags);
+
+ template <class _ST, class _SA, class _A, class _C, class _T>
+ friend
+ bool
+ regex_search(const basic_string<_C, _ST, _SA>& __s,
+ match_results<typename basic_string<_C, _ST, _SA>::const_iterator, _A>&,
+ const basic_regex<_C, _T>& __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 + __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 + __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 + __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 + __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 _B, class _A>
+ _LIBCPP_INLINE_VISIBILITY
+ void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
+ const match_results<_B, _A>& __m, bool __no_update_pos)
+ {
+ _B __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 _B, class _A, class _C, class _T>
+ friend
+ bool
+ regex_match(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
+ regex_constants::match_flag_type);
+
+ template <class _B, class _A>
+ friend
+ bool
+ operator==(const match_results<_B, _A>&, const match_results<_B, _A>&);
+
+ 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;
+ ptrdiff_t __j = 0;
+ ptrdiff_t _N = _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;
+ bool __matched = false;
+ 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 _N = _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 == _N)
+ __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 _N = _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 == _N)
+ __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 _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& __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 _N>
+regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
+ regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
+ const regex_type& __re,
+ const int (&__submatches)[_N],
+ regex_constants::match_flag_type __m)
+ : __position_(__a, __b, __re, __m),
+ _N_(0),
+ __subs_(__submatches, __submatches + _N)
+{
+ __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/include/scoped_allocator b/include/scoped_allocator
new file mode 100644
index 000000000000..cd051020f61c
--- /dev/null
+++ b/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/include/set b/include/set
new file mode 100644
index 000000000000..36d3dd49b9bd
--- /dev/null
+++ b/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/include/sstream b/include/sstream
new file mode 100644
index 000000000000..1b27195f901e
--- /dev/null
+++ b/include/sstream
@@ -0,0 +1,886 @@
+// -*- 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>
+
+#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/include/stack b/include/stack
new file mode 100644
index 000000000000..59906bd89edb
--- /dev/null
+++ b/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/include/stdexcept b/include/stdexcept
new file mode 100644
index 000000000000..ef5de595f032
--- /dev/null
+++ b/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/include/streambuf b/include/streambuf
new file mode 100644
index 000000000000..5dcb597d96fd
--- /dev/null
+++ b/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 __off, ios_base::seekdir __way,
+ ios_base::openmode __which)
+{
+ 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 __sp, ios_base::openmode __which)
+{
+ 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 __c)
+{
+ 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/include/string b/include/string
new file mode 100644
index 000000000000..5f5a347c6340
--- /dev/null
+++ b/include/string
@@ -0,0 +1,3986 @@
+// -*- 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
+
+#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 = 0x1};
+#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_ & ~__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& __str, 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& __c, 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& __x, allocator_type& __y, 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 __pos)
+{
+#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 + __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 + __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
+{
+#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)
+{
+ size_t __r = 0;
+ const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8;
+ const size_t __m = size_t(0xF) << (__sr + 4);
+ for (; __p != __e; ++__p)
+ {
+ __r = (__r << 4) + *__p;
+ size_t __g = __r & __m;
+ __r ^= __g | (__g >> __sr);
+ }
+ return __r;
+}
+
+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/include/strstream b/include/strstream
new file mode 100644
index 000000000000..5eadefd12b90
--- /dev/null
+++ b/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/include/support/win32/limits_win32.h b/include/support/win32/limits_win32.h
new file mode 100644
index 000000000000..671631df2f9c
--- /dev/null
+++ b/include/support/win32/limits_win32.h
@@ -0,0 +1,79 @@
+// -*- C++ -*-
+//===--------------------- support/win32/limits_win32.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_SUPPORT_WIN32_LIMITS_WIN32_H
+#define _LIBCPP_SUPPORT_WIN32_LIMITS_WIN32_H
+
+#if !defined(_MSC_VER)
+#error "This header is MSVC specific, Clang and GCC should not include it"
+#else
+
+#ifndef NOMINMAX
+#define NOMINMAX
+#endif
+#include <windows.h> // ymath.h works correctly
+
+#include <float.h> // limit constants
+
+#define __FLT_MANT_DIG__ FLT_MANT_DIG
+#define __FLT_DIG__ FLT_DIG
+#define __FLT_RADIX__ FLT_RADIX
+#define __FLT_MIN_EXP__ FLT_MIN_EXP
+#define __FLT_MIN_10_EXP__ FLT_MIN_10_EXP
+#define __FLT_MAX_EXP__ FLT_MAX_EXP
+#define __FLT_MAX_10_EXP__ FLT_MAX_10_EXP
+#define __FLT_MIN__ FLT_MIN
+#define __FLT_MAX__ FLT_MAX
+#define __FLT_EPSILON__ FLT_EPSILON
+// predefined by MinGW GCC
+#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
+
+#define __DBL_MANT_DIG__ DBL_MANT_DIG
+#define __DBL_DIG__ DBL_DIG
+#define __DBL_RADIX__ DBL_RADIX
+#define __DBL_MIN_EXP__ DBL_MIN_EXP
+#define __DBL_MIN_10_EXP__ DBL_MIN_10_EXP
+#define __DBL_MAX_EXP__ DBL_MAX_EXP
+#define __DBL_MAX_10_EXP__ DBL_MAX_10_EXP
+#define __DBL_MIN__ DBL_MIN
+#define __DBL_MAX__ DBL_MAX
+#define __DBL_EPSILON__ DBL_EPSILON
+// predefined by MinGW GCC
+#define __DBL_DENORM_MIN__ double(4.94065645841246544177e-324L)
+
+#define __LDBL_MANT_DIG__ LDBL_MANT_DIG
+#define __LDBL_DIG__ LDBL_DIG
+#define __LDBL_RADIX__ LDBL_RADIX
+#define __LDBL_MIN_EXP__ LDBL_MIN_EXP
+#define __LDBL_MIN_10_EXP__ LDBL_MIN_10_EXP
+#define __LDBL_MAX_EXP__ LDBL_MAX_EXP
+#define __LDBL_MAX_10_EXP__ LDBL_MAX_10_EXP
+#define __LDBL_MIN__ LDBL_MIN
+#define __LDBL_MAX__ LDBL_MAX
+#define __LDBL_EPSILON__ LDBL_EPSILON
+// predefined by MinGW GCC
+#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
+
+// __builtin replacements/workarounds
+#include <math.h> // HUGE_VAL
+#include <ymath.h> // internal MSVC header providing the needed functionality
+#define __builtin_huge_val() HUGE_VAL
+#define __builtin_huge_valf() _FInf._Float
+#define __builtin_huge_vall() _LInf._Long_double
+#define __builtin_nan(__dummy) _Nan._Double
+#define __builtin_nanf(__dummy) _FNan._Float
+#define __builtin_nanl(__dummmy) _LNan._Long_double
+#define __builtin_nans(__dummy) _Snan._Double
+#define __builtin_nansf(__dummy) _FSnan._Float
+#define __builtin_nansl(__dummy) _LSnan._Long_double
+
+#endif // _MSC_VER
+
+#endif // _LIBCPP_SUPPORT_WIN32_LIMITS_WIN32_H
diff --git a/include/support/win32/locale_win32.h b/include/support/win32/locale_win32.h
new file mode 100644
index 000000000000..e035420fb582
--- /dev/null
+++ b/include/support/win32/locale_win32.h
@@ -0,0 +1,116 @@
+// -*- C++ -*-
+//===--------------------- support/win32/locale_win32.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_SUPPORT_WIN32_LOCALE_WIN32_H
+#define _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
+
+// ctype mask table defined in msvcrt.dll
+extern "C" unsigned short __declspec(dllimport) _ctype[];
+
+#include "support/win32/support.h"
+#include <memory>
+#include <xlocinfo.h> // _locale_t
+#define locale_t _locale_t
+#define LC_COLLATE_MASK _M_COLLATE
+#define LC_CTYPE_MASK _M_CTYPE
+#define LC_MONETARY_MASK _M_MONETARY
+#define LC_NUMERIC_MASK _M_NUMERIC
+#define LC_TIME_MASK _M_TIME
+#define LC_MESSAGES_MASK _M_MESSAGES
+#define LC_ALL_MASK ( LC_COLLATE_MASK \
+ | LC_CTYPE_MASK \
+ | LC_MESSAGES_MASK \
+ | LC_MONETARY_MASK \
+ | LC_NUMERIC_MASK \
+ | LC_TIME_MASK )
+#define freelocale _free_locale
+// FIXME: base currently unused. Needs manual work to construct the new locale
+locale_t newlocale( int mask, const char * locale, locale_t base );
+locale_t uselocale( locale_t newloc );
+lconv *localeconv_l( locale_t loc );
+size_t mbrlen_l( const char *__restrict__ s, size_t n,
+ mbstate_t *__restrict__ ps, locale_t loc);
+size_t mbsrtowcs_l( wchar_t *__restrict__ dst, const char **__restrict__ src,
+ size_t len, mbstate_t *__restrict__ ps, locale_t loc );
+size_t wcrtomb_l( char *__restrict__ s, wchar_t wc, mbstate_t *__restrict__ ps,
+ locale_t loc);
+size_t mbrtowc_l( wchar_t *__restrict__ pwc, const char *__restrict__ s,
+ size_t n, mbstate_t *__restrict__ ps, locale_t loc);
+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);
+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);
+wint_t btowc_l( int c, locale_t loc );
+int wctob_l( wint_t c, locale_t loc );
+typedef _VSTD::remove_pointer<locale_t>::type __locale_struct;
+typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii;
+_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;
+}
+
+// the *_l functions are prefixed on Windows, only available for msvcr80+, VS2005+
+#include <stdio.h>
+#define mbtowc_l _mbtowc_l
+#define strtoll_l _strtoi64_l
+#define strtoull_l _strtoui64_l
+// FIXME: current msvcrt does not know about long double
+#define strtold_l _strtod_l
+#define islower_l _islower_l
+#define isupper_l _isupper_l
+#define isdigit_l _isdigit_l
+#define isxdigit_l _isxdigit_l
+#define strcoll_l _strcoll_l
+#define strxfrm_l _strxfrm_l
+#define wcscoll_l _wcscoll_l
+#define wcsxfrm_l _wcsxfrm_l
+#define toupper_l _toupper_l
+#define tolower_l _tolower_l
+#define iswspace_l _iswspace_l
+#define iswprint_l _iswprint_l
+#define iswcntrl_l _iswcntrl_l
+#define iswupper_l _iswupper_l
+#define iswlower_l _iswlower_l
+#define iswalpha_l _iswalpha_l
+#define iswdigit_l _iswdigit_l
+#define iswpunct_l _iswpunct_l
+#define iswxdigit_l _iswxdigit_l
+#define towupper_l _towupper_l
+#define towlower_l _towlower_l
+#define strftime_l _strftime_l
+#define sscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ )
+#define vsscanf_l( __s, __l, __f, ...) _sscanf_l( __s, __f, __l, __VA_ARGS__ )
+#define sprintf_l( __s, __l, __f, ... ) _sprintf_l( __s, __f, __l, __VA_ARGS__ )
+#define snprintf_l( __s, __n, __l, __f, ... ) _snprintf_l( __s, __n, __f, __l, __VA_ARGS__ )
+#define vsprintf_l( __s, __l, __f, ... ) _vsprintf_l( __s, __f, __l, __VA_ARGS__ )
+#define vsnprintf_l( __s, __n, __l, __f, ... ) _vsnprintf_l( __s, __n, __f, __l, __VA_ARGS__ )
+int asprintf_l( char **ret, locale_t loc, const char *format, ... );
+int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap );
+
+
+// not-so-pressing FIXME: use locale to determine blank characters
+inline int isblank_l( int c, locale_t /*loc*/ )
+{
+ return ( c == ' ' || c == '\t' );
+}
+inline int iswblank_l( wint_t c, locale_t /*loc*/ )
+{
+ return ( c == L' ' || c == L'\t' );
+}
+
+#ifdef _MSC_VER
+inline int isblank( int c, locale_t /*loc*/ )
+{ return ( c == ' ' || c == '\t' ); }
+inline int iswblank( wint_t c, locale_t /*loc*/ )
+{ return ( c == L' ' || c == L'\t' ); }
+#endif // _MSC_VER
+#endif // _LIBCPP_SUPPORT_WIN32_LOCALE_WIN32_H
diff --git a/include/support/win32/math_win32.h b/include/support/win32/math_win32.h
new file mode 100644
index 000000000000..80eabc1353d6
--- /dev/null
+++ b/include/support/win32/math_win32.h
@@ -0,0 +1,113 @@
+// -*- C++ -*-
+//===---------------------- support/win32/math_win32.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_SUPPORT_WIN32_MATH_WIN32_H
+#define _LIBCPP_SUPPORT_WIN32_MATH_WIN32_H
+
+#if !defined(_MSC_VER)
+#error "This header is MSVC specific, Clang and GCC should not include it"
+#else
+
+#include <math.h>
+
+typedef float float_t;
+typedef double double_t;
+
+_LIBCPP_ALWAYS_INLINE bool isfinite( double num )
+{
+ return _finite(num) != 0;
+}
+_LIBCPP_ALWAYS_INLINE bool isinf( double num )
+{
+ return !isfinite(num) && !_isnan(num);
+}
+_LIBCPP_ALWAYS_INLINE bool isnan( double num )
+{
+ return _isnan(num) != 0;
+}
+_LIBCPP_ALWAYS_INLINE bool isnormal( double num )
+{
+ int class_ = _fpclass(num);
+ return class_ == _FPCLASS_NN || class_ == _FPCLASS_PN;
+}
+
+_LIBCPP_ALWAYS_INLINE bool isgreater( double x, double y )
+{
+ if(_fpclass(x) == _FPCLASS_SNAN || _fpclass(y) == _FPCLASS_SNAN) return false;
+ else return x > y;
+}
+
+_LIBCPP_ALWAYS_INLINE bool isgreaterequal( double x, double y )
+{
+ if(_fpclass(x) == _FPCLASS_SNAN || _fpclass(y) == _FPCLASS_SNAN) return false;
+ else return x >= y;
+}
+
+_LIBCPP_ALWAYS_INLINE bool isless( double x, double y )
+{
+ if(_fpclass(x) == _FPCLASS_SNAN || _fpclass(y) == _FPCLASS_SNAN) return false;
+ else return x < y;
+}
+
+_LIBCPP_ALWAYS_INLINE bool islessequal( double x, double y )
+{
+ if(::_fpclass(x) == _FPCLASS_SNAN || ::_fpclass(y) == _FPCLASS_SNAN) return false;
+ else return x <= y;
+}
+
+_LIBCPP_ALWAYS_INLINE bool islessgreater( double x, double y )
+{
+ if(::_fpclass(x) == _FPCLASS_SNAN || ::_fpclass(y) == _FPCLASS_SNAN) return false;
+ else return x < y || x > y;
+}
+
+_LIBCPP_ALWAYS_INLINE bool isunordered( double x, double y )
+{
+ return isnan(x) || isnan(y);
+}
+_LIBCPP_ALWAYS_INLINE bool signbit( double num )
+{
+ switch(_fpclass(num))
+ {
+ case _FPCLASS_SNAN:
+ case _FPCLASS_QNAN:
+ case _FPCLASS_NINF:
+ case _FPCLASS_NN:
+ case _FPCLASS_ND:
+ case _FPCLASS_NZ:
+ return true;
+ case _FPCLASS_PZ:
+ case _FPCLASS_PD:
+ case _FPCLASS_PN:
+ case _FPCLASS_PINF:
+ return false;
+ }
+ return false;
+}
+_LIBCPP_ALWAYS_INLINE float copysignf( float x, float y )
+{
+ return (signbit (x) != signbit (y) ? - x : x);
+}
+_LIBCPP_ALWAYS_INLINE double copysign( double x, double y )
+{
+ return ::_copysign(x,y);
+}
+_LIBCPP_ALWAYS_INLINE double copysignl( long double x, long double y )
+{
+ return ::_copysignl(x,y);
+}
+_LIBCPP_ALWAYS_INLINE int fpclassify( double num )
+{
+ return _fpclass(num);
+}
+
+#endif // _MSC_VER
+
+#endif // _LIBCPP_SUPPORT_WIN32_MATH_WIN32_H \ No newline at end of file
diff --git a/include/support/win32/support.h b/include/support/win32/support.h
new file mode 100644
index 000000000000..6ffd3d258908
--- /dev/null
+++ b/include/support/win32/support.h
@@ -0,0 +1,92 @@
+// -*- 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.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_SUPPORT_WIN32_SUPPORT_H
+#define _LIBCPP_SUPPORT_WIN32_SUPPORT_H
+
+/*
+ Functions and constants used in libc++ that are missing from the Windows C library.
+ */
+
+#include <__config>
+#include <wchar.h> // mbstate_t
+#include <stdio.h> // _snwprintf
+#define swprintf _snwprintf
+#define vswprintf _vsnwprintf
+#define vfscnaf fscanf
+
+int vasprintf( char **sptr, const char *__restrict fmt , va_list ap );
+int asprintf( char **sptr, const char *__restrict fmt, ...);
+//int vfscanf( FILE *__restrict stream, const char *__restrict format,
+// va_list arg);
+
+size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
+ size_t nmc, size_t len, mbstate_t *__restrict ps );
+size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
+ size_t nwc, size_t len, mbstate_t *__restrict ps );
+
+#if defined(_MSC_VER)
+#define snprintf _snprintf
+
+#include <xlocinfo.h>
+#define atoll _atoi64
+#define strtoll _strtoi64
+#define strtoull _strtoui64
+#define wcstoll _wcstoi64
+#define wcstoull _wcstoui64
+_LIBCPP_ALWAYS_INLINE float strtof( const char *nptr, char **endptr )
+{ return _Stof(nptr, endptr, 0); }
+_LIBCPP_ALWAYS_INLINE double strtod( const char *nptr, char **endptr )
+{ return _Stod(nptr, endptr, 0); }
+_LIBCPP_ALWAYS_INLINE long double strtold( const char *nptr, char **endptr )
+{ return _Stold(nptr, endptr, 0); }
+
+#define _Exit _exit
+
+#ifndef __clang__ // MSVC-based Clang also defines _MSC_VER
+#include <intrin.h>
+#define __builtin_popcount __popcnt
+#define __builtin_popcountl __popcnt
+#define __builtin_popcountll(__i) static_cast<int>(__popcnt64(__i))
+
+_LIBCPP_ALWAYS_INLINE int __builtin_ctz( unsigned int x )
+{
+ DWORD r = 0;
+ _BitScanReverse(&r, x);
+ return static_cast<int>(r);
+}
+// sizeof(long) == sizeof(int) on Windows
+_LIBCPP_ALWAYS_INLINE int __builtin_ctzl( unsigned long x )
+{ return __builtin_ctz( static_cast<int>(x) ); }
+_LIBCPP_ALWAYS_INLINE int __builtin_ctzll( unsigned long long x )
+{
+ DWORD r = 0;
+ _BitScanReverse64(&r, x);
+ return static_cast<int>(r);
+}
+_LIBCPP_ALWAYS_INLINE int __builtin_clz( unsigned int x )
+{
+ DWORD r = 0;
+ _BitScanForward(&r, x);
+ return static_cast<int>(r);
+}
+// sizeof(long) == sizeof(int) on Windows
+_LIBCPP_ALWAYS_INLINE int __builtin_clzl( unsigned long x )
+{ return __builtin_clz( static_cast<int>(x) ); }
+_LIBCPP_ALWAYS_INLINE int __builtin_clzll( unsigned long long x )
+{
+ DWORD r = 0;
+ _BitScanForward64(&r, x);
+ return static_cast<int>(r);
+}
+#endif // !__clang__
+#endif // _MSC_VER
+
+#endif // _LIBCPP_SUPPORT_WIN32_SUPPORT_H \ No newline at end of file
diff --git a/include/system_error b/include/system_error
new file mode 100644
index 000000000000..ea96a66c0dbd
--- /dev/null
+++ b/include/system_error
@@ -0,0 +1,643 @@
+// -*- 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
+struct errc
+{
+enum _ {
+ 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
+};
+
+ _ __v_;
+
+ _LIBCPP_ALWAYS_INLINE
+ errc(_ __v) : __v_(__v) {}
+ _LIBCPP_ALWAYS_INLINE
+ operator int() const {return __v_;}
+
+};
+
+template <>
+struct _LIBCPP_VISIBLE is_error_condition_enum<errc>
+ : true_type { };
+
+template <>
+struct _LIBCPP_VISIBLE is_error_condition_enum<errc::_>
+ : true_type { };
+
+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 _E>
+ _LIBCPP_ALWAYS_INLINE
+ error_condition(_E __e,
+ typename enable_if<is_error_condition_enum<_E>::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 _E>
+ _LIBCPP_ALWAYS_INLINE
+ typename enable_if
+ <
+ is_error_condition_enum<_E>::value,
+ error_condition&
+ >::type
+ operator=(_E __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
+ //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 _E>
+ _LIBCPP_ALWAYS_INLINE
+ error_code(_E __e,
+ typename enable_if<is_error_code_enum<_E>::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 _E>
+ _LIBCPP_ALWAYS_INLINE
+ typename enable_if
+ <
+ is_error_code_enum<_E>::value,
+ error_code&
+ >::type
+ operator=(_E __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
+ //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/include/tgmath.h b/include/tgmath.h
new file mode 100644
index 000000000000..fbe1e8248d7a
--- /dev/null
+++ b/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/include/thread b/include/thread
new file mode 100644
index 000000000000..4db4f61b981b
--- /dev/null
+++ b/include/thread
@@ -0,0 +1,446 @@
+// -*- 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
+{
+ // 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;
+};
+
+template<class _Tp> struct hash;
+
+template<>
+struct _LIBCPP_VISIBLE hash<__thread_id>
+ : public unary_function<__thread_id, size_t>
+{
+ _LIBCPP_INLINE_VISIBILITY
+ size_t operator()(__thread_id __v) const
+ {
+ const size_t* const __p = reinterpret_cast<const size_t*>(&__v);
+ return *__p;
+ }
+};
+
+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 _F, class ..._Args,
+ class = typename enable_if
+ <
+ !is_same<typename decay<_F>::type, thread>::value
+ >::type
+ >
+ explicit thread(_F&& __f, _Args&&... __args);
+#else // _LIBCPP_HAS_NO_VARIADICS
+ template <class _F> explicit thread(_F __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 _F, class ..._Args, size_t ..._Indices>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+__threaad_execute(tuple<_F, _Args...>& __t, __tuple_indices<_Indices...>)
+{
+ __invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
+}
+
+template <class _F>
+void*
+__thread_proxy(void* __vp)
+{
+ __thread_local_data().reset(new __thread_struct);
+ std::unique_ptr<_F> __p(static_cast<_F*>(__vp));
+ typedef typename __make_tuple_indices<tuple_size<_F>::value, 1>::type _Index;
+ __threaad_execute(*__p, _Index());
+ return nullptr;
+}
+
+template <class _F, class ..._Args,
+ class
+ >
+thread::thread(_F&& __f, _Args&&... __args)
+{
+ typedef tuple<typename decay<_F>::type, typename decay<_Args>::type...> _G;
+ _VSTD::unique_ptr<_G> __p(new _G(__decay_copy(_VSTD::forward<_F>(__f)),
+ __decay_copy(_VSTD::forward<_Args>(__args))...));
+ int __ec = pthread_create(&__t_, 0, &__thread_proxy<_G>, __p.get());
+ if (__ec == 0)
+ __p.release();
+ else
+ __throw_system_error(__ec, "thread constructor failed");
+}
+
+#else // _LIBCPP_HAS_NO_VARIADICS
+
+template <class _F>
+void*
+__thread_proxy(void* __vp)
+{
+ __thread_local_data().reset(new __thread_struct);
+ std::unique_ptr<_F> __p(static_cast<_F*>(__vp));
+ (*__p)();
+ return nullptr;
+}
+
+template <class _F>
+thread::thread(_F __f)
+{
+ std::unique_ptr<_F> __p(new _F(__f));
+ int __ec = pthread_create(&__t_, 0, &__thread_proxy<_F>, __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/include/tuple b/include/tuple
new file mode 100644
index 000000000000..cc6792966788
--- /dev/null
+++ b/include/tuple
@@ -0,0 +1,937 @@
+// -*- 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 <memory>
+#include <type_traits>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#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>
+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 ... _B>
+struct __all<_B0, _B...>
+{
+ static const bool value = _B0 && __all<_B...>::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
+ 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...>&);
+ template <size_t _Jp, class ..._Up> friend
+ const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&);
+ template <size_t _Jp, class ..._Up> friend
+ typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&);
+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 _U>
+ _LIBCPP_INLINE_VISIBILITY
+ tuple(array<_U, 0>) {}
+ template <class _Alloc, class _U>
+ _LIBCPP_INLINE_VISIBILITY
+ tuple(allocator_arg_t, const _Alloc&, array<_U, 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)
+{
+ 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)
+{
+ 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)
+{
+ 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 _I>
+struct __tuple_equal
+{
+ template <class _Tp, class _Up>
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _Tp& __x, const _Up& __y)
+ {
+ return __tuple_equal<_I - 1>()(__x, __y) && get<_I-1>(__x) == get<_I-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 _I>
+struct __tuple_less
+{
+ template <class _Tp, class _Up>
+ _LIBCPP_INLINE_VISIBILITY
+ bool operator()(const _Tp& __x, const _Up& __y)
+ {
+ return __tuple_less<_I-1>()(__x, __y) ||
+ (!__tuple_less<_I-1>()(__y, __x) && get<_I-1>(__x) < get<_I-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 _R, 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/include/type_traits b/include/type_traits
new file mode 100644
index 000000000000..90d56df37438
--- /dev/null
+++ b/include/type_traits
@@ -0,0 +1,3082 @@
+// -*- 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 _B, 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
+
+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> {};
+
+// is_polymorphic
+
+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> {};
+
+// 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 decltype(true ? __t() : __u()) 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 decltype(__f() ? __t() : __u()) 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,
+ _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 _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+#if __has_feature(cxx_reference_qualified_functions)
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) &, true, false>
+{
+ typedef _Class& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&, true, false>
+{
+ typedef _Class const& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&, true, false>
+{
+ typedef _Class volatile& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&, true, false>
+{
+ typedef _Class const volatile& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) &&, true, false>
+{
+ typedef _Class&& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const&&, true, false>
+{
+ typedef _Class const&& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) volatile&&, true, false>
+{
+ typedef _Class volatile&& _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __member_pointer_traits_imp<_R (_Class::*)(_Param...) const volatile&&, true, false>
+{
+ typedef _Class const volatile&& _ClassType;
+ typedef _R _ReturnType;
+};
+
+#endif // __has_feature(cxx_reference_qualified_functions)
+
+#else // _LIBCPP_HAS_NO_VARIADICS
+
+template <class _R, class _Class>
+struct __member_pointer_traits_imp<_R (_Class::*)(), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2), true, false>
+{
+ typedef _Class _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class>
+struct __member_pointer_traits_imp<_R (_Class::*)() const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) const, true, false>
+{
+ typedef _Class const _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class>
+struct __member_pointer_traits_imp<_R (_Class::*)() volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) volatile, true, false>
+{
+ typedef _Class volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class>
+struct __member_pointer_traits_imp<_R (_Class::*)() const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+template <class _R, class _Class, class _P0, class _P1, class _P2>
+struct __member_pointer_traits_imp<_R (_Class::*)(_P0, _P1, _P2) const volatile, true, false>
+{
+ typedef _Class const volatile _ClassType;
+ typedef _R _ReturnType;
+};
+
+#endif // _LIBCPP_HAS_NO_VARIADICS
+
+template <class _R, class _Class>
+struct __member_pointer_traits_imp<_R _Class::*, false, true>
+{
+ typedef _Class _ClassType;
+ typedef _R _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 _R, class _Class, class _Tp>
+struct __result_of_mdp<_R _Class::*, _Tp, false>
+{
+ typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type&& type;
+};
+
+template <class _R, class _Class, class _Tp>
+struct __result_of_mdp<_R _Class::*, _Tp, true>
+{
+ typedef typename __apply_cv<_Tp, _R>::type&& type;
+};
+
+template <class _R, class _Class, class _Tp>
+struct __result_of_mp<_R _Class::*, _Tp, false>
+ : public __result_of_mdp<_R _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 _R, class _Class, class _Tp>
+struct __result_of_mdp<_R _Class::*, _Tp, false>
+{
+ typedef typename __apply_cv<decltype(*_VSTD::declval<_Tp>()), _R>::type& type;
+};
+
+template <class _R, class _Class, class _Tp>
+struct __result_of_mdp<_R _Class::*, _Tp, true>
+{
+ typedef typename __apply_cv<_Tp, _R>::type& type;
+};
+
+template <class _R, class _Class, class _Tp>
+struct __result_of_mp<_R _Class::*, _Tp, false>
+ : public __result_of_mdp<_R _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 _R, class... _A1, class... _A2>
+struct __is_constructible<false, _R(_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 _A, size_t _N>
+struct __is_constructible<false, _A[_N]>
+ : public is_constructible<typename remove_all_extents<_A>::type>
+ {};
+
+// Otherwise array types are not constructible by this syntax
+
+template <class _A, size_t _N, class ..._Args>
+struct __is_constructible<false, _A[_N], _Args...>
+ : public false_type
+ {};
+
+// Incomplete array types are not constructible
+
+template <class _A, class ..._Args>
+struct __is_constructible<false, _A[], _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 _A, size_t _N>
+struct __is_constructible0_imp<false, _A[_N]>
+ : public is_constructible<typename remove_all_extents<_A>::type>
+ {};
+
+template <class _A, size_t _N, class _A0>
+struct __is_constructible1_imp<false, _A[_N], _A0>
+ : public false_type
+ {};
+
+template <class _A, size_t _N, class _A0, class _A1>
+struct __is_constructible2_imp<false, _A[_N], _A0, _A1>
+ : public false_type
+ {};
+
+// Incomplete array types are not constructible
+
+template <class _A>
+struct __is_constructible0_imp<false, _A[]>
+ : public false_type
+ {};
+
+template <class _A, class _A0>
+struct __is_constructible1_imp<false, _A[], _A0>
+ : public false_type
+ {};
+
+template <class _A, class _A0, class _A1>
+struct __is_constructible2_imp<false, _A[], _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
+
+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
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&>
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&>
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+#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
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, __is_construct::__nat,
+ __is_construct::__nat>
+#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>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp,
+ __is_construct::__nat>
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, const _Tp&,
+ __is_construct::__nat>
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+template <class _Tp>
+struct _LIBCPP_VISIBLE is_trivially_constructible<_Tp, _Tp&,
+ __is_construct::__nat>
+#if __has_feature(has_trivial_copy) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_copy(_Tp)>
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value>
+#endif
+{
+};
+
+#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
+
+template <class _Tp, class _Arg>
+struct is_trivially_assignable
+ : public false_type {};
+
+template <class _Tp>
+struct is_trivially_assignable<_Tp&, _Tp>
+#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+template <class _Tp>
+struct is_trivially_assignable<_Tp&, _Tp&>
+#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+template <class _Tp>
+struct is_trivially_assignable<_Tp&, const _Tp&>
+#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _Tp>
+struct is_trivially_assignable<_Tp&, _Tp&&>
+#if __has_feature(has_trivial_assign) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ : integral_constant<bool, __has_trivial_assign(_Tp)> {};
+#else
+ : integral_constant<bool, is_scalar<_Tp>::value> {};
+#endif
+
+#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+// 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 ..._T> struct __check_complete;
+
+template <>
+struct __check_complete<>
+{
+};
+
+template <class _H, class _T0, class ..._T>
+struct __check_complete<_H, _T0, _T...>
+ : private __check_complete<_H>,
+ private __check_complete<_T0, _T...>
+{
+};
+
+template <class _H>
+struct __check_complete<_H, _H>
+ : private __check_complete<_H>
+{
+};
+
+template <class _T>
+struct __check_complete<_T>
+{
+ static_assert(sizeof(_T) > 0, "Type must be complete.");
+};
+
+template <class _T>
+struct __check_complete<_T&>
+ : private __check_complete<_T>
+{
+};
+
+template <class _T>
+struct __check_complete<_T&&>
+ : private __check_complete<_T>
+{
+};
+
+template <class _R, class ..._Param>
+struct __check_complete<_R (*)(_Param...)>
+ : private __check_complete<_Param...>
+{
+};
+
+template <class _R, class ..._Param>
+struct __check_complete<_R (_Param...)>
+ : private __check_complete<_Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...)>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) volatile>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const volatile>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+#if __has_feature(cxx_reference_qualified_functions)
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) &>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) volatile&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const volatile&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) &&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const&&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) volatile&&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+template <class _R, class _Class, class ..._Param>
+struct __check_complete<_R (_Class::*)(_Param...) const volatile&&>
+ : private __check_complete<_Class, _Param...>
+{
+};
+
+#endif
+
+template <class _R, class _Class>
+struct __check_complete<_R _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 _F, class _A0, class ..._Args>
+auto
+__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args)
+ -> decltype((_VSTD::forward<_A0>(__a0).*__f)(_VSTD::forward<_Args>(__args)...));
+
+template <class _F, class _A0, class ..._Args>
+auto
+__invoke(_F&& __f, _A0&& __a0, _Args&& ...__args)
+ -> decltype(((*_VSTD::forward<_A0>(__a0)).*__f)(_VSTD::forward<_Args>(__args)...));
+
+// bullets 3 and 4
+
+template <class _F, class _A0>
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype(_VSTD::forward<_A0>(__a0).*__f);
+
+template <class _F, class _A0>
+auto
+__invoke(_F&& __f, _A0&& __a0)
+ -> decltype((*_VSTD::forward<_A0>(__a0)).*__f);
+
+// bullet 5
+
+template <class _F, class ..._Args>
+auto
+__invoke(_F&& __f, _Args&& ...__args)
+ -> decltype(_VSTD::forward<_F>(__f)(_VSTD::forward<_Args>(__args)...));
+
+// __invokable
+
+template <class _F, class ..._Args>
+struct __invokable_imp
+ : private __check_complete<_F, _Args...>
+{
+ typedef decltype(
+ __invoke(_VSTD::declval<_F>(), _VSTD::declval<_Args>()...)
+ ) type;
+ static const bool value = !is_same<type, __nat>::value;
+};
+
+template <class _F, class ..._Args>
+struct __invokable
+ : public integral_constant<bool,
+ __invokable_imp<_F, _Args...>::value>
+{
+};
+
+// __invoke_of
+
+template <bool _Invokable, class _F, class ..._Args>
+struct __invoke_of_imp // false
+{
+};
+
+template <class _F, class ..._Args>
+struct __invoke_of_imp<true, _F, _Args...>
+{
+ typedef typename __invokable_imp<_F, _Args...>::type type;
+};
+
+template <class _F, class ..._Args>
+struct __invoke_of
+ : public __invoke_of_imp<__invokable<_F, _Args...>::value, _F, _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/include/typeindex b/include/typeindex
new file mode 100644
index 000000000000..398b52880e9d
--- /dev/null
+++ b/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/include/typeinfo b/include/typeinfo
new file mode 100644
index 000000000000..6ffee0f8a3c6
--- /dev/null
+++ b/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/include/unordered_map b/include/unordered_map
new file mode 100644
index 000000000000..56645e09b924
--- /dev/null
+++ b/include/unordered_map
@@ -0,0 +1,1795 @@
+// -*- 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 _Tp, class _Hash, bool = is_empty<_Hash>::value>
+class __unordered_map_hasher
+ : private _Hash
+{
+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 _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 __unordered_map_hasher<_Tp, _Hash, false>
+{
+ _Hash __hash_;
+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 _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>
+class __unordered_map_equal
+ : private _Pred
+{
+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 _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 __unordered_map_equal<_Tp, _Pred, false>
+{
+ _Pred __pred_;
+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 _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) _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<__value_type, hasher> __hasher;
+ typedef __unordered_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> _D;
+ typedef unique_ptr<__node, _D> __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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ pair<iterator, bool> insert(_P&& __x)
+ {return __table_.__insert_unique(_VSTD::forward<_P>(__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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(const_iterator, _P&& __x)
+ {return insert(_VSTD::forward<_P>(__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), _D(__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), _D(__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), _D(__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<__value_type, hasher> __hasher;
+ typedef __unordered_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> _D;
+ typedef unique_ptr<__node, _D> __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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(_P&& __x)
+ {return __table_.__insert_multi(_VSTD::forward<_P>(__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 _P,
+ class = typename enable_if<is_constructible<value_type, _P>::value>::type>
+ _LIBCPP_INLINE_VISIBILITY
+ iterator insert(const_iterator __p, _P&& __x)
+ {return __table_.__insert_multi(__p.__i_, _VSTD::forward<_P>(__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), _D(__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), _D(__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/include/unordered_set b/include/unordered_set
new file mode 100644
index 000000000000..279e90723d65
--- /dev/null
+++ b/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/include/utility b/include/utility
new file mode 100644
index 000000000000..dd9ff33d7128
--- /dev/null
+++ b/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 _N>
+inline _LIBCPP_INLINE_VISIBILITY
+void
+swap(_Tp (&__a)[_N], _Tp (&__b)[_N]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
+{
+ _VSTD::swap_ranges(__a, __a + _N, __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, size_t... _I1, size_t... _I2>
+ _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/include/valarray b/include/valarray
new file mode 100644
index 000000000000..5d3154cc9f8a
--- /dev/null
+++ b/include/valarray
@@ -0,0 +1,4773 @@
+// -*- 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>
+
+#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 _F>
+struct __apply_expr : unary_function<_Tp, _Tp>
+{
+private:
+ _F __f_;
+public:
+ _LIBCPP_INLINE_VISIBILITY
+ explicit __apply_expr(_F __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 _N = 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_ >> _N);
+ __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _N);
+ __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<size_t>(__j);
+ ptrdiff_t __m = (__sn_ * __i - __ul_) >> _N;
+ 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 __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_(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_(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/include/vector b/include/vector
new file mode 100644
index 000000000000..7f7e3d361b90
--- /dev/null
+++ b/include/vector
@@ -0,0 +1,3144 @@
+// -*- 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>
+
+#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, is_trivially_destructible<value_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& __c, 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& __c, 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& __x, allocator_type& __y, 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
+ 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 _Tp, class _Allocator>
+void
+vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)
+{
+ for (pointer __p = this->__end_; this->__begin_ < __p;)
+ __v.push_front(_VSTD::move_if_noexcept(*--__p));
+ _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_;
+ for (pointer __i = __p; this->__begin_ < __i;)
+ __v.push_front(_VSTD::move_if_noexcept(*--__i));
+ for (pointer __i = __p; __i < this->__end_; ++__i)
+ __v.push_back(_VSTD::move_if_noexcept(*__i));
+ _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> _I;
+ assign(_I(__x.begin()), _I(__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> _I;
+ assign(_I(__c.begin()), _I(__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>
+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
+ {
+ allocator_type& __a = this->__alloc();
+ __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
+ __v.push_back(__x);
+ __swap_out_circular_buffer(__v);
+ }
+}
+
+#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+template <class _Tp, class _Allocator>
+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
+ {
+ allocator_type& __a = this->__alloc();
+ __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
+ __v.push_back(_VSTD::move(__x));
+ __swap_out_circular_buffer(__v);
+ }
+}
+
+#ifndef _LIBCPP_HAS_NO_VARIADICS
+
+template <class _Tp, class _Allocator>
+template <class... _Args>
+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
+ {
+ allocator_type& __a = this->__alloc();
+ __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), __a);
+ __v.emplace_back(_VSTD::forward<_Args>(__args)...);
+ __swap_out_circular_buffer(__v);
+ }
+}
+
+#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& __c, 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& __c, 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& __x, __storage_allocator& __y, 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/src/algorithm.cpp b/src/algorithm.cpp
new file mode 100644
index 000000000000..6d5cf7c0bc81
--- /dev/null
+++ b/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/src/bind.cpp b/src/bind.cpp
new file mode 100644
index 000000000000..cab0b7c03a91
--- /dev/null
+++ b/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/src/chrono.cpp b/src/chrono.cpp
new file mode 100644
index 000000000000..416b95013ef2
--- /dev/null
+++ b/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 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/src/condition_variable.cpp b/src/condition_variable.cpp
new file mode 100644
index 000000000000..ca1dca3280e9
--- /dev/null
+++ b/src/condition_variable.cpp
@@ -0,0 +1,70 @@
+//===-------------------- 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()
+{
+ int e = pthread_cond_destroy(&__cv_);
+// assert(e == 0);
+}
+
+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/src/debug.cpp b/src/debug.cpp
new file mode 100644
index 000000000000..8b660f5f39ab
--- /dev/null
+++ b/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) % (__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 > __cend_ - __cbeg_)
+ {
+ size_t nc = __next_prime(2*(__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) % (__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) % (__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) % (__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) % (__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) % (__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) % (__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) % (__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) % (__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*(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 > __iend_ - __ibeg_)
+ {
+ size_t nc = __next_prime(2*(__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) % (__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) % (__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, (end_ - r)*sizeof(__i_node*));
+}
+
+_LIBCPP_END_NAMESPACE_STD
diff --git a/src/exception.cpp b/src/exception.cpp
new file mode 100644
index 000000000000..26d97a960825
--- /dev/null
+++ b/src/exception.cpp
@@ -0,0 +1,206 @@
+//===------------------------ 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;
+ 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
+ #define HAVE_DEPENDENT_EH_ABI 1
+#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__
+
+#ifndef LIBCXXRT
+// libcxxrt provides implementations of these functions itself.
+std::unexpected_handler
+std::set_unexpected(std::unexpected_handler func) _NOEXCEPT
+{
+ return __sync_lock_test_and_set(&__unexpected_handler, func);
+}
+
+std::unexpected_handler
+std::get_unexpected() _NOEXCEPT
+{
+ return __sync_fetch_and_add(&__unexpected_handler, (std::unexpected_handler)0);
+}
+
+_ATTRIBUTE(noreturn)
+void
+std::unexpected()
+{
+ (*std::get_unexpected())();
+ // unexpected handler should not return
+ std::terminate();
+}
+
+std::terminate_handler
+std::set_terminate(std::terminate_handler func) _NOEXCEPT
+{
+ return __sync_lock_test_and_set(&__terminate_handler, func);
+}
+
+std::terminate_handler
+std::get_terminate() _NOEXCEPT
+{
+ return __sync_fetch_and_add(&__terminate_handler, (std::terminate_handler)0);
+}
+
+_ATTRIBUTE(noreturn)
+void
+std::terminate() _NOEXCEPT
+{
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ try
+ {
+#endif // _LIBCPP_NO_EXCEPTIONS
+ (*std::get_terminate())();
+ // handler should not return
+ ::abort ();
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ }
+ catch (...)
+ {
+ // handler should not throw exception
+ ::abort ();
+ }
+#endif // _LIBCPP_NO_EXCEPTIONS
+}
+#endif // LIBCXXRT
+
+bool std::uncaught_exception() _NOEXCEPT
+{
+#if __APPLE__
+ // on Darwin, there is a helper function so __cxa_get_globals is private
+ return __cxxabiapple::__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__
+}
+
+namespace std
+{
+
+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";
+}
+
+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_);
+}
+
+} // std
+
+std::exception_ptr std::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());
+ std::exception_ptr ptr;
+ ptr.__ptr_ = __cxa_current_primary_exception();
+ return ptr;
+#else // __APPLE__
+ #warning exception_ptr not yet implemented
+ ::abort();
+#endif // __APPLE__
+}
+
+void std::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__
+}
diff --git a/src/future.cpp b/src/future.cpp
new file mode 100644
index 000000000000..ff59110593b2
--- /dev/null
+++ b/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 (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_ & deferred)
+ {
+ __state_ &= ~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/src/hash.cpp b/src/hash.cpp
new file mode 100644
index 000000000000..728b9bd3831b
--- /dev/null
+++ b/src/hash.cpp
@@ -0,0 +1,559 @@
+//===-------------------------- 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 = 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/src/ios.cpp b/src/ios.cpp
new file mode 100644
index 000000000000..80917a046d2f
--- /dev/null
+++ b/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/src/iostream.cpp b/src/iostream.cpp
new file mode 100644
index 000000000000..157c3977d478
--- /dev/null
+++ b/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/src/locale.cpp b/src/locale.cpp
new file mode 100644
index 000000000000..b90e163a02a9
--- /dev/null
+++ b/src/locale.cpp
@@ -0,0 +1,5829 @@
+//===------------------------- 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.
+//
+//===----------------------------------------------------------------------===//
+
+#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;
+}
+
+}
+
+class _LIBCPP_HIDDEN locale::__imp
+ : public facet
+{
+ enum {N = 28};
+ string name_;
+ vector<facet*, __sso_allocator<facet*, N> > facets_;
+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 id < facets_.size() && facets_[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);
+};
+
+locale::__imp::__imp(size_t refs)
+ : facet(refs),
+ name_("C"),
+ facets_(N)
+{
+ facets_.clear();
+ install(&make<_VSTD::collate<char> >(1));
+ install(&make<_VSTD::collate<wchar_t> >(1));
+ install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1));
+ install(&make<_VSTD::ctype<wchar_t> >(1));
+ install(&make<codecvt<char, char, mbstate_t> >(1));
+ install(&make<codecvt<wchar_t, char, mbstate_t> >(1));
+ install(&make<codecvt<char16_t, char, mbstate_t> >(1));
+ install(&make<codecvt<char32_t, char, mbstate_t> >(1));
+ install(&make<numpunct<char> >(1));
+ install(&make<numpunct<wchar_t> >(1));
+ install(&make<num_get<char> >(1));
+ install(&make<num_get<wchar_t> >(1));
+ install(&make<num_put<char> >(1));
+ install(&make<num_put<wchar_t> >(1));
+ install(&make<moneypunct<char, false> >(1));
+ install(&make<moneypunct<char, true> >(1));
+ install(&make<moneypunct<wchar_t, false> >(1));
+ install(&make<moneypunct<wchar_t, true> >(1));
+ install(&make<money_get<char> >(1));
+ install(&make<money_get<wchar_t> >(1));
+ install(&make<money_put<char> >(1));
+ install(&make<money_put<wchar_t> >(1));
+ install(&make<time_get<char> >(1));
+ install(&make<time_get<wchar_t> >(1));
+ install(&make<time_put<char> >(1));
+ install(&make<time_put<wchar_t> >(1));
+ install(&make<_VSTD::messages<char> >(1));
+ install(&make<_VSTD::messages<wchar_t> >(1));
+}
+
+locale::__imp::__imp(const string& name, size_t refs)
+ : facet(refs),
+ name_(name),
+ facets_(N)
+{
+#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)
+ : name_(other.name_),
+ facets_(max<size_t>(N, other.facets_.size()))
+{
+ 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)
+ : name_("*"),
+ facets_(N)
+{
+ 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)
+ : name_("*"),
+ facets_(N)
+{
+ 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)
+ : name_("*"),
+ facets_(max<size_t>(N, other.facets_.size()+1))
+{
+ 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 (id >= facets_.size())
+ facets_.resize(id+1);
+ if (facets_[id])
+ facets_[id]->__release_shared();
+ facets_[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_[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>(1);
+ 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;
+ locale* g = (locale*)&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 = *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) ? _DefaultRuneLocale.__mapupper[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) ? _DefaultRuneLocale.__mapupper[*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) ? _DefaultRuneLocale.__maplower[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) ? _DefaultRuneLocale.__maplower[*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 _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
+ 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 toupper_l(c, __l);
+}
+
+const char*
+ctype_byname<char>::do_toupper(char_type* low, const char_type* high) const
+{
+ for (; low != high; ++low)
+ *low = toupper_l(*low, __l);
+ return low;
+}
+
+char
+ctype_byname<char>::do_tolower(char_type c) const
+{
+ return tolower_l(c, __l);
+}
+
+const char*
+ctype_byname<char>::do_tolower(char_type* low, const char_type* high) const
+{
+ for (; low != high; ++low)
+ *low = 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, 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, fend-frm, 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 > 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, fend-frm, 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, 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 -1:
+ frm_nxt = frm;
+ return error;
+ case -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 > 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, 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 -1:
+ case -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];
+ uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
+ | ((c2 & 0x3F) << 6)
+ | (c3 & 0x3F));
+ 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 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > 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 & 0x1F) << 6) | (frm_nxt[1] & 0x3F)) > 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 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > 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;
+ uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18)
+ | ((c2 & 0x3F) << 12)
+ | ((c3 & 0x3F) << 6)
+ | (c4 & 0x3F));
+ if ((((c1 & 0x07) << 18) | ((c2 & 0x3F) << 12) |
+ ((c3 & 0x3F) << 6) | (c4 & 0x3F)) > 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 & 0x1F) << 6) | (frm_nxt[1] & 0x3F)) > 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 & 0x0F) << 12) | ((c2 & 0x3F) << 6) | (c3 & 0x3F)) > 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 == 0)
+ 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 == 0)
+ 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 (*__ig != *__r)
+ {
+ __err = ios_base::failbit;
+ return;
+ }
+ }
+ if (__eg - __ig > 1)
+ ++__ig;
+ }
+ if (0 < *__ig && *__ig < numeric_limits<char>::max())
+ {
+ if (*__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_);
+}
+
+template <>
+string
+__time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct)
+{
+ tm t;
+ 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;
+ int 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;
+}
+
+template <>
+wstring
+__time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
+{
+ tm t;
+ 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 be = 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 i = mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_);
+#else
+ size_t i = __mbsrtowcs_l( wbb, &bb, sizeof(wbuf)/sizeof(wbuf[0]), &mb, __loc_);
+#endif
+ if (i == -1)
+ __throw_runtime_error("locale not supported");
+ wchar_t* wbe = wbb + i;
+ 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;
+ int 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 == -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 == -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 == -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 == -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 == -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 == -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, __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 == -1)
+ __throw_runtime_error("locale not supported");
+ __we = __wb + j;
+}
+
+// moneypunct_byname
+
+static
+void
+__init_pat(money_base::pattern& pat, char cs_precedes, char sep_by_space, char sign_posn)
+{
+ 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);
+ switch (cs_precedes)
+ {
+ case 0:
+ switch (sign_posn)
+ {
+ case 0:
+ pat.field[0] = sign;
+ pat.field[1] = value;
+ pat.field[3] = symbol;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[2] = none;
+ return;
+ case 1:
+ case 2:
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 1:
+ pat.field[0] = sign;
+ pat.field[3] = symbol;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = value;
+ pat.field[2] = none;
+ return;
+ case 1:
+ pat.field[1] = value;
+ pat.field[2] = space;
+ return;
+ case 2:
+ pat.field[1] = space;
+ pat.field[2] = value;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 2:
+ pat.field[0] = value;
+ pat.field[3] = sign;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = none;
+ pat.field[2] = symbol;
+ return;
+ case 1:
+ pat.field[1] = space;
+ pat.field[2] = symbol;
+ return;
+ case 2:
+ pat.field[1] = symbol;
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ pat.field[0] = value;
+ pat.field[3] = symbol;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = none;
+ pat.field[2] = sign;
+ return;
+ case 1:
+ pat.field[1] = space;
+ pat.field[2] = sign;
+ return;
+ case 2:
+ pat.field[1] = sign;
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 4:
+ pat.field[0] = value;
+ pat.field[3] = sign;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = none;
+ pat.field[2] = symbol;
+ return;
+ case 1:
+ pat.field[1] = space;
+ pat.field[2] = symbol;
+ return;
+ case 2:
+ pat.field[1] = symbol;
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case 1:
+ switch (sign_posn)
+ {
+ case 0:
+ pat.field[0] = sign;
+ pat.field[1] = symbol;
+ pat.field[3] = value;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[2] = none;
+ return;
+ case 1:
+ case 2:
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 1:
+ pat.field[0] = sign;
+ pat.field[3] = value;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = symbol;
+ pat.field[2] = none;
+ return;
+ case 1:
+ pat.field[1] = symbol;
+ pat.field[2] = space;
+ return;
+ case 2:
+ pat.field[1] = space;
+ pat.field[2] = symbol;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 2:
+ pat.field[0] = symbol;
+ pat.field[3] = sign;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = none;
+ pat.field[2] = value;
+ return;
+ case 1:
+ pat.field[1] = space;
+ pat.field[2] = value;
+ return;
+ case 2:
+ pat.field[1] = value;
+ pat.field[2] = space;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 3:
+ pat.field[0] = sign;
+ pat.field[3] = value;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = symbol;
+ pat.field[2] = none;
+ return;
+ case 1:
+ pat.field[1] = symbol;
+ pat.field[2] = space;
+ return;
+ case 2:
+ pat.field[1] = space;
+ pat.field[2] = symbol;
+ return;
+ default:
+ break;
+ }
+ break;
+ case 4:
+ pat.field[0] = symbol;
+ pat.field[3] = value;
+ switch (sep_by_space)
+ {
+ case 0:
+ pat.field[1] = sign;
+ pat.field[2] = none;
+ return;
+ case 1:
+ pat.field[1] = sign;
+ pat.field[2] = space;
+ return;
+ case 2:
+ pat.field[1] = space;
+ pat.field[2] = sign;
+ 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 == 0)
+ 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;
+ __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
+ __init_pat(__neg_format_, 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 == 0)
+ 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;
+#if _WIN32
+ __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
+ __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn);
+#else
+ __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn);
+ __init_pat(__neg_format_, 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 == 0)
+ 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 == -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 == -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 == -1)
+ __throw_runtime_error("locale not supported");
+ wbe = wbuf + j;
+ __negative_sign_.assign(wbuf, wbe);
+ }
+ __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
+ __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn);
+}
+
+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 == 0)
+ 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 == -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 == -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 == -1)
+ __throw_runtime_error("locale not supported");
+ wbe = wbuf + j;
+ __negative_sign_.assign(wbuf, wbe);
+ }
+#if _WIN32
+ __init_pat(__pos_format_, lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn);
+ __init_pat(__neg_format_, lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn);
+#else // _WIN32
+ __init_pat(__pos_format_, lc->int_p_cs_precedes, lc->int_p_sep_by_space, lc->int_p_sign_posn);
+ __init_pat(__neg_format_, lc->int_n_cs_precedes, lc->int_n_sep_by_space, lc->int_n_sign_posn);
+#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 class __num_get<char>;
+template class __num_get<wchar_t>;
+
+template class num_put<char>;
+template class num_put<wchar_t>;
+
+template class __num_put<char>;
+template class __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/src/memory.cpp b/src/memory.cpp
new file mode 100644
index 000000000000..cb5e5e7b06ad
--- /dev/null
+++ b/src/memory.cpp
@@ -0,0 +1,168 @@
+//===------------------------ 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))
+ {
+ __add_weak();
+ 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);
+ ptrdiff_t d = p2 - p1;
+ if (d <= space - size)
+ {
+ r = p2;
+ ptr = r;
+ space -= d;
+ }
+ }
+ return r;
+}
+
+_LIBCPP_END_NAMESPACE_STD
diff --git a/src/mutex.cpp b/src/mutex.cpp
new file mode 100644
index 000000000000..16817198b37c
--- /dev/null
+++ b/src/mutex.cpp
@@ -0,0 +1,250 @@
+//===------------------------- 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()
+{
+ int e = pthread_mutex_destroy(&__m_);
+// assert(e == 0);
+}
+
+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/src/new.cpp b/src/new.cpp
new file mode 100644
index 000000000000..1e8ed88dc4c1
--- /dev/null
+++ b/src/new.cpp
@@ -0,0 +1,185 @@
+//===--------------------------- 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>
+ // 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
+#else // __APPLE__
+ static std::new_handler __new_handler;
+#endif
+
+// 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& nothrow) _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);
+}
+
+namespace std
+{
+
+const nothrow_t nothrow = {};
+
+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);
+}
+
+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";
+}
+
+void
+__throw_bad_alloc()
+{
+#ifndef _LIBCPP_NO_EXCEPTIONS
+ throw bad_alloc();
+#endif
+}
+
+} // std
diff --git a/src/random.cpp b/src/random.cpp
new file mode 100644
index 000000000000..eca97bc81943
--- /dev/null
+++ b/src/random.cpp
@@ -0,0 +1,45 @@
+//===-------------------------- 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"
+
+#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/src/regex.cpp b/src/regex.cpp
new file mode 100644
index 000000000000..65e9f886dfb8
--- /dev/null
+++ b/src/regex.cpp
@@ -0,0 +1,315 @@
+//===-------------------------- 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 {
+
+struct collationnames
+{
+ const char* elem_;
+ char char_;
+};
+
+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}
+};
+
+struct classnames
+{
+ const char* elem_;
+ ctype_base::mask mask_;
+};
+
+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/src/stdexcept.cpp b/src/stdexcept.cpp
new file mode 100644
index 000000000000..28917887587e
--- /dev/null
+++ b/src/stdexcept.cpp
@@ -0,0 +1,178 @@
+//===------------------------ 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"
+
+// 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;
+}
+
+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();
+}
+
+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;
+}
+
+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 {}
+
+} // std
diff --git a/src/string.cpp b/src/string.cpp
new file mode 100644
index 000000000000..1f58e3657a89
--- /dev/null
+++ b/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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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)
+ {
+ int n2 = 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(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(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(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(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(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(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(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(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(n2);
+ break;
+ }
+ s.resize(2*s.size());
+ s.resize(s.capacity());
+ }
+ return s;
+}
+
+_LIBCPP_END_NAMESPACE_STD
diff --git a/src/strstream.cpp b/src/strstream.cpp
new file mode 100644
index 000000000000..53139509edfa
--- /dev/null
+++ b/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 = 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_(new_size));
+ else
+ buf = new char[new_size];
+ if (buf == nullptr)
+ return int_type(EOF);
+ memcpy(buf, eback(), 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(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/src/support/win32/locale_win32.cpp b/src/support/win32/locale_win32.cpp
new file mode 100644
index 000000000000..02b5874e2944
--- /dev/null
+++ b/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/src/support/win32/support.cpp b/src/support/win32/support.cpp
new file mode 100644
index 000000000000..9e85077a7ada
--- /dev/null
+++ b/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/src/system_error.cpp b/src/system_error.cpp
new file mode 100644
index 000000000000..763d62c2a0b4
--- /dev/null
+++ b/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/src/thread.cpp b/src/thread.cpp
new file mode 100644
index 000000000000..b07f8f851072
--- /dev/null
+++ b/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
+#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)
+ int 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/src/typeinfo.cpp b/src/typeinfo.cpp
new file mode 100644
index 000000000000..9ca03a183e9c
--- /dev/null
+++ b/src/typeinfo.cpp
@@ -0,0 +1,50 @@
+//===------------------------- 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"
+
+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
+
diff --git a/src/utility.cpp b/src/utility.cpp
new file mode 100644
index 000000000000..7dccffb73e5a
--- /dev/null
+++ b/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/src/valarray.cpp b/src/valarray.cpp
new file mode 100644
index 000000000000..2d8db52ac36b
--- /dev/null
+++ b/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