Created
April 20, 2016 03:35
-
-
Save EricWF/487e5b1de2bb320e93fbb3c9c758b013 to your computer and use it in GitHub Desktop.
Updated patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/include/complex b/include/complex | |
index 565e111..f56138f 100644 | |
--- a/include/complex | |
+++ b/include/complex | |
@@ -1,1517 +1,1523 @@ | |
// -*- 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()); // constexpr in C++14 | |
complex(const complex&); // constexpr in C++14 | |
template<class X> complex(const complex<X>&); // constexpr in C++14 | |
T real() const; // constexpr in C++14 | |
T imag() const; // constexpr in C++14 | |
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>&); // constexpr in C++14 | |
template<class T> bool operator==(const complex<T>&, const T&); // constexpr in C++14 | |
template<class T> bool operator==(const T&, const complex<T>&); // constexpr in C++14 | |
template<class T> bool operator!=(const complex<T>&, const complex<T>&); // constexpr in C++14 | |
template<class T> bool operator!=(const complex<T>&, const T&); // constexpr in C++14 | |
template<class T> bool operator!=(const T&, const complex<T>&); // constexpr in C++14 | |
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>&); // constexpr in C++14 | |
long double real(long double); // constexpr in C++14 | |
double real(double); // constexpr in C++14 | |
template<Integral T> double real(T); // constexpr in C++14 | |
float real(float); // constexpr in C++14 | |
template<class T> T imag(const complex<T>&); // constexpr in C++14 | |
long double imag(long double); // constexpr in C++14 | |
double imag(double); // constexpr in C++14 | |
template<Integral T> double imag(T); // constexpr in C++14 | |
float imag(float); // constexpr in C++14 | |
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_TYPE_VIS_ONLY 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_TYPE_VIS_ONLY complex | |
{ | |
public: | |
typedef _Tp value_type; | |
private: | |
value_type __re_; | |
value_type __im_; | |
public: | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
complex(const value_type& __re = value_type(), const value_type& __im = value_type()) | |
: __re_(__re), __im_(__im) {} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
complex(const complex<_Xp>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type real() const {return __re_;} | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 value_type imag() const {return __im_;} | |
_LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} | |
_LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator= (const value_type& __re) | |
{__re_ = __re; __im_ = value_type(); return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator+=(const value_type& __re) {__re_ += __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator-=(const value_type& __re) {__re_ -= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator*=(const value_type& __re) {__re_ *= __re; __im_ *= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator/=(const value_type& __re) {__re_ /= __re; __im_ /= __re; return *this;} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) | |
{ | |
__re_ = __c.real(); | |
__im_ = __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) | |
{ | |
__re_ += __c.real(); | |
__im_ += __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) | |
{ | |
__re_ -= __c.real(); | |
__im_ -= __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) | |
{ | |
*this = *this * complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) | |
{ | |
*this = *this / complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
}; | |
template<> class _LIBCPP_TYPE_VIS_ONLY complex<double>; | |
template<> class _LIBCPP_TYPE_VIS_ONLY complex<long double>; | |
template<> | |
class _LIBCPP_TYPE_VIS_ONLY complex<float> | |
{ | |
float __re_; | |
float __im_; | |
public: | |
typedef float value_type; | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(float __re = 0.0f, float __im = 0.0f) | |
: __re_(__re), __im_(__im) {} | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit _LIBCPP_CONSTEXPR complex(const complex<double>& __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float real() const {return __re_;} | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR float imag() const {return __im_;} | |
_LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} | |
_LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator= (float __re) | |
{__re_ = __re; __im_ = value_type(); return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator+=(float __re) {__re_ += __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator-=(float __re) {__re_ -= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator*=(float __re) {__re_ *= __re; __im_ *= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator/=(float __re) {__re_ /= __re; __im_ /= __re; return *this;} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) | |
{ | |
__re_ = __c.real(); | |
__im_ = __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) | |
{ | |
__re_ += __c.real(); | |
__im_ += __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) | |
{ | |
__re_ -= __c.real(); | |
__im_ -= __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) | |
{ | |
*this = *this * complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) | |
{ | |
*this = *this / complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
}; | |
template<> | |
class _LIBCPP_TYPE_VIS_ONLY complex<double> | |
{ | |
double __re_; | |
double __im_; | |
public: | |
typedef double value_type; | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(double __re = 0.0, double __im = 0.0) | |
: __re_(__re), __im_(__im) {} | |
+ _LIBCPP_INLINE_VISIBILITY | |
_LIBCPP_CONSTEXPR complex(const complex<float>& __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit _LIBCPP_CONSTEXPR complex(const complex<long double>& __c); | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double real() const {return __re_;} | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR double imag() const {return __im_;} | |
_LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} | |
_LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator= (double __re) | |
{__re_ = __re; __im_ = value_type(); return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator+=(double __re) {__re_ += __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator-=(double __re) {__re_ -= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator*=(double __re) {__re_ *= __re; __im_ *= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator/=(double __re) {__re_ /= __re; __im_ /= __re; return *this;} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) | |
{ | |
__re_ = __c.real(); | |
__im_ = __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) | |
{ | |
__re_ += __c.real(); | |
__im_ += __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) | |
{ | |
__re_ -= __c.real(); | |
__im_ -= __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) | |
{ | |
*this = *this * complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) | |
{ | |
*this = *this / complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
}; | |
template<> | |
class _LIBCPP_TYPE_VIS_ONLY complex<long double> | |
{ | |
long double __re_; | |
long double __im_; | |
public: | |
typedef long double value_type; | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR complex(long double __re = 0.0L, long double __im = 0.0L) | |
: __re_(__re), __im_(__im) {} | |
+ _LIBCPP_INLINE_VISIBILITY | |
_LIBCPP_CONSTEXPR complex(const complex<float>& __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
_LIBCPP_CONSTEXPR complex(const complex<double>& __c); | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double real() const {return __re_;} | |
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR long double imag() const {return __im_;} | |
_LIBCPP_INLINE_VISIBILITY void real(value_type __re) {__re_ = __re;} | |
_LIBCPP_INLINE_VISIBILITY void imag(value_type __im) {__im_ = __im;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator= (long double __re) | |
{__re_ = __re; __im_ = value_type(); return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator+=(long double __re) {__re_ += __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator-=(long double __re) {__re_ -= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator*=(long double __re) {__re_ *= __re; __im_ *= __re; return *this;} | |
_LIBCPP_INLINE_VISIBILITY complex& operator/=(long double __re) {__re_ /= __re; __im_ /= __re; return *this;} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator= (const complex<_Xp>& __c) | |
{ | |
__re_ = __c.real(); | |
__im_ = __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator+=(const complex<_Xp>& __c) | |
{ | |
__re_ += __c.real(); | |
__im_ += __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator-=(const complex<_Xp>& __c) | |
{ | |
__re_ -= __c.real(); | |
__im_ -= __c.imag(); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator*=(const complex<_Xp>& __c) | |
{ | |
*this = *this * complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
template<class _Xp> _LIBCPP_INLINE_VISIBILITY complex& operator/=(const complex<_Xp>& __c) | |
{ | |
*this = *this / complex(__c.real(), __c.imag()); | |
return *this; | |
} | |
}; | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
complex<float>::complex(const complex<double>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
complex<float>::complex(const complex<long double>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
complex<double>::complex(const complex<float>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
complex<double>::complex(const complex<long double>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
complex<long double>::complex(const complex<float>& __c) | |
: __re_(__c.real()), __im_(__c.imag()) {} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_LIBCPP_CONSTEXPR | |
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 _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
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 _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
bool | |
operator==(const complex<_Tp>& __x, const _Tp& __y) | |
{ | |
return __x.real() == __y && __x.imag() == 0; | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
bool | |
operator==(const _Tp& __x, const complex<_Tp>& __y) | |
{ | |
return __x == __y.real() && 0 == __y.imag(); | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
bool | |
operator!=(const complex<_Tp>& __x, const complex<_Tp>& __y) | |
{ | |
return !(__x == __y); | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
bool | |
operator!=(const complex<_Tp>& __x, const _Tp& __y) | |
{ | |
return !(__x == __y); | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
bool | |
operator!=(const _Tp& __x, const complex<_Tp>& __y) | |
{ | |
return !(__x == __y); | |
} | |
// 26.3.7 values: | |
// real | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
_Tp | |
real(const complex<_Tp>& __c) | |
{ | |
return __c.real(); | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
long double | |
real(long double __re) | |
{ | |
return __re; | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
double | |
real(double __re) | |
{ | |
return __re; | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
typename enable_if | |
< | |
is_integral<_Tp>::value, | |
double | |
>::type | |
real(_Tp __re) | |
{ | |
return __re; | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
float | |
real(float __re) | |
{ | |
return __re; | |
} | |
// imag | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
_Tp | |
imag(const complex<_Tp>& __c) | |
{ | |
return __c.imag(); | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
long double | |
imag(long double __re) | |
{ | |
return 0; | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
double | |
imag(double __re) | |
{ | |
return 0; | |
} | |
template<class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
typename enable_if | |
< | |
is_integral<_Tp>::value, | |
double | |
>::type | |
imag(_Tp __re) | |
{ | |
return 0; | |
} | |
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 | |
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)); | |
_Tp __2rsh(sinh(__2r)); | |
if (isinf(__2rsh) && isinf(__d)) | |
return complex<_Tp>(__2rsh > _Tp(0) ? _Tp(1) : _Tp(-1), | |
__2i > _Tp(0) ? _Tp(0) : _Tp(-0.)); | |
return complex<_Tp>(__2rsh/__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 && (__x.imag() == 0 || isnan(__x.imag()))) | |
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()); | |
diff --git a/include/experimental/any b/include/experimental/any | |
index 6037884..4c73249 100644 | |
--- a/include/experimental/any | |
+++ b/include/experimental/any | |
@@ -1,590 +1,592 @@ | |
// -*- C++ -*- | |
//===------------------------------ any -----------------------------------===// | |
// | |
// The LLVM Compiler Infrastructure | |
// | |
// This file is distributed under the University of Illinois Open Source | |
// License. See LICENSE.TXT for details. | |
// | |
//===----------------------------------------------------------------------===// | |
#ifndef _LIBCPP_EXPERIMENTAL_ANY | |
#define _LIBCPP_EXPERIMENTAL_ANY | |
/* | |
experimental/any synopsis | |
namespace std { | |
namespace experimental { | |
inline namespace fundamentals_v1 { | |
class bad_any_cast : public bad_cast | |
{ | |
public: | |
virtual const char* what() const noexcept; | |
}; | |
class any | |
{ | |
public: | |
// 6.3.1 any construct/destruct | |
any() noexcept; | |
any(const any& other); | |
any(any&& other) noexcept; | |
template <class ValueType> | |
any(ValueType&& value); | |
~any(); | |
// 6.3.2 any assignments | |
any& operator=(const any& rhs); | |
any& operator=(any&& rhs) noexcept; | |
template <class ValueType> | |
any& operator=(ValueType&& rhs); | |
// 6.3.3 any modifiers | |
void clear() noexcept; | |
void swap(any& rhs) noexcept; | |
// 6.3.4 any observers | |
bool empty() const noexcept; | |
const type_info& type() const noexcept; | |
}; | |
// 6.4 Non-member functions | |
void swap(any& x, any& y) noexcept; | |
template<class ValueType> | |
ValueType any_cast(const any& operand); | |
template<class ValueType> | |
ValueType any_cast(any& operand); | |
template<class ValueType> | |
ValueType any_cast(any&& operand); | |
template<class ValueType> | |
const ValueType* any_cast(const any* operand) noexcept; | |
template<class ValueType> | |
ValueType* any_cast(any* operand) noexcept; | |
} // namespace fundamentals_v1 | |
} // namespace experimental | |
} // namespace std | |
*/ | |
#include <experimental/__config> | |
#include <memory> | |
#include <new> | |
#include <typeinfo> | |
#include <type_traits> | |
#include <cstdlib> | |
#include <cassert> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_LFTS | |
class _LIBCPP_EXCEPTION_ABI bad_any_cast : public bad_cast | |
{ | |
public: | |
virtual const char* what() const _NOEXCEPT; | |
}; | |
#if _LIBCPP_STD_VER > 11 // C++ > 11 | |
_LIBCPP_NORETURN _LIBCPP_INLINE_VISIBILITY | |
inline void __throw_bad_any_cast() | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
throw bad_any_cast(); | |
#else | |
assert(!"bad_any_cast"); | |
#endif | |
} | |
// Forward declarations | |
class any; | |
template <class _ValueType> | |
typename add_pointer<typename add_const<_ValueType>::type>::type | |
+_LIBCPP_INLINE_VISIBILITY | |
any_cast(any const *) _NOEXCEPT; | |
template <class _ValueType> | |
typename add_pointer<_ValueType>::type | |
+_LIBCPP_INLINE_VISIBILITY | |
any_cast(any *) _NOEXCEPT; | |
namespace __any_imp | |
{ | |
typedef typename aligned_storage<3*sizeof(void*), alignment_of<void*>::value>::type | |
_Buffer; | |
template <class _Tp> | |
struct _IsSmallObject | |
: public integral_constant<bool | |
, sizeof(_Tp) <= sizeof(_Buffer) | |
&& alignment_of<_Buffer>::value | |
% alignment_of<_Tp>::value == 0 | |
&& is_nothrow_move_constructible<_Tp>::value | |
> | |
{}; | |
enum class _Action | |
{ | |
_Destroy, | |
_Copy, | |
_Move, | |
_Get, | |
_TypeInfo | |
}; | |
template <class _Tp> | |
struct _SmallHandler; | |
template <class _Tp> | |
struct _LargeHandler; | |
template <class _Tp> | |
using _Handler = typename conditional<_IsSmallObject<_Tp>::value | |
, _SmallHandler<_Tp> | |
, _LargeHandler<_Tp> | |
>::type; | |
template <class _ValueType> | |
using _EnableIfNotAny = typename | |
enable_if< | |
!is_same<typename decay<_ValueType>::type, any>::value | |
>::type; | |
} // namespace __any_imp | |
class any | |
{ | |
public: | |
// 6.3.1 any construct/destruct | |
_LIBCPP_INLINE_VISIBILITY | |
any() _NOEXCEPT : __h(nullptr) {} | |
_LIBCPP_INLINE_VISIBILITY | |
any(any const & __other) : __h(nullptr) | |
{ | |
if (__other.__h) __other.__call(_Action::_Copy, this); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
any(any && __other) _NOEXCEPT : __h(nullptr) | |
{ | |
if (__other.__h) __other.__call(_Action::_Move, this); | |
} | |
template < | |
class _ValueType | |
, class = __any_imp::_EnableIfNotAny<_ValueType> | |
> | |
+ _LIBCPP_INLINE_VISIBILITY | |
any(_ValueType && __value); | |
_LIBCPP_INLINE_VISIBILITY | |
~any() | |
{ | |
this->clear(); | |
} | |
// 6.3.2 any assignments | |
_LIBCPP_INLINE_VISIBILITY | |
any & operator=(any const & __rhs) | |
{ | |
any(__rhs).swap(*this); | |
return *this; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
any & operator=(any && __rhs) _NOEXCEPT | |
{ | |
any(_VSTD::move(__rhs)).swap(*this); | |
return *this; | |
} | |
template < | |
class _ValueType | |
, class = __any_imp::_EnableIfNotAny<_ValueType> | |
> | |
+ _LIBCPP_INLINE_VISIBILITY | |
any & operator=(_ValueType && __rhs); | |
// 6.3.3 any modifiers | |
_LIBCPP_INLINE_VISIBILITY | |
void clear() _NOEXCEPT | |
{ | |
if (__h) this->__call(_Action::_Destroy); | |
} | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(any & __rhs) _NOEXCEPT; | |
// 6.3.4 any observers | |
_LIBCPP_INLINE_VISIBILITY | |
bool empty() const _NOEXCEPT | |
{ | |
return __h == nullptr; | |
} | |
#if !defined(_LIBCPP_NO_RTTI) | |
_LIBCPP_INLINE_VISIBILITY | |
const type_info & type() const _NOEXCEPT | |
{ | |
if (__h) { | |
return *static_cast<type_info const *>(this->__call(_Action::_TypeInfo)); | |
} else { | |
return typeid(void); | |
} | |
} | |
#endif | |
private: | |
typedef __any_imp::_Action _Action; | |
typedef void* (*_HandleFuncPtr)(_Action, any const *, any *, const type_info *); | |
union _Storage | |
{ | |
void * __ptr; | |
__any_imp::_Buffer __buf; | |
}; | |
_LIBCPP_ALWAYS_INLINE | |
void * __call(_Action __a, any * __other = nullptr, | |
type_info const * __info = nullptr) const | |
{ | |
return __h(__a, this, __other, __info); | |
} | |
_LIBCPP_ALWAYS_INLINE | |
void * __call(_Action __a, any * __other = nullptr, | |
type_info const * __info = nullptr) | |
{ | |
return __h(__a, this, __other, __info); | |
} | |
template <class> | |
friend struct __any_imp::_SmallHandler; | |
template <class> | |
friend struct __any_imp::_LargeHandler; | |
template <class _ValueType> | |
friend typename add_pointer<typename add_const<_ValueType>::type>::type | |
any_cast(any const *) _NOEXCEPT; | |
template <class _ValueType> | |
friend typename add_pointer<_ValueType>::type | |
any_cast(any *) _NOEXCEPT; | |
_HandleFuncPtr __h; | |
_Storage __s; | |
}; | |
namespace __any_imp | |
{ | |
template <class _Tp> | |
struct _LIBCPP_TYPE_VIS_ONLY _SmallHandler | |
{ | |
_LIBCPP_INLINE_VISIBILITY | |
static void* __handle(_Action __act, any const * __this, any * __other, | |
type_info const * __info) | |
{ | |
switch (__act) | |
{ | |
case _Action::_Destroy: | |
__destroy(const_cast<any &>(*__this)); | |
return nullptr; | |
case _Action::_Copy: | |
__copy(*__this, *__other); | |
return nullptr; | |
case _Action::_Move: | |
__move(const_cast<any &>(*__this), *__other); | |
return nullptr; | |
case _Action::_Get: | |
return __get(const_cast<any &>(*__this), __info); | |
case _Action::_TypeInfo: | |
return __type_info(); | |
} | |
} | |
template <class _Up> | |
_LIBCPP_INLINE_VISIBILITY | |
static void __create(any & __dest, _Up && __v) | |
{ | |
::new (static_cast<void*>(&__dest.__s.__buf)) _Tp(_VSTD::forward<_Up>(__v)); | |
__dest.__h = &_SmallHandler::__handle; | |
} | |
private: | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __destroy(any & __this) | |
{ | |
_Tp & __value = *static_cast<_Tp *>(static_cast<void*>(&__this.__s.__buf)); | |
__value.~_Tp(); | |
__this.__h = nullptr; | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __copy(any const & __this, any & __dest) | |
{ | |
_SmallHandler::__create(__dest, *static_cast<_Tp const *>( | |
static_cast<void const *>(&__this.__s.__buf))); | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __move(any & __this, any & __dest) | |
{ | |
_SmallHandler::__create(__dest, _VSTD::move( | |
*static_cast<_Tp*>(static_cast<void*>(&__this.__s.__buf)))); | |
__destroy(__this); | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void* __get(any & __this, type_info const * __info) | |
{ | |
#if !defined(_LIBCPP_NO_RTTI) | |
if (typeid(_Tp) == *__info) { | |
return static_cast<void*>(&__this.__s.__buf); | |
} | |
return nullptr; | |
#else | |
return static_cast<void*>(&__this.__s.__buf); | |
#endif | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void* __type_info() | |
{ | |
#if !defined(_LIBCPP_NO_RTTI) | |
return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); | |
#else | |
return nullptr; | |
#endif | |
} | |
}; | |
template <class _Tp> | |
struct _LIBCPP_TYPE_VIS_ONLY _LargeHandler | |
{ | |
_LIBCPP_INLINE_VISIBILITY | |
static void* __handle(_Action __act, any const * __this, any * __other, | |
type_info const * __info) | |
{ | |
switch (__act) | |
{ | |
case _Action::_Destroy: | |
__destroy(const_cast<any &>(*__this)); | |
return nullptr; | |
case _Action::_Copy: | |
__copy(*__this, *__other); | |
return nullptr; | |
case _Action::_Move: | |
__move(const_cast<any &>(*__this), *__other); | |
return nullptr; | |
case _Action::_Get: | |
return __get(const_cast<any &>(*__this), __info); | |
case _Action::_TypeInfo: | |
return __type_info(); | |
} | |
} | |
template <class _Up> | |
_LIBCPP_INLINE_VISIBILITY | |
static void __create(any & __dest, _Up && __v) | |
{ | |
typedef allocator<_Tp> _Alloc; | |
typedef __allocator_destructor<_Alloc> _Dp; | |
_Alloc __a; | |
unique_ptr<_Tp, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); | |
::new ((void*)__hold.get()) _Tp(_VSTD::forward<_Up>(__v)); | |
__dest.__s.__ptr = __hold.release(); | |
__dest.__h = &_LargeHandler::__handle; | |
} | |
private: | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __destroy(any & __this) | |
{ | |
delete static_cast<_Tp*>(__this.__s.__ptr); | |
__this.__h = nullptr; | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __copy(any const & __this, any & __dest) | |
{ | |
_LargeHandler::__create(__dest, *static_cast<_Tp const *>(__this.__s.__ptr)); | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void __move(any & __this, any & __dest) | |
{ | |
__dest.__s.__ptr = __this.__s.__ptr; | |
__dest.__h = &_LargeHandler::__handle; | |
__this.__h = nullptr; | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void* __get(any & __this, type_info const * __info) | |
{ | |
#if !defined(_LIBCPP_NO_RTTI) | |
if (typeid(_Tp) == *__info) { | |
return static_cast<void*>(__this.__s.__ptr); | |
} | |
return nullptr; | |
#else | |
return static_cast<void*>(__this.__s.__ptr); | |
#endif | |
} | |
_LIBCPP_ALWAYS_INLINE _LIBCPP_INLINE_VISIBILITY | |
static void* __type_info() | |
{ | |
#if !defined(_LIBCPP_NO_RTTI) | |
return const_cast<void*>(static_cast<void const *>(&typeid(_Tp))); | |
#else | |
return nullptr; | |
#endif | |
} | |
}; | |
} // namespace __any_imp | |
template <class _ValueType, class> | |
-_LIBCPP_INLINE_VISIBILITY | |
any::any(_ValueType && __v) : __h(nullptr) | |
{ | |
typedef typename decay<_ValueType>::type _Tp; | |
static_assert(is_copy_constructible<_Tp>::value, | |
"_ValueType must be CopyConstructible."); | |
typedef __any_imp::_Handler<_Tp> _HandlerType; | |
_HandlerType::__create(*this, _VSTD::forward<_ValueType>(__v)); | |
} | |
template <class _ValueType, class> | |
-_LIBCPP_INLINE_VISIBILITY | |
any & any::operator=(_ValueType && __v) | |
{ | |
typedef typename decay<_ValueType>::type _Tp; | |
static_assert(is_copy_constructible<_Tp>::value, | |
"_ValueType must be CopyConstructible."); | |
any(_VSTD::forward<_ValueType>(__v)).swap(*this); | |
return *this; | |
} | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void any::swap(any & __rhs) _NOEXCEPT | |
{ | |
if (__h && __rhs.__h) { | |
any __tmp; | |
__rhs.__call(_Action::_Move, &__tmp); | |
this->__call(_Action::_Move, &__rhs); | |
__tmp.__call(_Action::_Move, this); | |
} | |
else if (__h) { | |
this->__call(_Action::_Move, &__rhs); | |
} | |
else if (__rhs.__h) { | |
__rhs.__call(_Action::_Move, this); | |
} | |
} | |
// 6.4 Non-member functions | |
inline _LIBCPP_INLINE_VISIBILITY | |
void swap(any & __lhs, any & __rhs) _NOEXCEPT | |
{ | |
__lhs.swap(__rhs); | |
} | |
template <class _ValueType> | |
_LIBCPP_INLINE_VISIBILITY | |
_ValueType any_cast(any const & __v) | |
{ | |
static_assert( | |
is_reference<_ValueType>::value | |
|| is_copy_constructible<_ValueType>::value, | |
"_ValueType is required to be a reference or a CopyConstructible type."); | |
typedef typename add_const<typename remove_reference<_ValueType>::type>::type | |
_Tp; | |
_Tp * __tmp = any_cast<_Tp>(&__v); | |
if (__tmp == nullptr) | |
__throw_bad_any_cast(); | |
return *__tmp; | |
} | |
template <class _ValueType> | |
_LIBCPP_INLINE_VISIBILITY | |
_ValueType any_cast(any & __v) | |
{ | |
static_assert( | |
is_reference<_ValueType>::value | |
|| is_copy_constructible<_ValueType>::value, | |
"_ValueType is required to be a reference or a CopyConstructible type."); | |
typedef typename remove_reference<_ValueType>::type _Tp; | |
_Tp * __tmp = any_cast<_Tp>(&__v); | |
if (__tmp == nullptr) | |
__throw_bad_any_cast(); | |
return *__tmp; | |
} | |
template <class _ValueType> | |
_LIBCPP_INLINE_VISIBILITY | |
_ValueType any_cast(any && __v) | |
{ | |
static_assert( | |
is_reference<_ValueType>::value | |
|| is_copy_constructible<_ValueType>::value, | |
"_ValueType is required to be a reference or a CopyConstructible type."); | |
typedef typename remove_reference<_ValueType>::type _Tp; | |
_Tp * __tmp = any_cast<_Tp>(&__v); | |
if (__tmp == nullptr) | |
__throw_bad_any_cast(); | |
return *__tmp; | |
} | |
template <class _ValueType> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
typename add_pointer<typename add_const<_ValueType>::type>::type | |
any_cast(any const * __any) _NOEXCEPT | |
{ | |
static_assert(!is_reference<_ValueType>::value, | |
"_ValueType may not be a reference."); | |
return any_cast<_ValueType>(const_cast<any *>(__any)); | |
} | |
template <class _ValueType> | |
-_LIBCPP_INLINE_VISIBILITY | |
typename add_pointer<_ValueType>::type | |
any_cast(any * __any) _NOEXCEPT | |
{ | |
using __any_imp::_Action; | |
static_assert(!is_reference<_ValueType>::value, | |
"_ValueType may not be a reference."); | |
typedef typename add_pointer<_ValueType>::type _ReturnType; | |
if (__any && __any->__h) { | |
return static_cast<_ReturnType>( | |
__any->__call(_Action::_Get, nullptr, | |
#if !defined(_LIBCPP_NO_RTTI) | |
&typeid(_ValueType) | |
#else | |
nullptr | |
#endif | |
)); | |
} | |
return nullptr; | |
} | |
#endif // _LIBCPP_STD_VER > 11 | |
_LIBCPP_END_NAMESPACE_LFTS | |
#endif // _LIBCPP_EXPERIMENTAL_ANY | |
diff --git a/include/experimental/dynarray b/include/experimental/dynarray | |
index f40a6ca..4a06908 100644 | |
--- a/include/experimental/dynarray | |
+++ b/include/experimental/dynarray | |
@@ -1,316 +1,321 @@ | |
// -*- C++ -*- | |
//===-------------------------- dynarray ----------------------------------===// | |
// | |
// 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_DYNARRAY | |
#define _LIBCPP_DYNARRAY | |
#include <__config> | |
#if _LIBCPP_STD_VER > 11 | |
/* | |
dynarray synopsis | |
namespace std { namespace experimental { | |
template< typename T > | |
class dynarray | |
{ | |
// types: | |
typedef T value_type; | |
typedef T& reference; | |
typedef const T& const_reference; | |
typedef T* pointer; | |
typedef const T* const_pointer; | |
typedef implementation-defined iterator; | |
typedef implementation-defined const_iterator; | |
typedef reverse_iterator<iterator> reverse_iterator; | |
typedef reverse_iterator<const_iterator> const_reverse_iterator; | |
typedef size_t size_type; | |
typedef ptrdiff_t difference_type; | |
public: | |
// construct/copy/destroy: | |
explicit dynarray(size_type c); | |
dynarray(size_type c, const T& v); | |
dynarray(const dynarray& d); | |
dynarray(initializer_list<T>); | |
template <class Alloc> | |
dynarray(allocator_arg_t, const Alloc& a, size_type c, const Alloc& alloc); | |
template <class Alloc> | |
dynarray(allocator_arg_t, const Alloc& a, size_type c, const T& v, const Alloc& alloc); | |
template <class Alloc> | |
dynarray(allocator_arg_t, const Alloc& a, const dynarray& d, const Alloc& alloc); | |
template <class Alloc> | |
dynarray(allocator_arg_t, const Alloc& a, initializer_list<T>, const Alloc& alloc); | |
dynarray& operator=(const dynarray&) = delete; | |
~dynarray(); | |
// iterators: | |
iterator begin() noexcept; | |
const_iterator begin() const noexcept; | |
const_iterator cbegin() const noexcept; | |
iterator end() noexcept; | |
const_iterator end() const noexcept; | |
const_iterator cend() const noexcept; | |
reverse_iterator rbegin() noexcept; | |
const_reverse_iterator rbegin() const noexcept; | |
const_reverse_iterator crbegin() const noexcept; | |
reverse_iterator rend() noexcept; | |
const_reverse_iterator rend() const noexcept; | |
const_reverse_iterator crend() const noexcept; | |
// capacity: | |
size_type size() const noexcept; | |
size_type max_size() const noexcept; | |
bool empty() const noexcept; | |
// element access: | |
reference operator[](size_type n); | |
const_reference operator[](size_type n) const; | |
reference front(); | |
const_reference front() const; | |
reference back(); | |
const_reference back() const; | |
const_reference at(size_type n) const; | |
reference at(size_type n); | |
// data access: | |
T* data() noexcept; | |
const T* data() const noexcept; | |
// mutating member functions: | |
void fill(const T& v); | |
}; | |
}} // std::experimental | |
*/ | |
#include <__functional_base> | |
#include <iterator> | |
#include <stdexcept> | |
#include <initializer_list> | |
#include <new> | |
#include <algorithm> | |
#include <__undef___deallocate> | |
#if defined(_LIBCPP_NO_EXCEPTIONS) | |
#include <cassert> | |
#endif | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
namespace std { namespace experimental { inline namespace __array_extensions_v1 { | |
template <class _Tp> | |
struct _LIBCPP_TYPE_VIS_ONLY dynarray | |
{ | |
public: | |
// types: | |
typedef dynarray __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; | |
private: | |
size_t __size_; | |
value_type * __base_; | |
_LIBCPP_ALWAYS_INLINE dynarray () noexcept : __size_(0), __base_(nullptr) {} | |
static inline _LIBCPP_INLINE_VISIBILITY value_type* __allocate ( size_t count ) | |
{ | |
if ( numeric_limits<size_t>::max() / sizeof (value_type) <= count ) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
throw bad_array_length(); | |
#else | |
assert(!"dynarray::allocation"); | |
#endif | |
} | |
return static_cast<value_type *> (_VSTD::__allocate (sizeof(value_type) * count)); | |
} | |
static inline _LIBCPP_INLINE_VISIBILITY void __deallocate ( value_type* __ptr ) noexcept | |
{ | |
_VSTD::__deallocate (static_cast<void *> (__ptr)); | |
} | |
public: | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit dynarray(size_type __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
dynarray(size_type __c, const value_type& __v); | |
+ _LIBCPP_INLINE_VISIBILITY | |
dynarray(const dynarray& __d); | |
+ _LIBCPP_INLINE_VISIBILITY | |
dynarray(initializer_list<value_type>); | |
// We're not implementing these right now. | |
// Updated with the resolution of LWG issue #2255 | |
// template <typename _Alloc> | |
// dynarray(allocator_arg_t, const _Alloc& __alloc, size_type __c); | |
// template <typename _Alloc> | |
// dynarray(allocator_arg_t, const _Alloc& __alloc, size_type __c, const value_type& __v); | |
// template <typename _Alloc> | |
// dynarray(allocator_arg_t, const _Alloc& __alloc, const dynarray& __d); | |
// template <typename _Alloc> | |
// dynarray(allocator_arg_t, const _Alloc& __alloc, initializer_list<value_type>); | |
dynarray& operator=(const dynarray&) = delete; | |
+ _LIBCPP_INLINE_VISIBILITY | |
~dynarray(); | |
// iterators: | |
inline _LIBCPP_INLINE_VISIBILITY iterator begin() noexcept { return iterator(data()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_iterator begin() const noexcept { return const_iterator(data()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_iterator cbegin() const noexcept { return const_iterator(data()); } | |
inline _LIBCPP_INLINE_VISIBILITY iterator end() noexcept { return iterator(data() + __size_); } | |
inline _LIBCPP_INLINE_VISIBILITY const_iterator end() const noexcept { return const_iterator(data() + __size_); } | |
inline _LIBCPP_INLINE_VISIBILITY const_iterator cend() const noexcept { return const_iterator(data() + __size_); } | |
inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); } | |
inline _LIBCPP_INLINE_VISIBILITY reverse_iterator rend() noexcept { return reverse_iterator(begin()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); } | |
inline _LIBCPP_INLINE_VISIBILITY const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); } | |
// capacity: | |
inline _LIBCPP_INLINE_VISIBILITY size_type size() const noexcept { return __size_; } | |
inline _LIBCPP_INLINE_VISIBILITY size_type max_size() const noexcept { return __size_; } | |
inline _LIBCPP_INLINE_VISIBILITY bool empty() const noexcept { return __size_ == 0; } | |
// element access: | |
inline _LIBCPP_INLINE_VISIBILITY reference operator[](size_type __n) { return data()[__n]; } | |
inline _LIBCPP_INLINE_VISIBILITY const_reference operator[](size_type __n) const { return data()[__n]; } | |
inline _LIBCPP_INLINE_VISIBILITY reference front() { return data()[0]; } | |
inline _LIBCPP_INLINE_VISIBILITY const_reference front() const { return data()[0]; } | |
inline _LIBCPP_INLINE_VISIBILITY reference back() { return data()[__size_-1]; } | |
inline _LIBCPP_INLINE_VISIBILITY const_reference back() const { return data()[__size_-1]; } | |
inline _LIBCPP_INLINE_VISIBILITY const_reference at(size_type __n) const; | |
inline _LIBCPP_INLINE_VISIBILITY reference at(size_type __n); | |
// data access: | |
inline _LIBCPP_INLINE_VISIBILITY _Tp* data() noexcept { return __base_; } | |
inline _LIBCPP_INLINE_VISIBILITY const _Tp* data() const noexcept { return __base_; } | |
// mutating member functions: | |
inline _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __v) { fill_n(begin(), __size_, __v); } | |
}; | |
template <class _Tp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
dynarray<_Tp>::dynarray(size_type __c) : dynarray () | |
{ | |
__base_ = __allocate (__c); | |
value_type *__data = data (); | |
for ( __size_ = 0; __size_ < __c; ++__size_, ++__data ) | |
::new (__data) value_type; | |
} | |
template <class _Tp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
dynarray<_Tp>::dynarray(size_type __c, const value_type& __v) : dynarray () | |
{ | |
__base_ = __allocate (__c); | |
value_type *__data = data (); | |
for ( __size_ = 0; __size_ < __c; ++__size_, ++__data ) | |
::new (__data) value_type (__v); | |
} | |
template <class _Tp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
dynarray<_Tp>::dynarray(initializer_list<value_type> __il) : dynarray () | |
{ | |
size_t sz = __il.size(); | |
__base_ = __allocate (sz); | |
value_type *__data = data (); | |
auto src = __il.begin(); | |
for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src ) | |
::new (__data) value_type (*src); | |
} | |
template <class _Tp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
dynarray<_Tp>::dynarray(const dynarray& __d) : dynarray () | |
{ | |
size_t sz = __d.size(); | |
__base_ = __allocate (sz); | |
value_type *__data = data (); | |
auto src = __d.begin(); | |
for ( __size_ = 0; __size_ < sz; ++__size_, ++__data, ++src ) | |
::new (__data) value_type (*src); | |
} | |
template <class _Tp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
dynarray<_Tp>::~dynarray() | |
{ | |
value_type *__data = data () + __size_; | |
for ( size_t i = 0; i < __size_; ++i ) | |
(--__data)->value_type::~value_type(); | |
__deallocate ( __base_ ); | |
} | |
template <class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY | |
typename dynarray<_Tp>::reference | |
dynarray<_Tp>::at(size_type __n) | |
{ | |
if (__n >= __size_) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
throw out_of_range("dynarray::at"); | |
#else | |
assert(!"dynarray::at out_of_range"); | |
#endif | |
} | |
return data()[__n]; | |
} | |
template <class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY | |
typename dynarray<_Tp>::const_reference | |
dynarray<_Tp>::at(size_type __n) const | |
{ | |
if (__n >= __size_) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
throw out_of_range("dynarray::at"); | |
#else | |
assert(!"dynarray::at out_of_range"); | |
#endif | |
} | |
return data()[__n]; | |
} | |
}}} | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
template <class _Tp, class _Alloc> | |
struct _LIBCPP_TYPE_VIS_ONLY uses_allocator<std::experimental::dynarray<_Tp>, _Alloc> : true_type {}; | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // if _LIBCPP_STD_VER > 11 | |
#endif // _LIBCPP_DYNARRAY | |
diff --git a/include/ext/hash_map b/include/ext/hash_map | |
index 3886653..5e1e9f5 100644 | |
--- a/include/ext/hash_map | |
+++ b/include/ext/hash_map | |
@@ -1,982 +1,984 @@ | |
// -*- 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 <type_traits> | |
#include <ext/__hash> | |
#if __DEPRECATED | |
#if defined(_MSC_VER) && ! defined(__clang__) | |
_LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>") | |
#else | |
# warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> | |
#endif | |
#endif | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
namespace __gnu_cxx { | |
using namespace std; | |
template <class _Tp, class _Hash, | |
bool = is_empty<_Hash>::value && !__libcpp_is_final<_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 && !__libcpp_is_final<_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::__node_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_TYPE_VIS_ONLY __hash_map_iterator | |
{ | |
_HashIterator __i_; | |
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 __rebind_pointer<typename _HashIterator::pointer, value_type>::type | |
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_TYPE_VIS_ONLY hash_map; | |
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator; | |
}; | |
template <class _HashIterator> | |
class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator | |
{ | |
_HashIterator __i_; | |
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 __rebind_pointer<typename _HashIterator::pointer, const value_type>::type | |
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_TYPE_VIS_ONLY hash_map; | |
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __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_TYPE_VIS_ONLY 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 __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type; | |
typedef __hash_table<__value_type, __hasher, | |
__key_equal, __allocator_type> __table; | |
__table __table_; | |
typedef typename __table::__node_pointer __node_pointer; | |
typedef typename __table::__node_const_pointer __node_const_pointer; | |
typedef typename __table::__node_traits __node_traits; | |
typedef typename __table::__node_allocator __node_allocator; | |
typedef typename __table::__node __node; | |
typedef __hash_map_node_destructor<__node_allocator> _Dp; | |
typedef unique_ptr<__node, _Dp> __node_holder; | |
typedef allocator_traits<allocator_type> __alloc_traits; | |
public: | |
typedef typename __alloc_traits::pointer pointer; | |
typedef typename __alloc_traits::const_pointer const_pointer; | |
typedef typename __alloc_traits::size_type size_type; | |
typedef typename __alloc_traits::difference_type difference_type; | |
typedef __hash_map_iterator<typename __table::iterator> iterator; | |
typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; | |
_LIBCPP_INLINE_VISIBILITY hash_map() {__table_.rehash(193);} | |
explicit hash_map(size_type __n, const hasher& __hf = hasher(), | |
const key_equal& __eql = key_equal()); | |
hash_map(size_type __n, const hasher& __hf, | |
const key_equal& __eql, | |
const allocator_type& __a); | |
template <class _InputIterator> | |
hash_map(_InputIterator __first, _InputIterator __last); | |
template <class _InputIterator> | |
hash_map(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf = hasher(), | |
const key_equal& __eql = key_equal()); | |
template <class _InputIterator> | |
hash_map(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf, | |
const key_equal& __eql, | |
const allocator_type& __a); | |
hash_map(const hash_map& __u); | |
_LIBCPP_INLINE_VISIBILITY | |
allocator_type get_allocator() const | |
{return allocator_type(__table_.__node_alloc());} | |
_LIBCPP_INLINE_VISIBILITY | |
bool empty() const {return __table_.size() == 0;} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type size() const {return __table_.size();} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type max_size() const {return __table_.max_size();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator begin() {return __table_.begin();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator end() {return __table_.end();} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator begin() const {return __table_.begin();} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator end() const {return __table_.end();} | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert(const value_type& __x) | |
{return __table_.__insert_unique(__x);} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;} | |
template <class _InputIterator> | |
+ _LIBCPP_INLINE_VISIBILITY | |
void insert(_InputIterator __first, _InputIterator __last); | |
_LIBCPP_INLINE_VISIBILITY | |
void erase(const_iterator __p) {__table_.erase(__p.__i_);} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} | |
_LIBCPP_INLINE_VISIBILITY | |
void erase(const_iterator __first, const_iterator __last) | |
{__table_.erase(__first.__i_, __last.__i_);} | |
_LIBCPP_INLINE_VISIBILITY | |
void clear() {__table_.clear();} | |
_LIBCPP_INLINE_VISIBILITY | |
void swap(hash_map& __u) {__table_.swap(__u.__table_);} | |
_LIBCPP_INLINE_VISIBILITY | |
hasher hash_funct() const | |
{return __table_.hash_function().hash_function();} | |
_LIBCPP_INLINE_VISIBILITY | |
key_equal key_eq() const | |
{return __table_.key_eq().key_eq();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator find(const key_type& __k) {return __table_.find(__k);} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator find(const key_type& __k) const {return __table_.find(__k);} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, iterator> equal_range(const key_type& __k) | |
{return __table_.__equal_range_unique(__k);} | |
_LIBCPP_INLINE_VISIBILITY | |
pair<const_iterator, const_iterator> equal_range(const key_type& __k) const | |
{return __table_.__equal_range_unique(__k);} | |
mapped_type& operator[](const key_type& __k); | |
_LIBCPP_INLINE_VISIBILITY | |
size_type bucket_count() const {return __table_.bucket_count();} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type max_bucket_count() const {return __table_.max_bucket_count();} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type elems_in_bucket(size_type __n) const | |
{return __table_.bucket_size(__n);} | |
_LIBCPP_INLINE_VISIBILITY | |
void resize(size_type __n) {__table_.rehash(__n);} | |
private: | |
__node_holder __construct_node(const key_type& __k); | |
}; | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
size_type __n, const hasher& __hf, const key_equal& __eql) | |
: __table_(__hf, __eql) | |
{ | |
__table_.rehash(__n); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
size_type __n, const hasher& __hf, const key_equal& __eql, | |
const allocator_type& __a) | |
: __table_(__hf, __eql, __a) | |
{ | |
__table_.rehash(__n); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
_InputIterator __first, _InputIterator __last) | |
{ | |
__table_.rehash(193); | |
insert(__first, __last); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
_InputIterator __first, _InputIterator __last, size_type __n, | |
const hasher& __hf, const key_equal& __eql) | |
: __table_(__hf, __eql) | |
{ | |
__table_.rehash(__n); | |
insert(__first, __last); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
_InputIterator __first, _InputIterator __last, size_type __n, | |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) | |
: __table_(__hf, __eql, __a) | |
{ | |
__table_.rehash(__n); | |
insert(__first, __last); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( | |
const hash_map& __u) | |
: __table_(__u.__table_) | |
{ | |
__table_.rehash(__u.bucket_count()); | |
insert(__u.begin(), __u.end()); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder | |
hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k) | |
{ | |
__node_allocator& __na = __table_.__node_alloc(); | |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); | |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); | |
__h.get_deleter().__first_constructed = true; | |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); | |
__h.get_deleter().__second_constructed = true; | |
return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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_TYPE_VIS_ONLY 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 __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type; | |
typedef __hash_table<__value_type, __hasher, | |
__key_equal, __allocator_type> __table; | |
__table __table_; | |
typedef typename __table::__node_traits __node_traits; | |
typedef typename __table::__node_allocator __node_allocator; | |
typedef typename __table::__node __node; | |
typedef __hash_map_node_destructor<__node_allocator> _Dp; | |
typedef unique_ptr<__node, _Dp> __node_holder; | |
typedef allocator_traits<allocator_type> __alloc_traits; | |
public: | |
typedef typename __alloc_traits::pointer pointer; | |
typedef typename __alloc_traits::const_pointer const_pointer; | |
typedef typename __alloc_traits::size_type size_type; | |
typedef typename __alloc_traits::difference_type difference_type; | |
typedef __hash_map_iterator<typename __table::iterator> iterator; | |
typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; | |
_LIBCPP_INLINE_VISIBILITY | |
hash_multimap() {__table_.rehash(193);} | |
explicit hash_multimap(size_type __n, const hasher& __hf = hasher(), | |
const key_equal& __eql = key_equal()); | |
hash_multimap(size_type __n, const hasher& __hf, | |
const key_equal& __eql, | |
const allocator_type& __a); | |
template <class _InputIterator> | |
hash_multimap(_InputIterator __first, _InputIterator __last); | |
template <class _InputIterator> | |
hash_multimap(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf = hasher(), | |
const key_equal& __eql = key_equal()); | |
template <class _InputIterator> | |
hash_multimap(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf, | |
const key_equal& __eql, | |
const allocator_type& __a); | |
hash_multimap(const hash_multimap& __u); | |
_LIBCPP_INLINE_VISIBILITY | |
allocator_type get_allocator() const | |
{return allocator_type(__table_.__node_alloc());} | |
_LIBCPP_INLINE_VISIBILITY | |
bool empty() const {return __table_.size() == 0;} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type size() const {return __table_.size();} | |
_LIBCPP_INLINE_VISIBILITY | |
size_type max_size() const {return __table_.max_size();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator begin() {return __table_.begin();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator end() {return __table_.end();} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator begin() const {return __table_.begin();} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator end() const {return __table_.end();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator, const value_type& __x) {return insert(__x);} | |
template <class _InputIterator> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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 | |
index c4bb898..91850b5 100644 | |
--- a/include/ext/hash_set | |
+++ b/include/ext/hash_set | |
@@ -1,661 +1,663 @@ | |
// -*- 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 | |
#if defined(_MSC_VER) && ! defined(__clang__) | |
_LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>") | |
#else | |
# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> | |
#endif | |
#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_TYPE_VIS_ONLY 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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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_TYPE_VIS_ONLY 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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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 | |
index 78bcc55..18b300d 100644 | |
--- a/include/forward_list | |
+++ b/include/forward_list | |
@@ -1,1731 +1,1738 @@ | |
// -*- 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); | |
explicit forward_list(size_type n, const allocator_type& a); // C++14 | |
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_traits<allocator_type>::is_always_equal::value); // C++17 | |
void resize(size_type n); | |
void resize(size_type n, const value_type& v); | |
void clear() noexcept; | |
void splice_after(const_iterator p, forward_list& x); | |
void splice_after(const_iterator p, forward_list&& x); | |
void splice_after(const_iterator p, forward_list& x, const_iterator i); | |
void splice_after(const_iterator p, forward_list&& x, const_iterator i); | |
void splice_after(const_iterator p, forward_list& x, | |
const_iterator first, const_iterator last); | |
void splice_after(const_iterator p, forward_list&& x, | |
const_iterator first, const_iterator last); | |
void remove(const value_type& v); | |
template <class Predicate> void remove_if(Predicate pred); | |
void unique(); | |
template <class BinaryPredicate> void unique(BinaryPredicate binary_pred); | |
void merge(forward_list& x); | |
void merge(forward_list&& x); | |
template <class Compare> void merge(forward_list& x, Compare comp); | |
template <class Compare> void merge(forward_list&& x, Compare comp); | |
void sort(); | |
template <class Compare> void sort(Compare comp); | |
void reverse() noexcept; | |
}; | |
template <class T, class Allocator> | |
bool operator==(const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
bool operator< (const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
bool operator!=(const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
bool operator> (const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
bool operator>=(const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
bool operator<=(const forward_list<T, Allocator>& x, | |
const forward_list<T, Allocator>& y); | |
template <class T, class Allocator> | |
void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y) | |
noexcept(noexcept(x.swap(y))); | |
} // std | |
*/ | |
#include <__config> | |
#include <initializer_list> | |
#include <memory> | |
#include <limits> | |
#include <iterator> | |
#include <algorithm> | |
#include <__undef_min_max> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
template <class _Tp, class _VoidPtr> struct __forward_list_node; | |
template <class _NodePtr> struct __forward_begin_node; | |
template <class> | |
struct __forward_list_node_value_type; | |
template <class _Tp, class _VoidPtr> | |
struct __forward_list_node_value_type<__forward_list_node<_Tp, _VoidPtr> > { | |
typedef _Tp type; | |
}; | |
template <class _NodePtr> | |
struct __forward_node_traits { | |
typedef typename remove_cv< | |
typename pointer_traits<_NodePtr>::element_type>::type __node; | |
typedef typename __forward_list_node_value_type<__node>::type __node_value_type; | |
typedef _NodePtr __node_pointer; | |
typedef __forward_begin_node<_NodePtr> __begin_node; | |
typedef typename __rebind_pointer<_NodePtr, __begin_node>::type | |
__begin_node_pointer; | |
typedef typename __rebind_pointer<_NodePtr, void>::type __void_pointer; | |
#if defined(_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB) | |
typedef __begin_node_pointer __iter_node_pointer; | |
#else | |
typedef typename conditional< | |
is_pointer<__void_pointer>::value, | |
__begin_node_pointer, | |
__node_pointer | |
>::type __iter_node_pointer; | |
#endif | |
typedef typename conditional< | |
is_same<__iter_node_pointer, __node_pointer>::value, | |
__begin_node_pointer, | |
__node_pointer | |
>::type __non_iter_node_pointer; | |
_LIBCPP_INLINE_VISIBILITY | |
static __iter_node_pointer __as_iter_node(__iter_node_pointer __p) { | |
return __p; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
static __iter_node_pointer __as_iter_node(__non_iter_node_pointer __p) { | |
return static_cast<__iter_node_pointer>(static_cast<__void_pointer>(__p)); | |
} | |
}; | |
template <class _NodePtr> | |
struct __forward_begin_node | |
{ | |
typedef _NodePtr pointer; | |
typedef typename __rebind_pointer<_NodePtr, __forward_begin_node>::type __begin_node_pointer; | |
pointer __next_; | |
_LIBCPP_INLINE_VISIBILITY __forward_begin_node() : __next_(nullptr) {} | |
_LIBCPP_INLINE_VISIBILITY | |
__begin_node_pointer __next_as_begin() const { | |
return static_cast<__begin_node_pointer>(__next_); | |
} | |
}; | |
template <class _Tp, class _VoidPtr> | |
struct _LIBCPP_HIDDEN __begin_node_of | |
{ | |
typedef __forward_begin_node< | |
typename __rebind_pointer<_VoidPtr, __forward_list_node<_Tp, _VoidPtr> >::type | |
> type; | |
}; | |
template <class _Tp, class _VoidPtr> | |
struct __forward_list_node | |
: public __begin_node_of<_Tp, _VoidPtr>::type | |
{ | |
typedef _Tp value_type; | |
value_type __value_; | |
}; | |
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY forward_list; | |
template<class _NodeConstPtr> class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator; | |
template <class _NodePtr> | |
class _LIBCPP_TYPE_VIS_ONLY __forward_list_iterator | |
{ | |
typedef __forward_node_traits<_NodePtr> __traits; | |
typedef typename __traits::__node_pointer __node_pointer; | |
typedef typename __traits::__begin_node_pointer __begin_node_pointer; | |
typedef typename __traits::__iter_node_pointer __iter_node_pointer; | |
typedef typename __traits::__void_pointer __void_pointer; | |
__iter_node_pointer __ptr_; | |
_LIBCPP_INLINE_VISIBILITY | |
__begin_node_pointer __get_begin() const { | |
return static_cast<__begin_node_pointer>( | |
static_cast<__void_pointer>(__ptr_)); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
__node_pointer __get_unsafe_node_pointer() const { | |
return static_cast<__node_pointer>( | |
static_cast<__void_pointer>(__ptr_)); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_iterator(nullptr_t) _NOEXCEPT : __ptr_(nullptr) {} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_iterator(__begin_node_pointer __p) _NOEXCEPT | |
: __ptr_(__traits::__as_iter_node(__p)) {} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_iterator(__node_pointer __p) _NOEXCEPT | |
: __ptr_(__traits::__as_iter_node(__p)) {} | |
template<class, class> friend class _LIBCPP_TYPE_VIS_ONLY forward_list; | |
template<class> friend class _LIBCPP_TYPE_VIS_ONLY __forward_list_const_iterator; | |
public: | |
typedef forward_iterator_tag iterator_category; | |
typedef typename __traits::__node_value_type value_type; | |
typedef value_type& reference; | |
typedef typename pointer_traits<__node_pointer>::difference_type | |
difference_type; | |
typedef typename __rebind_pointer<__node_pointer, value_type>::type pointer; | |
_LIBCPP_INLINE_VISIBILITY | |
__forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {} | |
_LIBCPP_INLINE_VISIBILITY | |
reference operator*() const {return __get_unsafe_node_pointer()->__value_;} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const { | |
return pointer_traits<pointer>::pointer_to(__get_unsafe_node_pointer()->__value_); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
__forward_list_iterator& operator++() | |
{ | |
__ptr_ = __traits::__as_iter_node(__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_TYPE_VIS_ONLY __forward_list_const_iterator | |
{ | |
static_assert((!is_const<typename pointer_traits<_NodeConstPtr>::element_type>::value), ""); | |
typedef _NodeConstPtr _NodePtr; | |
typedef __forward_node_traits<_NodePtr> __traits; | |
typedef typename __traits::__node __node; | |
typedef typename __traits::__node_pointer __node_pointer; | |
typedef typename __traits::__begin_node_pointer __begin_node_pointer; | |
typedef typename __traits::__iter_node_pointer __iter_node_pointer; | |
typedef typename __traits::__void_pointer __void_pointer; | |
__iter_node_pointer __ptr_; | |
__begin_node_pointer __get_begin() const { | |
return static_cast<__begin_node_pointer>( | |
static_cast<__void_pointer>(__ptr_)); | |
} | |
__node_pointer __get_unsafe_node_pointer() const { | |
return static_cast<__node_pointer>( | |
static_cast<__void_pointer>(__ptr_)); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_const_iterator(nullptr_t) _NOEXCEPT | |
: __ptr_(nullptr) {} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_const_iterator(__begin_node_pointer __p) _NOEXCEPT | |
: __ptr_(__traits::__as_iter_node(__p)) {} | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __forward_list_const_iterator(__node_pointer __p) _NOEXCEPT | |
: __ptr_(__traits::__as_iter_node(__p)) {} | |
template<class, class> friend class forward_list; | |
public: | |
typedef forward_iterator_tag iterator_category; | |
typedef typename __traits::__node_value_type value_type; | |
typedef const value_type& reference; | |
typedef typename pointer_traits<__node_pointer>::difference_type | |
difference_type; | |
typedef typename __rebind_pointer<__node_pointer, const value_type>::type | |
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 __get_unsafe_node_pointer()->__value_;} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const {return pointer_traits<pointer>::pointer_to( | |
__get_unsafe_node_pointer()->__value_);} | |
_LIBCPP_INLINE_VISIBILITY | |
__forward_list_const_iterator& operator++() | |
{ | |
__ptr_ = __traits::__as_iter_node(__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 __begin_node_of<value_type, void_pointer>::type __begin_node; | |
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __node>::type __node_allocator; | |
typedef allocator_traits<__node_allocator> __node_traits; | |
typedef typename __node_traits::pointer __node_pointer; | |
typedef typename __rebind_alloc_helper< | |
allocator_traits<allocator_type>, __begin_node | |
>::type __begin_node_allocator; | |
typedef typename allocator_traits<__begin_node_allocator>::pointer | |
__begin_node_pointer; | |
__compressed_pair<__begin_node, __node_allocator> __before_begin_; | |
_LIBCPP_INLINE_VISIBILITY | |
__begin_node_pointer __before_begin() _NOEXCEPT | |
{return pointer_traits<__begin_node_pointer>::pointer_to(__before_begin_.first());} | |
_LIBCPP_INLINE_VISIBILITY | |
__begin_node_pointer __before_begin() const _NOEXCEPT | |
{return pointer_traits<__begin_node_pointer>::pointer_to(const_cast<__begin_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_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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
__forward_list_base(__forward_list_base&& __x) | |
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); | |
+ _LIBCPP_INLINE_VISIBILITY | |
__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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(__forward_list_base& __x) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT; | |
#else | |
_NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || | |
__is_nothrow_swappable<__node_allocator>::value); | |
#endif | |
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());} | |
}; | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
__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 | |
+inline | |
__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 | |
+inline | |
void | |
__forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT | |
#else | |
_NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || | |
__is_nothrow_swappable<__node_allocator>::value) | |
#endif | |
{ | |
__swap_allocator(__alloc(), __x.__alloc(), | |
integral_constant<bool, __node_traits::propagate_on_container_swap::value>()); | |
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_TYPE_VIS_ONLY 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; | |
typedef typename base::__begin_node_pointer __begin_node_pointer; | |
public: | |
typedef _Tp value_type; | |
typedef _Alloc allocator_type; | |
static_assert((is_same<typename allocator_type::value_type, value_type>::value), | |
"Allocator::value_type must be same type as 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 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; | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit forward_list(const allocator_type& __a); | |
explicit forward_list(size_type __n); | |
#if _LIBCPP_STD_VER > 11 | |
explicit forward_list(size_type __n, const allocator_type& __a); | |
#endif | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT | |
#else | |
_NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || | |
__is_nothrow_swappable<__node_allocator>::value) | |
#endif | |
{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); | |
+ template <class _Compare> _LIBCPP_INLINE_VISIBILITY 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 | |
+inline | |
forward_list<_Tp, _Alloc>::forward_list(const allocator_type& __a) | |
: base(__a) | |
{ | |
} | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(size_type __n) | |
{ | |
if (__n > 0) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); | |
for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n, | |
__p = __p->__next_as_begin()) | |
{ | |
__h.reset(__node_traits::allocate(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_)); | |
__h->__next_ = nullptr; | |
__p->__next_ = __h.release(); | |
} | |
} | |
} | |
#if _LIBCPP_STD_VER > 11 | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const allocator_type& __a) | |
: base ( __a ) | |
{ | |
if (__n > 0) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); | |
for (__begin_node_pointer __p = base::__before_begin(); __n > 0; --__n, | |
__p = __p->__next_as_begin()) | |
{ | |
__h.reset(__node_traits::allocate(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_)); | |
__h->__next_ = nullptr; | |
__p->__next_ = __h.release(); | |
} | |
} | |
} | |
#endif | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v) | |
{ | |
insert_after(cbefore_begin(), __n, __v); | |
} | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v, | |
const allocator_type& __a) | |
: base(__a) | |
{ | |
insert_after(cbefore_begin(), __n, __v); | |
} | |
template <class _Tp, class _Alloc> | |
template <class _InputIterator> | |
forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, | |
typename enable_if< | |
__is_input_iterator<_InputIterator>::value | |
>::type*) | |
{ | |
insert_after(cbefore_begin(), __f, __l); | |
} | |
template <class _Tp, class _Alloc> | |
template <class _InputIterator> | |
forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, | |
const allocator_type& __a, | |
typename enable_if< | |
__is_input_iterator<_InputIterator>::value | |
>::type*) | |
: base(__a) | |
{ | |
insert_after(cbefore_begin(), __f, __l); | |
} | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x) | |
: base(allocator_type( | |
__node_traits::select_on_container_copy_construction(__x.__alloc()) | |
) | |
) | |
{ | |
insert_after(cbefore_begin(), __x.begin(), __x.end()); | |
} | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x, | |
const allocator_type& __a) | |
: base(__a) | |
{ | |
insert_after(cbefore_begin(), __x.begin(), __x.end()); | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(forward_list&& __x, | |
const allocator_type& __a) | |
: base(_VSTD::move(__x), __a) | |
{ | |
if (base::__alloc() != __x.__alloc()) | |
{ | |
typedef move_iterator<iterator> _Ip; | |
insert_after(cbefore_begin(), _Ip(__x.begin()), _Ip(__x.end())); | |
} | |
} | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il) | |
{ | |
insert_after(cbefore_begin(), __il.begin(), __il.end()); | |
} | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>::forward_list(initializer_list<value_type> __il, | |
const allocator_type& __a) | |
: base(__a) | |
{ | |
insert_after(cbefore_begin(), __il.begin(), __il.end()); | |
} | |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
template <class _Tp, class _Alloc> | |
forward_list<_Tp, _Alloc>& | |
forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) | |
{ | |
if (this != &__x) | |
{ | |
base::__copy_assign_alloc(__x); | |
assign(__x.begin(), __x.end()); | |
} | |
return *this; | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, true_type) | |
_NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) | |
{ | |
clear(); | |
base::__move_assign_alloc(__x); | |
base::__before_begin()->__next_ = __x.__before_begin()->__next_; | |
__x.__before_begin()->__next_ = nullptr; | |
} | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::__move_assign(forward_list& __x, false_type) | |
{ | |
if (base::__alloc() == __x.__alloc()) | |
__move_assign(__x, true_type()); | |
else | |
{ | |
typedef move_iterator<iterator> _Ip; | |
assign(_Ip(__x.begin()), _Ip(__x.end())); | |
} | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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, (void) ++__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 | |
+inline | |
void | |
forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il) | |
{ | |
assign(__il.begin(), __il.end()); | |
} | |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
#ifndef _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
template <class... _Args> | |
void | |
forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), | |
_VSTD::forward<_Args>(__args)...); | |
__h->__next_ = base::__before_begin()->__next_; | |
base::__before_begin()->__next_ = __h.release(); | |
} | |
#endif // _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::push_front(value_type&& __v) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); | |
__h->__next_ = base::__before_begin()->__next_; | |
base::__before_begin()->__next_ = __h.release(); | |
} | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::push_front(const value_type& __v) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | |
__h->__next_ = base::__before_begin()->__next_; | |
base::__before_begin()->__next_ = __h.release(); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::pop_front() | |
{ | |
__node_allocator& __a = base::__alloc(); | |
__node_pointer __p = base::__before_begin()->__next_; | |
base::__before_begin()->__next_ = __p->__next_; | |
__node_traits::destroy(__a, _VSTD::addressof(__p->__value_)); | |
__node_traits::deallocate(__a, __p, 1); | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
#ifndef _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
template <class... _Args> | |
typename forward_list<_Tp, _Alloc>::iterator | |
forward_list<_Tp, _Alloc>::emplace_after(const_iterator __p, _Args&&... __args) | |
{ | |
__begin_node_pointer const __r = __p.__get_begin(); | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), | |
_VSTD::forward<_Args>(__args)...); | |
__h->__next_ = __r->__next_; | |
__r->__next_ = __h.release(); | |
return iterator(__r->__next_); | |
} | |
#endif // _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
typename forward_list<_Tp, _Alloc>::iterator | |
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) | |
{ | |
__begin_node_pointer const __r = __p.__get_begin(); | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), _VSTD::move(__v)); | |
__h->__next_ = __r->__next_; | |
__r->__next_ = __h.release(); | |
return iterator(__r->__next_); | |
} | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
typename forward_list<_Tp, _Alloc>::iterator | |
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, const value_type& __v) | |
{ | |
__begin_node_pointer const __r = __p.__get_begin(); | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | |
__h->__next_ = __r->__next_; | |
__r->__next_ = __h.release(); | |
return iterator(__r->__next_); | |
} | |
template <class _Tp, class _Alloc> | |
typename forward_list<_Tp, _Alloc>::iterator | |
forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, | |
const value_type& __v) | |
{ | |
__begin_node_pointer __r = __p.__get_begin(); | |
if (__n > 0) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | |
__node_pointer __first = __h.release(); | |
__node_pointer __last = __first; | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
for (--__n; __n != 0; --__n, __last = __last->__next_) | |
{ | |
__h.reset(__node_traits::allocate(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | |
__last->__next_ = __h.release(); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
while (__first != nullptr) | |
{ | |
__node_pointer __next = __first->__next_; | |
__node_traits::destroy(__a, _VSTD::addressof(__first->__value_)); | |
__node_traits::deallocate(__a, __first, 1); | |
__first = __next; | |
} | |
throw; | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
__last->__next_ = __r->__next_; | |
__r->__next_ = __first; | |
__r = static_cast<__begin_node_pointer>(__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) | |
{ | |
__begin_node_pointer __r = __p.__get_begin(); | |
if (__f != __l) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(__node_traits::allocate(__a, 1), _Dp(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); | |
__node_pointer __first = __h.release(); | |
__node_pointer __last = __first; | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
for (++__f; __f != __l; ++__f, ((void)(__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 = static_cast<__begin_node_pointer>(__last); | |
} | |
return iterator(__r); | |
} | |
template <class _Tp, class _Alloc> | |
typename forward_list<_Tp, _Alloc>::iterator | |
forward_list<_Tp, _Alloc>::erase_after(const_iterator __f) | |
{ | |
__begin_node_pointer __p = __f.__get_begin(); | |
__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 = __l.__get_unsafe_node_pointer(); | |
if (__f != __l) | |
{ | |
__begin_node_pointer __bp = __f.__get_begin(); | |
__node_pointer __n = __bp->__next_; | |
if (__n != __e) | |
{ | |
__bp->__next_ = __e; | |
__node_allocator& __a = base::__alloc(); | |
do | |
{ | |
__node_pointer __tmp = __n->__next_; | |
__node_traits::destroy(__a, _VSTD::addressof(__n->__value_)); | |
__node_traits::deallocate(__a, __n, 1); | |
__n = __tmp; | |
} while (__n != __e); | |
} | |
} | |
return iterator(__e); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::resize(size_type __n) | |
{ | |
size_type __sz = 0; | |
iterator __p = before_begin(); | |
iterator __i = begin(); | |
iterator __e = end(); | |
for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) | |
; | |
if (__i != __e) | |
erase_after(__p, __e); | |
else | |
{ | |
__n -= __sz; | |
if (__n > 0) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); | |
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n, | |
__ptr = __ptr->__next_as_begin()) | |
{ | |
__h.reset(__node_traits::allocate(__a, 1)); | |
__node_traits::construct(__a, _VSTD::addressof(__h->__value_)); | |
__h->__next_ = nullptr; | |
__ptr->__next_ = __h.release(); | |
} | |
} | |
} | |
} | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::resize(size_type __n, const value_type& __v) | |
{ | |
size_type __sz = 0; | |
iterator __p = before_begin(); | |
iterator __i = begin(); | |
iterator __e = end(); | |
for (; __i != __e && __sz < __n; ++__p, ++__i, ++__sz) | |
; | |
if (__i != __e) | |
erase_after(__p, __e); | |
else | |
{ | |
__n -= __sz; | |
if (__n > 0) | |
{ | |
__node_allocator& __a = base::__alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __h(nullptr, _Dp(__a, 1)); | |
for (__begin_node_pointer __ptr = __p.__get_begin(); __n > 0; --__n, | |
__ptr = __ptr->__next_as_begin()) | |
{ | |
__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.__get_begin()->__next_ != nullptr) | |
{ | |
const_iterator __lm1 = __x.before_begin(); | |
while (__lm1.__get_begin()->__next_ != nullptr) | |
++__lm1; | |
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_; | |
} | |
__p.__get_begin()->__next_ = __x.__before_begin()->__next_; | |
__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) | |
{ | |
__i.__get_begin()->__next_ = __lm1.__get_begin()->__next_; | |
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_; | |
__p.__get_begin()->__next_ = __lm1.__get_unsafe_node_pointer(); | |
} | |
} | |
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.__get_begin()->__next_ != __l.__get_begin()) | |
++__lm1; | |
if (__f != __lm1) | |
{ | |
__lm1.__get_begin()->__next_ = __p.__get_begin()->__next_; | |
__p.__get_begin()->__next_ = __f.__get_begin()->__next_; | |
__f.__get_begin()->__next_ = __l.__get_unsafe_node_pointer(); | |
} | |
} | |
} | |
#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) | |
{ | |
forward_list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing | |
iterator __e = end(); | |
for (iterator __i = before_begin(); __i.__get_begin()->__next_ != nullptr;) | |
{ | |
if (__i.__get_begin()->__next_->__value_ == __v) | |
{ | |
iterator __j = _VSTD::next(__i, 2); | |
for (; __j != __e && *__j == __v; ++__j) | |
; | |
__deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __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.__get_begin()->__next_ != nullptr;) | |
{ | |
if (__pred(__i.__get_begin()->__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.__get_begin()->__next_ != __j.__get_unsafe_node_pointer()) | |
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 | |
+inline | |
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).__get_unsafe_node_pointer(); | |
__node_pointer __f2 = __t->__next_; | |
__t->__next_ = nullptr; | |
return __merge(__sort(__f1, __sz1, __comp), | |
__sort(__f2, __sz2, __comp), __comp); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT | |
{ | |
__node_pointer __p = base::__before_begin()->__next_; | |
if (__p != nullptr) | |
{ | |
__node_pointer __f = __p->__next_; | |
__p->__next_ = nullptr; | |
while (__f != nullptr) | |
{ | |
__node_pointer __t = __f->__next_; | |
__f->__next_ = __p; | |
__p = __f; | |
__f = __t; | |
} | |
base::__before_begin()->__next_ = __p; | |
} | |
} | |
template <class _Tp, class _Alloc> | |
bool operator==(const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
typedef forward_list<_Tp, _Alloc> _Cp; | |
typedef typename _Cp::const_iterator _Ip; | |
_Ip __ix = __x.begin(); | |
_Ip __ex = __x.end(); | |
_Ip __iy = __y.begin(); | |
_Ip __ey = __y.end(); | |
for (; __ix != __ex && __iy != __ey; ++__ix, ++__iy) | |
if (!(*__ix == *__iy)) | |
return false; | |
return (__ix == __ex) == (__iy == __ey); | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
bool operator!=(const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
return !(__x == __y); | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
bool operator< (const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
return _VSTD::lexicographical_compare(__x.begin(), __x.end(), | |
__y.begin(), __y.end()); | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
bool operator> (const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
return __y < __x; | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
bool operator>=(const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
return !(__x < __y); | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
bool operator<=(const forward_list<_Tp, _Alloc>& __x, | |
const forward_list<_Tp, _Alloc>& __y) | |
{ | |
return !(__y < __x); | |
} | |
template <class _Tp, class _Alloc> | |
inline _LIBCPP_INLINE_VISIBILITY | |
void | |
swap(forward_list<_Tp, _Alloc>& __x, forward_list<_Tp, _Alloc>& __y) | |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) | |
{ | |
__x.swap(__y); | |
} | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // _LIBCPP_FORWARD_LIST | |
diff --git a/include/fstream b/include/fstream | |
index 1f289ed..d51da45 100644 | |
--- a/include/fstream | |
+++ b/include/fstream | |
@@ -1,1457 +1,1487 @@ | |
// -*- C++ -*- | |
//===------------------------- fstream ------------------------------------===// | |
// | |
// The LLVM Compiler Infrastructure | |
// | |
// This file is dual licensed under the MIT and the University of Illinois Open | |
// Source Licenses. See LICENSE.TXT for details. | |
// | |
//===----------------------------------------------------------------------===// | |
#ifndef _LIBCPP_FSTREAM | |
#define _LIBCPP_FSTREAM | |
/* | |
fstream synopsis | |
template <class charT, class traits = char_traits<charT> > | |
class basic_filebuf | |
: public basic_streambuf<charT, traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
// 27.9.1.2 Constructors/destructor: | |
basic_filebuf(); | |
basic_filebuf(basic_filebuf&& rhs); | |
virtual ~basic_filebuf(); | |
// 27.9.1.3 Assign/swap: | |
basic_filebuf& operator=(basic_filebuf&& rhs); | |
void swap(basic_filebuf& rhs); | |
// 27.9.1.4 Members: | |
bool is_open() const; | |
basic_filebuf* open(const char* s, ios_base::openmode mode); | |
basic_filebuf* open(const string& s, ios_base::openmode mode); | |
basic_filebuf* close(); | |
protected: | |
// 27.9.1.5 Overridden virtual functions: | |
virtual streamsize showmanyc(); | |
virtual int_type underflow(); | |
virtual int_type uflow(); | |
virtual int_type pbackfail(int_type c = traits_type::eof()); | |
virtual int_type overflow (int_type c = traits_type::eof()); | |
virtual basic_streambuf<char_type, traits_type>* setbuf(char_type* s, streamsize n); | |
virtual pos_type seekoff(off_type off, ios_base::seekdir way, | |
ios_base::openmode which = ios_base::in | ios_base::out); | |
virtual pos_type seekpos(pos_type sp, | |
ios_base::openmode which = ios_base::in | ios_base::out); | |
virtual int sync(); | |
virtual void imbue(const locale& loc); | |
}; | |
template <class charT, class traits> | |
void | |
swap(basic_filebuf<charT, traits>& x, basic_filebuf<charT, traits>& y); | |
typedef basic_filebuf<char> filebuf; | |
typedef basic_filebuf<wchar_t> wfilebuf; | |
template <class charT, class traits = char_traits<charT> > | |
class basic_ifstream | |
: public basic_istream<charT,traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
basic_ifstream(); | |
explicit basic_ifstream(const char* s, ios_base::openmode mode = ios_base::in); | |
explicit basic_ifstream(const string& s, ios_base::openmode mode = ios_base::in); | |
basic_ifstream(basic_ifstream&& rhs); | |
basic_ifstream& operator=(basic_ifstream&& rhs); | |
void swap(basic_ifstream& rhs); | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
bool is_open() const; | |
void open(const char* s, ios_base::openmode mode = ios_base::in); | |
void open(const string& s, ios_base::openmode mode = ios_base::in); | |
void close(); | |
}; | |
template <class charT, class traits> | |
void | |
swap(basic_ifstream<charT, traits>& x, basic_ifstream<charT, traits>& y); | |
typedef basic_ifstream<char> ifstream; | |
typedef basic_ifstream<wchar_t> wifstream; | |
template <class charT, class traits = char_traits<charT> > | |
class basic_ofstream | |
: public basic_ostream<charT,traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
basic_ofstream(); | |
explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); | |
explicit basic_ofstream(const string& s, ios_base::openmode mode = ios_base::out); | |
basic_ofstream(basic_ofstream&& rhs); | |
basic_ofstream& operator=(basic_ofstream&& rhs); | |
void swap(basic_ofstream& rhs); | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
bool is_open() const; | |
void open(const char* s, ios_base::openmode mode = ios_base::out); | |
void open(const string& s, ios_base::openmode mode = ios_base::out); | |
void close(); | |
}; | |
template <class charT, class traits> | |
void | |
swap(basic_ofstream<charT, traits>& x, basic_ofstream<charT, traits>& y); | |
typedef basic_ofstream<char> ofstream; | |
typedef basic_ofstream<wchar_t> wofstream; | |
template <class charT, class traits=char_traits<charT> > | |
class basic_fstream | |
: public basic_iostream<charT,traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
basic_fstream(); | |
explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); | |
explicit basic_fstream(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); | |
basic_fstream(basic_fstream&& rhs); | |
basic_fstream& operator=(basic_fstream&& rhs); | |
void swap(basic_fstream& rhs); | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
bool is_open() const; | |
void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); | |
void open(const string& s, ios_base::openmode mode = ios_base::in|ios_base::out); | |
void close(); | |
}; | |
template <class charT, class traits> | |
void swap(basic_fstream<charT, traits>& x, basic_fstream<charT, traits>& y); | |
typedef basic_fstream<char> fstream; | |
typedef basic_fstream<wchar_t> wfstream; | |
} // std | |
*/ | |
#include <__config> | |
#include <ostream> | |
#include <istream> | |
#include <__locale> | |
#include <cstdio> | |
#include <__undef_min_max> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
template <class _CharT, class _Traits> | |
class _LIBCPP_TYPE_VIS_ONLY 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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_filebuf& operator=(basic_filebuf&& __rhs); | |
#endif | |
void swap(basic_filebuf& __rhs); | |
// 27.9.1.4 Members: | |
+ _LIBCPP_INLINE_VISIBILITY | |
bool is_open() const; | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
basic_filebuf* open(const char* __s, ios_base::openmode __mode); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_filebuf* open(const string& __s, ios_base::openmode __mode); | |
#endif | |
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_; | |
state_type __st_last_; | |
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_(nullptr), | |
__st_(), | |
__st_last_(), | |
__om_(0), | |
__cm_(0), | |
__owns_eb_(false), | |
__owns_ib_(false), | |
__always_noconv_(false) | |
{ | |
if (has_facet<codecvt<char_type, char, state_type> >(this->getloc())) | |
{ | |
__cv_ = &use_facet<codecvt<char_type, char, state_type> >(this->getloc()); | |
__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_; | |
__st_last_ = __rhs.__st_last_; | |
__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.__st_last_ = 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 | |
+inline | |
basic_filebuf<_CharT, _Traits>& | |
basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs) | |
{ | |
close(); | |
swap(__rhs); | |
return *this; | |
} | |
#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(__st_last_, __rhs.__st_last_); | |
_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 | |
+inline | |
bool | |
basic_filebuf<_CharT, _Traits>::is_open() const | |
{ | |
return __file_ != 0; | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
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 | |
+inline | |
basic_filebuf<_CharT, _Traits>* | |
basic_filebuf<_CharT, _Traits>::open(const string& __s, ios_base::openmode __mode) | |
{ | |
return open(__s.c_str(), __mode); | |
} | |
#endif | |
template <class _CharT, class _Traits> | |
basic_filebuf<_CharT, _Traits>* | |
basic_filebuf<_CharT, _Traits>::close() | |
{ | |
basic_filebuf<_CharT, _Traits>* __rt = 0; | |
if (__file_) | |
{ | |
__rt = this; | |
unique_ptr<FILE, int(*)(FILE*)> __h(__file_, fclose); | |
if (sync()) | |
__rt = 0; | |
if (fclose(__h.release()) == 0) | |
__file_ = 0; | |
else | |
__rt = 0; | |
} | |
return __rt; | |
} | |
template <class _CharT, class _Traits> | |
typename basic_filebuf<_CharT, _Traits>::int_type | |
basic_filebuf<_CharT, _Traits>::underflow() | |
{ | |
if (__file_ == 0) | |
return traits_type::eof(); | |
bool __initial = __read_mode(); | |
char_type __1buf; | |
if (this->gptr() == 0) | |
this->setg(&__1buf, &__1buf+1, &__1buf+1); | |
const size_t __unget_sz = __initial ? 0 : min<size_t>((this->egptr() - this->eback()) / 2, 4); | |
int_type __c = traits_type::eof(); | |
if (this->gptr() == this->egptr()) | |
{ | |
memmove(this->eback(), this->egptr() - __unget_sz, __unget_sz * sizeof(char_type)); | |
if (__always_noconv_) | |
{ | |
size_t __nmemb = static_cast<size_t>(this->egptr() - this->eback() - __unget_sz); | |
__nmemb = fread(this->eback() + __unget_sz, 1, __nmemb, __file_); | |
if (__nmemb != 0) | |
{ | |
this->setg(this->eback(), | |
this->eback() + __unget_sz, | |
this->eback() + __unget_sz + __nmemb); | |
__c = traits_type::to_int_type(*this->gptr()); | |
} | |
} | |
else | |
{ | |
memmove(__extbuf_, __extbufnext_, __extbufend_ - __extbufnext_); | |
__extbufnext_ = __extbuf_ + (__extbufend_ - __extbufnext_); | |
__extbufend_ = __extbuf_ + (__extbuf_ == __extbuf_min_ ? sizeof(__extbuf_min_) : __ebs_); | |
size_t __nmemb = _VSTD::min(static_cast<size_t>(__ibs_ - __unget_sz), | |
static_cast<size_t>(__extbufend_ - __extbufnext_)); | |
codecvt_base::result __r; | |
__st_last_ = __st_; | |
size_t __nr = fread((void*)__extbufnext_, 1, __nmemb, __file_); | |
if (__nr != 0) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
if (!__cv_) | |
throw bad_cast(); | |
#endif | |
__extbufend_ = __extbufnext_ + __nr; | |
char_type* __inext; | |
__r = __cv_->in(__st_, __extbuf_, __extbufend_, __extbufnext_, | |
this->eback() + __unget_sz, | |
this->eback() + __ibs_, __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 | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
if (!__cv_) | |
throw bad_cast(); | |
#endif | |
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) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
if (!__cv_) | |
throw bad_cast(); | |
#endif | |
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 defined(_WIN32) || defined(_NEWLIB_VERSION) | |
if (fseek(__file_, __width > 0 ? __width * __off : 0, __whence)) | |
return pos_type(off_type(-1)); | |
pos_type __r = ftell(__file_); | |
#else | |
if (fseeko(__file_, __width > 0 ? __width * __off : 0, __whence)) | |
return pos_type(off_type(-1)); | |
pos_type __r = ftello(__file_); | |
#endif | |
__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 defined(_WIN32) || defined(_NEWLIB_VERSION) | |
if (fseek(__file_, __sp, SEEK_SET)) | |
return pos_type(off_type(-1)); | |
#else | |
if (fseeko(__file_, __sp, SEEK_SET)) | |
return pos_type(off_type(-1)); | |
#endif | |
__st_ = __sp.state(); | |
return __sp; | |
} | |
template <class _CharT, class _Traits> | |
int | |
basic_filebuf<_CharT, _Traits>::sync() | |
{ | |
if (__file_ == 0) | |
return 0; | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
if (!__cv_) | |
throw bad_cast(); | |
#endif | |
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; | |
state_type __state = __st_last_; | |
bool __update_st = false; | |
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()) | |
{ | |
const int __off = __cv_->length(__state, __extbuf_, | |
__extbufnext_, | |
this->gptr() - this->eback()); | |
__c += __extbufnext_ - __extbuf_ - __off; | |
__update_st = true; | |
} | |
} | |
} | |
#if defined(_WIN32) || defined(_NEWLIB_VERSION) | |
if (fseek(__file_, -__c, SEEK_CUR)) | |
return -1; | |
#else | |
if (fseeko(__file_, -__c, SEEK_CUR)) | |
return -1; | |
#endif | |
if (__update_st) | |
__st_ = __state; | |
__extbufnext_ = __extbufend_ = __extbuf_; | |
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_TYPE_VIS_ONLY 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; | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ifstream(); | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ifstream(const string& __s, ios_base::openmode __mode = ios_base::in); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ifstream(basic_ifstream&& __rhs); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ifstream& operator=(basic_ifstream&& __rhs); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_ifstream& __rhs); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
bool is_open() const; | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
void open(const char* __s, ios_base::openmode __mode = ios_base::in); | |
void open(const string& __s, ios_base::openmode __mode = ios_base::in); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void close(); | |
private: | |
basic_filebuf<char_type, traits_type> __sb_; | |
}; | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
basic_ifstream<_CharT, _Traits>::basic_ifstream() | |
: basic_istream<char_type, traits_type>(&__sb_) | |
{ | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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); | |
} | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
bool | |
basic_ifstream<_CharT, _Traits>::is_open() const | |
{ | |
return __sb_.is_open(); | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
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); | |
} | |
#endif | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
basic_ifstream<_CharT, _Traits>::close() | |
{ | |
if (__sb_.close() == 0) | |
this->setstate(ios_base::failbit); | |
} | |
// basic_ofstream | |
template <class _CharT, class _Traits> | |
class _LIBCPP_TYPE_VIS_ONLY 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; | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ofstream(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ofstream(const char* __s, ios_base::openmode __mode = ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ofstream(const string& __s, ios_base::openmode __mode = ios_base::out); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ofstream(basic_ofstream&& __rhs); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ofstream& operator=(basic_ofstream&& __rhs); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_ofstream& __rhs); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
bool is_open() const; | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
void open(const char* __s, ios_base::openmode __mode = ios_base::out); | |
void open(const string& __s, ios_base::openmode __mode = ios_base::out); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void close(); | |
private: | |
basic_filebuf<char_type, traits_type> __sb_; | |
}; | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
basic_ofstream<_CharT, _Traits>::basic_ofstream() | |
: basic_ostream<char_type, traits_type>(&__sb_) | |
{ | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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); | |
} | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
bool | |
basic_ofstream<_CharT, _Traits>::is_open() const | |
{ | |
return __sb_.is_open(); | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
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); | |
} | |
#endif | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
basic_ofstream<_CharT, _Traits>::close() | |
{ | |
if (__sb_.close() == 0) | |
this->setstate(ios_base::failbit); | |
} | |
// basic_fstream | |
template <class _CharT, class _Traits> | |
class _LIBCPP_TYPE_VIS_ONLY 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; | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_fstream(); | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_fstream(const char* __s, ios_base::openmode __mode = ios_base::in | ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_fstream(const string& __s, ios_base::openmode __mode = ios_base::in | ios_base::out); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_fstream(basic_fstream&& __rhs); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_fstream& operator=(basic_fstream&& __rhs); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_fstream& __rhs); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_filebuf<char_type, traits_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
bool is_open() const; | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
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); | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
void close(); | |
private: | |
basic_filebuf<char_type, traits_type> __sb_; | |
}; | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
basic_fstream<_CharT, _Traits>::basic_fstream() | |
: basic_iostream<char_type, traits_type>(&__sb_) | |
{ | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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); | |
} | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
bool | |
basic_fstream<_CharT, _Traits>::is_open() const | |
{ | |
return __sb_.is_open(); | |
} | |
#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE | |
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); | |
} | |
#endif | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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/istream b/include/istream | |
index 0bcc7ee..697ab74 100644 | |
--- a/include/istream | |
+++ b/include/istream | |
@@ -1,1733 +1,1744 @@ | |
// -*- 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); | |
protected: | |
basic_istream(const basic_istream& rhs) = delete; | |
basic_istream(basic_istream&& rhs); | |
// 27.7.2.1.2 Assign/swap: | |
basic_istream& operator=(const basic_istream& rhs) = delete; | |
basic_istream& operator=(basic_istream&& rhs); | |
void swap(basic_istream& rhs); | |
}; | |
// 27.7.1.2.3 character extraction templates: | |
template<class charT, class traits> | |
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); | |
template<class traits> | |
basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&); | |
template<class traits> | |
basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&); | |
template<class charT, class traits> | |
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*); | |
template<class traits> | |
basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*); | |
template<class traits> | |
basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*); | |
template <class charT, class traits> | |
void | |
swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y); | |
typedef basic_istream<char> istream; | |
typedef basic_istream<wchar_t> wistream; | |
template <class charT, class traits = char_traits<charT> > | |
class basic_iostream : | |
public basic_istream<charT,traits>, | |
public basic_ostream<charT,traits> | |
{ | |
public: | |
// types: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
// constructor/destructor | |
explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb); | |
basic_iostream(basic_iostream&& rhs); | |
virtual ~basic_iostream(); | |
// assign/swap | |
basic_iostream& operator=(basic_iostream&& rhs); | |
void swap(basic_iostream& rhs); | |
}; | |
template <class charT, class traits> | |
void | |
swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y); | |
typedef basic_iostream<char> iostream; | |
typedef basic_iostream<wchar_t> wiostream; | |
template <class charT, class traits> | |
basic_istream<charT,traits>& | |
ws(basic_istream<charT,traits>& is); | |
template <class charT, class traits, class T> | |
basic_istream<charT, traits>& | |
operator>>(basic_istream<charT, traits>&& is, T& x); | |
} // std | |
*/ | |
#include <__config> | |
#include <ostream> | |
#include <__undef_min_max> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
template <class _CharT, class _Traits> | |
class _LIBCPP_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_istream& __rhs); | |
#if _LIBCPP_STD_VER > 11 | |
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS | |
basic_istream (const basic_istream& __rhs) = delete; | |
basic_istream& operator=(const basic_istream& __rhs) = delete; | |
#else | |
basic_istream (const basic_istream& __rhs); // not defined | |
basic_istream& operator=(const basic_istream& __rhs); // not defined | |
#endif | |
#endif | |
public: | |
// 27.7.1.1.3 Prefix/suffix: | |
class _LIBCPP_TYPE_VIS_ONLY sentry; | |
// 27.7.1.2 Formatted input: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istream& operator>>(basic_ios<char_type, traits_type>& | |
(*__pf)(basic_ios<char_type, traits_type>&)); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istream& get(char_type& __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istream& get(char_type* __s, streamsize __n); | |
basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istream& get(basic_streambuf<char_type, traits_type>& __sb); | |
basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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_TYPE_VIS_ONLY basic_istream<_CharT, _Traits>::sentry | |
{ | |
bool __ok_; | |
sentry(const sentry&); // = delete; | |
sentry& operator=(const sentry&); // = delete; | |
public: | |
explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); | |
// ~sentry() = default; | |
_LIBCPP_INLINE_VISIBILITY | |
_LIBCPP_EXPLICIT | |
operator bool() const {return __ok_;} | |
}; | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, | |
bool __noskipws) | |
: __ok_(false) | |
{ | |
if (__is.good()) | |
{ | |
if (__is.tie()) | |
__is.tie()->flush(); | |
if (!__noskipws && (__is.flags() & ios_base::skipws)) | |
{ | |
typedef istreambuf_iterator<_CharT, _Traits> _Ip; | |
const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc()); | |
_Ip __i(__is); | |
_Ip __eof; | |
for (; __i != __eof; ++__i) | |
if (!__ct.is(__ct.space, *__i)) | |
break; | |
if (__i == __eof) | |
__is.setstate(ios_base::failbit | ios_base::eofbit); | |
} | |
__ok_ = __is.good(); | |
} | |
else | |
__is.setstate(ios_base::failbit); | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
void | |
basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs) | |
{ | |
_VSTD::swap(__gc_, __rhs.__gc_); | |
basic_ios<char_type, traits_type>::swap(__rhs); | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(long& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(long long& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(float& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(double& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(long double& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(bool& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(void*& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(short& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
long __temp; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp); | |
if (__temp < numeric_limits<short>::min()) | |
{ | |
__err |= ios_base::failbit; | |
__n = numeric_limits<short>::min(); | |
} | |
else if (__temp > numeric_limits<short>::max()) | |
{ | |
__err |= ios_base::failbit; | |
__n = numeric_limits<short>::max(); | |
} | |
else | |
__n = static_cast<short>(__temp); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_istream<_CharT, _Traits>& | |
basic_istream<_CharT, _Traits>::operator>>(int& __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef istreambuf_iterator<char_type, traits_type> _Ip; | |
typedef num_get<char_type, _Ip> _Fp; | |
ios_base::iostate __err = ios_base::goodbit; | |
long __temp; | |
use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp); | |
if (__temp < numeric_limits<int>::min()) | |
{ | |
__err |= ios_base::failbit; | |
__n = numeric_limits<int>::min(); | |
} | |
else if (__temp > numeric_limits<int>::max()) | |
{ | |
__err |= ios_base::failbit; | |
__n = numeric_limits<int>::max(); | |
} | |
else | |
__n = static_cast<int>(__temp); | |
this->setstate(__err); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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_; | |
if (traits_type::eq_int_type(__i, __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_; | |
if (traits_type::eq_int_type(__i, __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(); | |
if (traits_type::eq_int_type(__r, traits_type::eof())) | |
this->setstate(ios_base::eofbit); | |
} | |
#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) | |
{ | |
__gc_ = this->rdbuf()->sgetn(__s, __n); | |
if (__gc_ != __n) | |
this->setstate(ios_base::failbit | ios_base::eofbit); | |
} | |
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) | |
{ | |
__gc_ = 0; | |
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 | |
this->clear(this->rdstate() & ~ios_base::eofbit); | |
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 | |
this->clear(this->rdstate() & ~ios_base::eofbit); | |
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 | |
this->clear(this->rdstate() & ~ios_base::eofbit); | |
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 | |
this->clear(this->rdstate() & ~ios_base::eofbit); | |
sentry __sen(*this, true); | |
if (__sen) | |
{ | |
if (this->rdbuf()->pubseekoff(__off, __dir, 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>& | |
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_TYPE_VIS_ONLY 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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_iostream& __rhs); | |
public: | |
}; | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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; | |
} | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>) | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // _LIBCPP_ISTREAM | |
diff --git a/include/list b/include/list | |
index 44b20e2..cff0a85 100644 | |
--- a/include/list | |
+++ b/include/list | |
@@ -1,2389 +1,2404 @@ | |
// -*- 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); | |
explicit list(size_type n, const allocator_type& a); // C++14 | |
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_traits<allocator_type>::is_always_equal::value); // C++17 | |
void clear() noexcept; | |
void splice(const_iterator position, list& x); | |
void splice(const_iterator position, list&& x); | |
void splice(const_iterator position, list& x, const_iterator i); | |
void splice(const_iterator position, list&& x, const_iterator i); | |
void splice(const_iterator position, list& x, const_iterator first, | |
const_iterator last); | |
void splice(const_iterator position, list&& x, const_iterator first, | |
const_iterator last); | |
void remove(const value_type& value); | |
template <class Pred> void remove_if(Pred pred); | |
void unique(); | |
template <class BinaryPredicate> | |
void unique(BinaryPredicate binary_pred); | |
void merge(list& x); | |
void merge(list&& x); | |
template <class Compare> | |
void merge(list& x, Compare comp); | |
template <class Compare> | |
void merge(list&& x, Compare comp); | |
void sort(); | |
template <class Compare> | |
void sort(Compare comp); | |
void reverse() noexcept; | |
}; | |
template <class T, class Alloc> | |
bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y); | |
template <class T, class Alloc> | |
void swap(list<T,Alloc>& x, list<T,Alloc>& y) | |
noexcept(noexcept(x.swap(y))); | |
} // std | |
*/ | |
#include <__config> | |
#include <memory> | |
#include <limits> | |
#include <initializer_list> | |
#include <iterator> | |
#include <algorithm> | |
#include <type_traits> | |
#include <__undef_min_max> | |
#include <__debug> | |
#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; | |
template <class _Tp, class _VoidPtr> | |
struct __list_node_pointer_traits { | |
typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type | |
__node_pointer; | |
typedef typename __rebind_pointer<_VoidPtr, __list_node_base<_Tp, _VoidPtr> >::type | |
__base_pointer; | |
#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB) | |
typedef __base_pointer __link_pointer; | |
#else | |
typedef typename conditional< | |
is_pointer<_VoidPtr>::value, | |
__base_pointer, | |
__node_pointer | |
>::type __link_pointer; | |
#endif | |
typedef typename conditional< | |
is_same<__link_pointer, __node_pointer>::value, | |
__base_pointer, | |
__node_pointer | |
>::type __non_link_pointer; | |
static _LIBCPP_INLINE_VISIBILITY | |
__link_pointer __unsafe_link_pointer_cast(__link_pointer __p) { | |
return __p; | |
} | |
static _LIBCPP_INLINE_VISIBILITY | |
__link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) { | |
return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p)); | |
} | |
}; | |
template <class _Tp, class _VoidPtr> | |
struct __list_node_base | |
{ | |
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; | |
typedef typename _NodeTraits::__node_pointer __node_pointer; | |
typedef typename _NodeTraits::__base_pointer __base_pointer; | |
typedef typename _NodeTraits::__link_pointer __link_pointer; | |
__link_pointer __prev_; | |
__link_pointer __next_; | |
_LIBCPP_INLINE_VISIBILITY | |
__list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())), | |
__next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {} | |
_LIBCPP_INLINE_VISIBILITY | |
__base_pointer __self() { | |
return pointer_traits<__base_pointer>::pointer_to(*this); | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
__node_pointer __as_node() { | |
return static_cast<__node_pointer>(__self()); | |
} | |
}; | |
template <class _Tp, class _VoidPtr> | |
struct __list_node | |
: public __list_node_base<_Tp, _VoidPtr> | |
{ | |
_Tp __value_; | |
typedef __list_node_base<_Tp, _VoidPtr> __base; | |
typedef typename __base::__link_pointer __link_pointer; | |
_LIBCPP_INLINE_VISIBILITY | |
__link_pointer __as_link() { | |
return static_cast<__link_pointer>(__base::__self()); | |
} | |
}; | |
template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY list; | |
template <class _Tp, class _Alloc> class __list_imp; | |
template <class _Tp, class _VoidPtr> class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator; | |
template <class _Tp, class _VoidPtr> | |
class _LIBCPP_TYPE_VIS_ONLY __list_iterator | |
{ | |
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; | |
typedef typename _NodeTraits::__link_pointer __link_pointer; | |
__link_pointer __ptr_; | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT | |
: __ptr_(__p) | |
{ | |
__get_db()->__insert_ic(this, __c); | |
} | |
#else | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __list_iterator(__link_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 __rebind_pointer<_VoidPtr, value_type>::type pointer; | |
typedef typename pointer_traits<pointer>::difference_type difference_type; | |
_LIBCPP_INLINE_VISIBILITY | |
__list_iterator() _NOEXCEPT : __ptr_(nullptr) | |
{ | |
#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_->__as_node()->__value_; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), | |
"Attempted to dereference a non-dereferenceable list::iterator"); | |
#endif | |
return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_); | |
} | |
_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) | |
{ | |
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_TYPE_VIS_ONLY __list_const_iterator | |
{ | |
typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; | |
typedef typename _NodeTraits::__link_pointer __link_pointer; | |
__link_pointer __ptr_; | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT | |
: __ptr_(__p) | |
{ | |
__get_db()->__insert_ic(this, __c); | |
} | |
#else | |
_LIBCPP_INLINE_VISIBILITY | |
explicit __list_const_iterator(__link_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 __rebind_pointer<_VoidPtr, const value_type>::type pointer; | |
typedef typename pointer_traits<pointer>::difference_type difference_type; | |
_LIBCPP_INLINE_VISIBILITY | |
__list_const_iterator() _NOEXCEPT : __ptr_(nullptr) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_i(this); | |
#endif | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
__list_const_iterator(const __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_->__as_node()->__value_; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), | |
"Attempted to dereference a non-dereferenceable list::iterator"); | |
#endif | |
return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_); | |
} | |
_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) | |
{ | |
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 __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator; | |
typedef allocator_traits<__node_allocator> __node_alloc_traits; | |
typedef typename __node_alloc_traits::pointer __node_pointer; | |
typedef typename __node_alloc_traits::pointer __node_const_pointer; | |
typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits; | |
typedef typename __node_pointer_traits::__link_pointer __link_pointer; | |
typedef __link_pointer __link_const_pointer; | |
typedef typename __alloc_traits::pointer pointer; | |
typedef typename __alloc_traits::const_pointer const_pointer; | |
typedef typename __alloc_traits::difference_type difference_type; | |
typedef typename __rebind_alloc_helper<__alloc_traits, __node_base>::type __node_base_allocator; | |
typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer; | |
__node_base __end_; | |
__compressed_pair<size_type, __node_allocator> __size_alloc_; | |
_LIBCPP_INLINE_VISIBILITY | |
__link_pointer __end_as_link() const _NOEXCEPT { | |
return __node_pointer_traits::__unsafe_link_pointer_cast( | |
const_cast<__node_base&>(__end_).__self()); | |
} | |
_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();} | |
+ _LIBCPP_INLINE_VISIBILITY | |
static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT; | |
+ _LIBCPP_INLINE_VISIBILITY | |
__list_imp() | |
_NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value); | |
+ _LIBCPP_INLINE_VISIBILITY | |
__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(__end_as_link(), this); | |
#else | |
return iterator(__end_as_link()); | |
#endif | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
const_iterator end() const _NOEXCEPT | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
return const_iterator(__end_as_link(), this); | |
#else | |
return const_iterator(__end_as_link()); | |
#endif | |
} | |
void swap(__list_imp& __c) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT; | |
#else | |
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || | |
__is_nothrow_swappable<allocator_type>::value); | |
#endif | |
_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 | |
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 | |
+inline | |
void | |
__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l) | |
_NOEXCEPT | |
{ | |
__f->__prev_->__next_ = __l->__next_; | |
__l->__next_->__prev_ = __f->__prev_; | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
__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 | |
+inline | |
__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(); | |
__link_pointer __f = __end_.__next_; | |
__link_pointer __l = __end_as_link(); | |
__unlink_nodes(__f, __l->__prev_); | |
__sz() = 0; | |
while (__f != __l) | |
{ | |
__node_pointer __np = __f->__as_node(); | |
__f = __f->__next_; | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); | |
__node_alloc_traits::deallocate(__na, __np, 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) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT | |
#else | |
_NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || | |
__is_nothrow_swappable<allocator_type>::value) | |
#endif | |
{ | |
_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_allocator(__node_alloc(), __c.__node_alloc()); | |
swap(__sz(), __c.__sz()); | |
swap(__end_, __c.__end_); | |
if (__sz() == 0) | |
__end_.__next_ = __end_.__prev_ = __end_as_link(); | |
else | |
__end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link(); | |
if (__c.__sz() == 0) | |
__c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link(); | |
else | |
__c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link(); | |
#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_ == __c.__end_as_link()) | |
{ | |
__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_ == __end_as_link()) | |
{ | |
__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_TYPE_VIS_ONLY 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; | |
typedef typename base::__node_base __node_base; | |
typedef typename base::__node_base_pointer __node_base_pointer; | |
typedef typename base::__link_pointer __link_pointer; | |
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 | |
explicit list(const allocator_type& __a) : base(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
explicit list(size_type __n); | |
#if _LIBCPP_STD_VER > 11 | |
explicit list(size_type __n, const allocator_type& __a); | |
#endif | |
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); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
list(list&& __c) | |
_NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); | |
+ _LIBCPP_INLINE_VISIBILITY | |
list(list&& __c, const allocator_type& __a); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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_->__as_node()->__value_; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
const_reference front() const | |
{ | |
_LIBCPP_ASSERT(!empty(), "list::front called on empty list"); | |
return base::__end_.__next_->__as_node()->__value_; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
reference back() | |
{ | |
_LIBCPP_ASSERT(!empty(), "list::back called on empty list"); | |
return base::__end_.__prev_->__as_node()->__value_; | |
} | |
_LIBCPP_INLINE_VISIBILITY | |
const_reference back() const | |
{ | |
_LIBCPP_ASSERT(!empty(), "list::back called on empty list"); | |
return base::__end_.__prev_->__as_node()->__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) | |
#if _LIBCPP_STD_VER >= 14 | |
_NOEXCEPT | |
#else | |
_NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || | |
__is_nothrow_swappable<__node_allocator>::value) | |
#endif | |
{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); | |
+ _LIBCPP_INLINE_VISIBILITY | |
void unique(); | |
template <class _BinaryPred> | |
void unique(_BinaryPred __binary_pred); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
void sort(); | |
template <class _Comp> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
static void __link_nodes (__link_pointer __p, __link_pointer __f, __link_pointer __l); | |
+ _LIBCPP_INLINE_VISIBILITY | |
void __link_nodes_at_front(__link_pointer __f, __link_pointer __l); | |
+ _LIBCPP_INLINE_VISIBILITY | |
void __link_nodes_at_back (__link_pointer __f, __link_pointer __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 | |
+inline | |
void | |
list<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l) | |
{ | |
__p->__prev_->__next_ = __f; | |
__f->__prev_ = __p->__prev_; | |
__p->__prev_ = __l; | |
__l->__next_ = __p; | |
} | |
// Link in nodes [__f, __l] at the front of the list | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
list<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l) | |
{ | |
__f->__prev_ = base::__end_as_link(); | |
__l->__next_ = base::__end_.__next_; | |
__l->__next_->__prev_ = __l; | |
base::__end_.__next_ = __f; | |
} | |
// Link in nodes [__f, __l] at the front of the list | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
list<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l) | |
{ | |
__l->__next_ = base::__end_as_link(); | |
__f->__prev_ = base::__end_.__prev_; | |
__f->__prev_->__next_ = __f; | |
base::__end_.__prev_ = __l; | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
} | |
#if _LIBCPP_STD_VER > 11 | |
template <class _Tp, class _Alloc> | |
list<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a) | |
{ | |
#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 | |
} | |
#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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a) | |
: base(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
if (__a == __c.get_allocator()) | |
splice(end(), __c); | |
else | |
{ | |
typedef move_iterator<iterator> _Ip; | |
assign(_Ip(__c.begin()), _Ip(__c.end())); | |
} | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
list<_Tp, _Alloc>& | |
list<_Tp, _Alloc>::operator=(list&& __c) | |
_NOEXCEPT_( | |
__node_alloc_traits::propagate_on_container_move_assignment::value && | |
is_nothrow_move_assignable<__node_allocator>::value) | |
{ | |
__move_assign(__c, integral_constant<bool, | |
__node_alloc_traits::propagate_on_container_move_assignment::value>()); | |
return *this; | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::__move_assign(list& __c, false_type) | |
{ | |
if (base::__node_alloc() != __c.__node_alloc()) | |
{ | |
typedef move_iterator<iterator> _Ip; | |
assign(_Ip(__c.begin()), _Ip(__c.end())); | |
} | |
else | |
__move_assign(__c, true_type()); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::__move_assign(list& __c, true_type) | |
_NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) | |
{ | |
clear(); | |
base::__move_assign_alloc(__c); | |
splice(end(), __c); | |
} | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
template <class _InpIter> | |
void | |
list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l, | |
typename enable_if<__is_input_iterator<_InpIter>::value>::type*) | |
{ | |
iterator __i = begin(); | |
iterator __e = end(); | |
for (; __f != __l && __i != __e; ++__f, ++__i) | |
*__i = *__f; | |
if (__i == __e) | |
insert(__e, __f, __l); | |
else | |
erase(__i, __e); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x) | |
{ | |
iterator __i = begin(); | |
iterator __e = end(); | |
for (; __n > 0 && __i != __e; --__n, ++__i) | |
*__i = __x; | |
if (__i == __e) | |
insert(__e, __n, __x); | |
else | |
erase(__i, __e); | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
_Alloc | |
list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT | |
{ | |
return allocator_type(base::__node_alloc()); | |
} | |
template <class _Tp, class _Alloc> | |
typename list<_Tp, _Alloc>::iterator | |
list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"list::insert(iterator, x) called with an iterator not" | |
" referring to this list"); | |
#endif | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); | |
__link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link()); | |
++base::__sz(); | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
return iterator(__hold.release()->__as_link(), this); | |
#else | |
return iterator(__hold.release()->__as_link()); | |
#endif | |
} | |
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(__p.__ptr_, this); | |
#else | |
iterator __r(__p.__ptr_); | |
#endif | |
if (__n > 0) | |
{ | |
size_type __ds = 0; | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); | |
++__ds; | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__r = iterator(__hold->__as_link(), this); | |
#else | |
__r = iterator(__hold->__as_link()); | |
#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->__as_link(); | |
__hold->__prev_ = __e.__ptr_; | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
while (true) | |
{ | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); | |
__link_pointer __prev = __e.__ptr_->__prev_; | |
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 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(__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(__p.__ptr_, this); | |
#else | |
iterator __r(__p.__ptr_); | |
#endif | |
if (__f != __l) | |
{ | |
size_type __ds = 0; | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); | |
++__ds; | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__r = iterator(__hold.get()->__as_link(), this); | |
#else | |
__r = iterator(__hold.get()->__as_link()); | |
#endif | |
__hold.release(); | |
iterator __e = __r; | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
for (++__f; __f != __l; ++__f, (void) ++__e, (void) ++__ds) | |
{ | |
__hold.reset(__node_alloc_traits::allocate(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); | |
__e.__ptr_->__next_ = __hold.get()->__as_link(); | |
__hold->__prev_ = __e.__ptr_; | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
while (true) | |
{ | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); | |
__link_pointer __prev = __e.__ptr_->__prev_; | |
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 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(__p.__ptr_, __r.__ptr_, __e.__ptr_); | |
base::__sz() += __ds; | |
} | |
return __r; | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::push_front(const value_type& __x) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); | |
__link_pointer __nl = __hold->__as_link(); | |
__link_nodes_at_front(__nl, __nl); | |
++base::__sz(); | |
__hold.release(); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::push_back(const value_type& __x) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); | |
__link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link()); | |
++base::__sz(); | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::push_front(value_type&& __x) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); | |
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link()); | |
++base::__sz(); | |
__hold.release(); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::push_back(value_type&& __x) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); | |
__link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link()); | |
++base::__sz(); | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
template <class... _Args> | |
void | |
list<_Tp, _Alloc>::emplace_front(_Args&&... __args) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); | |
__link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link()); | |
++base::__sz(); | |
__hold.release(); | |
} | |
template <class _Tp, class _Alloc> | |
template <class... _Args> | |
void | |
list<_Tp, _Alloc>::emplace_back(_Args&&... __args) | |
{ | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); | |
__link_pointer __nl = __hold->__as_link(); | |
__link_nodes_at_back(__nl, __nl); | |
++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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"list::emplace(iterator, args...) called with an iterator not" | |
" referring to this list"); | |
#endif | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); | |
__link_pointer __nl = __hold.get()->__as_link(); | |
__link_nodes(__p.__ptr_, __nl, __nl); | |
++base::__sz(); | |
__hold.release(); | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
return iterator(__nl, this); | |
#else | |
return iterator(__nl); | |
#endif | |
} | |
#endif // _LIBCPP_HAS_NO_VARIADICS | |
template <class _Tp, class _Alloc> | |
typename list<_Tp, _Alloc>::iterator | |
list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"list::insert(iterator, x) called with an iterator not" | |
" referring to this list"); | |
#endif | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); | |
__link_pointer __nl = __hold->__as_link(); | |
__link_nodes(__p.__ptr_, __nl, __nl); | |
++base::__sz(); | |
__hold.release(); | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
return iterator(__nl, this); | |
#else | |
return iterator(__nl); | |
#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(); | |
__link_pointer __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_pointer __np = __n->__as_node(); | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); | |
__node_alloc_traits::deallocate(__na, __np, 1); | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::pop_back() | |
{ | |
_LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list"); | |
__node_allocator& __na = base::__node_alloc(); | |
__link_pointer __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_pointer __np = __n->__as_node(); | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); | |
__node_alloc_traits::deallocate(__na, __np, 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 | |
_LIBCPP_ASSERT(__p != end(), | |
"list::erase(iterator) called with a non-dereferenceable iterator"); | |
__node_allocator& __na = base::__node_alloc(); | |
__link_pointer __n = __p.__ptr_; | |
__link_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_pointer __np = __n->__as_node(); | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); | |
__node_alloc_traits::deallocate(__na, __np, 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(__f.__ptr_, __l.__ptr_->__prev_); | |
while (__f != __l) | |
{ | |
__link_pointer __n = __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_pointer __np = __n->__as_node(); | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); | |
__node_alloc_traits::deallocate(__na, __np, 1); | |
} | |
} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
return iterator(__l.__ptr_, this); | |
#else | |
return iterator(__l.__ptr_); | |
#endif | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::resize(size_type __n) | |
{ | |
if (__n < base::__sz()) | |
erase(__iterator(__n), end()); | |
else if (__n > base::__sz()) | |
{ | |
__n -= base::__sz(); | |
size_type __ds = 0; | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_)); | |
++__ds; | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
iterator __r = iterator(__hold.release()->__as_link(), this); | |
#else | |
iterator __r = iterator(__hold.release()->__as_link()); | |
#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()->__as_link(); | |
__hold->__prev_ = __e.__ptr_; | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
while (true) | |
{ | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); | |
__link_pointer __prev = __e.__ptr_->__prev_; | |
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 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_at_back(__r.__ptr_, __e.__ptr_); | |
base::__sz() += __ds; | |
} | |
} | |
template <class _Tp, class _Alloc> | |
void | |
list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x) | |
{ | |
if (__n < base::__sz()) | |
erase(__iterator(__n), end()); | |
else if (__n > base::__sz()) | |
{ | |
__n -= base::__sz(); | |
size_type __ds = 0; | |
__node_allocator& __na = base::__node_alloc(); | |
typedef __allocator_destructor<__node_allocator> _Dp; | |
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1)); | |
__hold->__prev_ = 0; | |
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); | |
++__ds; | |
__link_pointer __nl = __hold.release()->__as_link(); | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
iterator __r = iterator(__nl, this); | |
#else | |
iterator __r = iterator(__nl); | |
#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()->__as_link(); | |
__hold->__prev_ = __e.__ptr_; | |
__hold.release(); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
while (true) | |
{ | |
__node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); | |
__link_pointer __prev = __e.__ptr_->__prev_; | |
__node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 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(base::__end_as_link(), __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()) | |
{ | |
__link_pointer __f = __c.__end_.__next_; | |
__link_pointer __l = __c.__end_.__prev_; | |
base::__unlink_nodes(__f, __l); | |
__link_nodes(__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_ != __c.__end_as_link()) | |
{ | |
__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_) | |
{ | |
__link_pointer __f = __i.__ptr_; | |
base::__unlink_nodes(__f, __f); | |
__link_nodes(__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; | |
} | |
__link_pointer __first = __f.__ptr_; | |
--__l; | |
__link_pointer __last = __l.__ptr_; | |
base::__unlink_nodes(__first, __last); | |
__link_nodes(__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 (__link_pointer __k = __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) | |
{ | |
list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing | |
for (const_iterator __i = begin(), __e = end(); __i != __e;) | |
{ | |
if (*__i == __x) | |
{ | |
const_iterator __j = _VSTD::next(__i); | |
for (; __j != __e && *__j == __x; ++__j) | |
; | |
__deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j); | |
__i = __j; | |
if (__i != __e) | |
++__i; | |
} | |
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); | |
if (__i != __e) | |
++__i; | |
} | |
else | |
++__i; | |
} | |
} | |
template <class _Tp, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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; | |
__link_pointer __f = __f2.__ptr_; | |
__link_pointer __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_ != __c.__end_as_link()) | |
{ | |
__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 | |
+inline | |
void | |
list<_Tp, _Alloc>::sort() | |
{ | |
sort(__less<value_type>()); | |
} | |
template <class _Tp, class _Alloc> | |
template <class _Comp> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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)) | |
{ | |
__link_pointer __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) | |
; | |
__link_pointer __f = __f2.__ptr_; | |
__link_pointer __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) | |
; | |
__link_pointer __f = __f2.__ptr_; | |
__link_pointer __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_as_link(); | |
} | |
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/ostream b/include/ostream | |
index f55fd40..efafa27 100644 | |
--- a/include/ostream | |
+++ b/include/ostream | |
@@ -1,1113 +1,1121 @@ | |
// -*- 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=(const basic_ostream& rhs) = delete; // C++14 | |
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); | |
protected: | |
basic_ostream(const basic_ostream& rhs) = delete; | |
basic_ostream(basic_ostream&& rhs); | |
// 27.7.3.3 Assign/swap | |
basic_ostream& operator=(basic_ostream& rhs) = delete; | |
basic_ostream& operator=(const basic_ostream&& rhs); | |
void swap(basic_ostream& rhs); | |
}; | |
// 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_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_ostream& __rhs); | |
#ifndef _LIBCPP_HAS_NO_DELETED_FUNCTIONS | |
basic_ostream (const basic_ostream& __rhs) = delete; | |
basic_ostream& operator=(const basic_ostream& __rhs) = delete; | |
#else | |
basic_ostream (const basic_ostream& __rhs); // not defined | |
basic_ostream& operator=(const basic_ostream& __rhs); // not defined | |
#endif | |
public: | |
// 27.7.2.4 Prefix/suffix: | |
class _LIBCPP_TYPE_VIS_ONLY sentry; | |
// 27.7.2.6 Formatted output: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ostream& operator<<(basic_ostream& (*__pf)(basic_ostream&)); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ostream& operator<<(basic_ios<char_type, traits_type>& | |
(*__pf)(basic_ios<char_type,traits_type>&)); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
pos_type tellp(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ostream& seekp(pos_type __pos); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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_TYPE_VIS_ONLY basic_ostream<_CharT, _Traits>::sentry | |
{ | |
bool __ok_; | |
basic_ostream<_CharT, _Traits>& __os_; | |
sentry(const sentry&); // = delete; | |
sentry& operator=(const sentry&); // = delete; | |
public: | |
explicit sentry(basic_ostream<_CharT, _Traits>& __os); | |
~sentry(); | |
_LIBCPP_ALWAYS_INLINE | |
_LIBCPP_EXPLICIT | |
operator bool() const {return __ok_;} | |
}; | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>::sentry::sentry(basic_ostream<_CharT, _Traits>& __os) | |
: __ok_(false), | |
__os_(__os) | |
{ | |
if (__os.good()) | |
{ | |
if (__os.tie()) | |
__os.tie()->flush(); | |
__ok_ = true; | |
} | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>::sentry::~sentry() | |
{ | |
if (__os_.rdbuf() && __os_.good() && (__os_.flags() & ios_base::unitbuf) | |
&& !uncaught_exception()) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
if (__os_.rdbuf()->pubsync() == -1) | |
__os_.setstate(ios_base::badbit); | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
} | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
basic_ostream<_CharT, _Traits>::basic_ostream(basic_ostream&& __rhs) | |
{ | |
this->move(__rhs); | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(ios_base& (*__pf)(ios_base&)) | |
{ | |
__pf(*this); | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<char_type, traits_type>* __sb) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
if (__sb) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
typedef istreambuf_iterator<_CharT, _Traits> _Ip; | |
typedef ostreambuf_iterator<_CharT, _Traits> _Op; | |
_Ip __i(__sb); | |
_Ip __eof; | |
_Op __o(*this); | |
size_t __c = 0; | |
for (; __i != __eof; ++__i, ++__o, ++__c) | |
{ | |
*__o = *__i; | |
if (__o.failed()) | |
break; | |
} | |
if (__c == 0) | |
this->setstate(ios_base::failbit); | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_failbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
} | |
else | |
this->setstate(ios_base::badbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(bool __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(short __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), | |
__flags == ios_base::oct || __flags == ios_base::hex ? | |
static_cast<long>(static_cast<unsigned short>(__n)) : | |
static_cast<long>(__n)).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(int __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), | |
__flags == ios_base::oct || __flags == ios_base::hex ? | |
static_cast<long>(static_cast<unsigned int>(__n)) : | |
static_cast<long>(__n)).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), static_cast<unsigned long>(__n)).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(long __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(long long __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(float __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), static_cast<double>(__n)).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(double __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(long double __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::operator<<(const void* __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef num_put<char_type, ostreambuf_iterator<char_type, traits_type> > _Fp; | |
const _Fp& __f = use_facet<_Fp>(this->getloc()); | |
if (__f.put(*this, *this, this->fill(), __n).failed()) | |
this->setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template<class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
__put_character_sequence(basic_ostream<_CharT, _Traits>& __os, | |
const _CharT* __str, size_t __len) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
typename basic_ostream<_CharT, _Traits>::sentry __s(__os); | |
if (__s) | |
{ | |
typedef ostreambuf_iterator<_CharT, _Traits> _Ip; | |
if (__pad_and_output(_Ip(__os), | |
__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, _CharT __c) | |
{ | |
return _VSTD::__put_character_sequence(__os, &__c, 1); | |
} | |
template<class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, char __cn) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
typename basic_ostream<_CharT, _Traits>::sentry __s(__os); | |
if (__s) | |
{ | |
_CharT __c = __os.widen(__cn); | |
typedef ostreambuf_iterator<_CharT, _Traits> _Ip; | |
if (__pad_and_output(_Ip(__os), | |
&__c, | |
(__os.flags() & ios_base::adjustfield) == ios_base::left ? | |
&__c + 1 : | |
&__c, | |
&__c + 1, | |
__os, | |
__os.fill()).failed()) | |
__os.setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
__os.__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return __os; | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, char __c) | |
{ | |
return _VSTD::__put_character_sequence(__os, &__c, 1); | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, signed char __c) | |
{ | |
return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) | |
{ | |
return _VSTD::__put_character_sequence(__os, (char *) &__c, 1); | |
} | |
template<class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __str) | |
{ | |
return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); | |
} | |
template<class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __strn) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
typename basic_ostream<_CharT, _Traits>::sentry __s(__os); | |
if (__s) | |
{ | |
typedef ostreambuf_iterator<_CharT, _Traits> _Ip; | |
size_t __len = char_traits<char>::length(__strn); | |
const int __bs = 100; | |
_CharT __wbb[__bs]; | |
_CharT* __wb = __wbb; | |
unique_ptr<_CharT, void(*)(void*)> __h(0, free); | |
if (__len > __bs) | |
{ | |
__wb = (_CharT*)malloc(__len*sizeof(_CharT)); | |
if (__wb == 0) | |
__throw_bad_alloc(); | |
__h.reset(__wb); | |
} | |
for (_CharT* __p = __wb; *__strn != '\0'; ++__strn, ++__p) | |
*__p = __os.widen(*__strn); | |
if (__pad_and_output(_Ip(__os), | |
__wb, | |
(__os.flags() & ios_base::adjustfield) == ios_base::left ? | |
__wb + __len : | |
__wb, | |
__wb + __len, | |
__os, | |
__os.fill()).failed()) | |
__os.setstate(ios_base::badbit | ios_base::failbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
__os.__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return __os; | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, const char* __str) | |
{ | |
return _VSTD::__put_character_sequence(__os, __str, _Traits::length(__str)); | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, const signed char* __str) | |
{ | |
const char *__s = (const char *) __str; | |
return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); | |
} | |
template<class _Traits> | |
basic_ostream<char, _Traits>& | |
operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __str) | |
{ | |
const char *__s = (const char *) __str; | |
return _VSTD::__put_character_sequence(__os, __s, _Traits::length(__s)); | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::put(char_type __c) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __s(*this); | |
if (__s) | |
{ | |
typedef ostreambuf_iterator<_CharT, _Traits> _Op; | |
_Op __o(*this); | |
*__o = __c; | |
if (__o.failed()) | |
this->setstate(ios_base::badbit); | |
} | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
} | |
catch (...) | |
{ | |
this->__set_badbit_and_consider_rethrow(); | |
} | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
return *this; | |
} | |
template <class _CharT, class _Traits> | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n) | |
{ | |
#ifndef _LIBCPP_NO_EXCEPTIONS | |
try | |
{ | |
#endif // _LIBCPP_NO_EXCEPTIONS | |
sentry __sen(*this); | |
if (__sen && __n) | |
{ | |
if (this->rdbuf()->sputn(__s, __n) != __n) | |
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>::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 | |
+inline | |
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 | |
+inline | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::seekp(pos_type __pos) | |
{ | |
sentry __s(*this); | |
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 | |
+inline | |
basic_ostream<_CharT, _Traits>& | |
basic_ostream<_CharT, _Traits>::seekp(off_type __off, ios_base::seekdir __dir) | |
{ | |
sentry __s(*this); | |
if (!this->fail()) | |
{ | |
if (this->rdbuf()->pubseekoff(__off, __dir, 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>& | |
endl(basic_ostream<_CharT, _Traits>& __os) | |
{ | |
__os.put(__os.widen('\n')); | |
__os.flush(); | |
return __os; | |
} | |
template <class _CharT, class _Traits> | |
inline _LIBCPP_INLINE_VISIBILITY | |
basic_ostream<_CharT, _Traits>& | |
ends(basic_ostream<_CharT, _Traits>& __os) | |
{ | |
__os.put(_CharT()); | |
return __os; | |
} | |
template <class _CharT, class _Traits> | |
inline _LIBCPP_INLINE_VISIBILITY | |
basic_ostream<_CharT, _Traits>& | |
flush(basic_ostream<_CharT, _Traits>& __os) | |
{ | |
__os.flush(); | |
return __os; | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Stream, class _Tp> | |
inline _LIBCPP_INLINE_VISIBILITY | |
typename enable_if | |
< | |
!is_lvalue_reference<_Stream>::value && | |
is_base_of<ios_base, _Stream>::value, | |
_Stream&& | |
>::type | |
operator<<(_Stream&& __os, const _Tp& __x) | |
{ | |
__os << __x; | |
return _VSTD::move(__os); | |
} | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template<class _CharT, class _Traits, class _Allocator> | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, | |
const basic_string<_CharT, _Traits, _Allocator>& __str) | |
{ | |
return _VSTD::__put_character_sequence(__os, __str.data(), __str.size()); | |
} | |
template <class _CharT, class _Traits> | |
inline _LIBCPP_INLINE_VISIBILITY | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, const error_code& __ec) | |
{ | |
return __os << __ec.category().name() << ':' << __ec.value(); | |
} | |
template<class _CharT, class _Traits, class _Yp> | |
inline _LIBCPP_INLINE_VISIBILITY | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p) | |
{ | |
return __os << __p.get(); | |
} | |
template <class _CharT, class _Traits, size_t _Size> | |
basic_ostream<_CharT, _Traits>& | |
operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) | |
{ | |
return __os << __x.template to_string<_CharT, _Traits> | |
(use_facet<ctype<_CharT> >(__os.getloc()).widen('0'), | |
use_facet<ctype<_CharT> >(__os.getloc()).widen('1')); | |
} | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<char>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<wchar_t>) | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // _LIBCPP_OSTREAM | |
diff --git a/include/queue b/include/queue | |
index 81b83a7..eb1a21a 100644 | |
--- a/include/queue | |
+++ b/include/queue | |
@@ -1,719 +1,734 @@ | |
// -*- 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 = deque<_Tp> > class _LIBCPP_TYPE_VIS_ONLY queue; | |
template <class _Tp, class _Container> | |
_LIBCPP_INLINE_VISIBILITY | |
bool | |
operator==(const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); | |
template <class _Tp, class _Container> | |
_LIBCPP_INLINE_VISIBILITY | |
bool | |
operator< (const queue<_Tp, _Container>& __x,const queue<_Tp, _Container>& __y); | |
template <class _Tp, class _Container /*= deque<_Tp>*/> | |
class _LIBCPP_TYPE_VIS_ONLY 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; | |
static_assert((is_same<_Tp, value_type>::value), "" ); | |
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_TYPE_VIS_ONLY 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_TYPE_VIS_ONLY 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; | |
static_assert((is_same<_Tp, value_type>::value), "" ); | |
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) {} | |
+ _LIBCPP_INLINE_VISIBILITY | |
priority_queue(const value_compare& __comp, const container_type& __c); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit priority_queue(const value_compare& __comp, container_type&& __c); | |
#endif | |
template <class _InputIter> | |
+ _LIBCPP_INLINE_VISIBILITY | |
priority_queue(_InputIter __f, _InputIter __l, | |
const value_compare& __comp = value_compare()); | |
template <class _InputIter> | |
+ _LIBCPP_INLINE_VISIBILITY | |
priority_queue(_InputIter __f, _InputIter __l, | |
const value_compare& __comp, const container_type& __c); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _InputIter> | |
+ _LIBCPP_INLINE_VISIBILITY | |
priority_queue(_InputIter __f, _InputIter __l, | |
const value_compare& __comp, container_type&& __c); | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _Alloc> | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit priority_queue(const _Alloc& __a, | |
typename enable_if<uses_allocator<container_type, | |
_Alloc>::value>::type* = 0); | |
template <class _Alloc> | |
+ _LIBCPP_INLINE_VISIBILITY | |
priority_queue(const value_compare& __comp, const _Alloc& __a, | |
typename enable_if<uses_allocator<container_type, | |
_Alloc>::value>::type* = 0); | |
template <class _Alloc> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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();} | |
+ _LIBCPP_INLINE_VISIBILITY | |
void push(const value_type& __v); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
void push(value_type&& __v); | |
#ifndef _LIBCPP_HAS_NO_VARIADICS | |
- template <class... _Args> void emplace(_Args&&... __args); | |
+ template <class... _Args> _LIBCPP_INLINE_VISIBILITY void emplace(_Args&&... __args); | |
#endif | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
void pop(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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_TYPE_VIS_ONLY uses_allocator<priority_queue<_Tp, _Container, _Compare>, _Alloc> | |
: public uses_allocator<_Container, _Alloc> | |
{ | |
}; | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // _LIBCPP_QUEUE | |
diff --git a/include/sstream b/include/sstream | |
index 27ae78f..99343f6 100644 | |
--- a/include/sstream | |
+++ b/include/sstream | |
@@ -1,977 +1,1002 @@ | |
// -*- C++ -*- | |
//===--------------------------- sstream ----------------------------------===// | |
// | |
// The LLVM Compiler Infrastructure | |
// | |
// This file is dual licensed under the MIT and the University of Illinois Open | |
// Source Licenses. See LICENSE.TXT for details. | |
// | |
//===----------------------------------------------------------------------===// | |
#ifndef _LIBCPP_SSTREAM | |
#define _LIBCPP_SSTREAM | |
/* | |
sstream synopsis | |
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > | |
class basic_stringbuf | |
: public basic_streambuf<charT, traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
typedef Allocator allocator_type; | |
// 27.8.1.1 Constructors: | |
explicit basic_stringbuf(ios_base::openmode which = ios_base::in | ios_base::out); | |
explicit basic_stringbuf(const basic_string<char_type, traits_type, allocator_type>& str, | |
ios_base::openmode which = ios_base::in | ios_base::out); | |
basic_stringbuf(basic_stringbuf&& rhs); | |
// 27.8.1.2 Assign and swap: | |
basic_stringbuf& operator=(basic_stringbuf&& rhs); | |
void swap(basic_stringbuf& rhs); | |
// 27.8.1.3 Get and set: | |
basic_string<char_type, traits_type, allocator_type> str() const; | |
void str(const basic_string<char_type, traits_type, allocator_type>& s); | |
protected: | |
// 27.8.1.4 Overridden virtual functions: | |
virtual int_type underflow(); | |
virtual int_type pbackfail(int_type c = traits_type::eof()); | |
virtual int_type overflow (int_type c = traits_type::eof()); | |
virtual basic_streambuf<char_type, traits_type>* setbuf(char_type*, streamsize); | |
virtual pos_type seekoff(off_type off, ios_base::seekdir way, | |
ios_base::openmode which = ios_base::in | ios_base::out); | |
virtual pos_type seekpos(pos_type sp, | |
ios_base::openmode which = ios_base::in | ios_base::out); | |
}; | |
template <class charT, class traits, class Allocator> | |
void swap(basic_stringbuf<charT, traits, Allocator>& x, | |
basic_stringbuf<charT, traits, Allocator>& y); | |
typedef basic_stringbuf<char> stringbuf; | |
typedef basic_stringbuf<wchar_t> wstringbuf; | |
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > | |
class basic_istringstream | |
: public basic_istream<charT, traits> | |
{ | |
public: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
typedef Allocator allocator_type; | |
// 27.8.2.1 Constructors: | |
explicit basic_istringstream(ios_base::openmode which = ios_base::in); | |
explicit basic_istringstream(const basic_string<char_type, traits_type,allocator_type>& str, | |
ios_base::openmode which = ios_base::in); | |
basic_istringstream(basic_istringstream&& rhs); | |
// 27.8.2.2 Assign and swap: | |
basic_istringstream& operator=(basic_istringstream&& rhs); | |
void swap(basic_istringstream& rhs); | |
// 27.8.2.3 Members: | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
basic_string<char_type, traits_type, allocator_type> str() const; | |
void str(const basic_string<char_type, traits_type, allocator_type>& s); | |
}; | |
template <class charT, class traits, class Allocator> | |
void swap(basic_istringstream<charT, traits, Allocator>& x, | |
basic_istringstream<charT, traits, Allocator>& y); | |
typedef basic_istringstream<char> istringstream; | |
typedef basic_istringstream<wchar_t> wistringstream; | |
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > | |
class basic_ostringstream | |
: public basic_ostream<charT, traits> | |
{ | |
public: | |
// types: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
typedef Allocator allocator_type; | |
// 27.8.3.1 Constructors/destructor: | |
explicit basic_ostringstream(ios_base::openmode which = ios_base::out); | |
explicit basic_ostringstream(const basic_string<char_type, traits_type, allocator_type>& str, | |
ios_base::openmode which = ios_base::out); | |
basic_ostringstream(basic_ostringstream&& rhs); | |
// 27.8.3.2 Assign/swap: | |
basic_ostringstream& operator=(basic_ostringstream&& rhs); | |
void swap(basic_ostringstream& rhs); | |
// 27.8.3.3 Members: | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
basic_string<char_type, traits_type, allocator_type> str() const; | |
void str(const basic_string<char_type, traits_type, allocator_type>& s); | |
}; | |
template <class charT, class traits, class Allocator> | |
void swap(basic_ostringstream<charT, traits, Allocator>& x, | |
basic_ostringstream<charT, traits, Allocator>& y); | |
typedef basic_ostringstream<char> ostringstream; | |
typedef basic_ostringstream<wchar_t> wostringstream; | |
template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > | |
class basic_stringstream | |
: public basic_iostream<charT, traits> | |
{ | |
public: | |
// types: | |
typedef charT char_type; | |
typedef traits traits_type; | |
typedef typename traits_type::int_type int_type; | |
typedef typename traits_type::pos_type pos_type; | |
typedef typename traits_type::off_type off_type; | |
typedef Allocator allocator_type; | |
// constructors/destructor | |
explicit basic_stringstream(ios_base::openmode which = ios_base::out|ios_base::in); | |
explicit basic_stringstream(const basic_string<char_type, traits_type, allocator_type>& str, | |
ios_base::openmode which = ios_base::out|ios_base::in); | |
basic_stringstream(basic_stringstream&& rhs); | |
// 27.8.5.1 Assign/swap: | |
basic_stringstream& operator=(basic_stringstream&& rhs); | |
void swap(basic_stringstream& rhs); | |
// Members: | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
basic_string<char_type, traits_type, allocator_type> str() const; | |
void str(const basic_string<char_type, traits_type, allocator_type>& str); | |
}; | |
template <class charT, class traits, class Allocator> | |
void swap(basic_stringstream<charT, traits, Allocator>& x, | |
basic_stringstream<charT, traits, Allocator>& y); | |
typedef basic_stringstream<char> stringstream; | |
typedef basic_stringstream<wchar_t> wstringstream; | |
} // std | |
*/ | |
#include <__config> | |
#include <ostream> | |
#include <istream> | |
#include <string> | |
#include <__undef_min_max> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
// basic_stringbuf | |
template <class _CharT, class _Traits, class _Allocator> | |
class _LIBCPP_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_stringbuf(ios_base::openmode __wch = ios_base::in | ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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 | |
+inline | |
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_) | |
{ | |
char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); | |
ptrdiff_t __binp = -1; | |
ptrdiff_t __ninp = -1; | |
ptrdiff_t __einp = -1; | |
if (__rhs.eback() != nullptr) | |
{ | |
__binp = __rhs.eback() - __p; | |
__ninp = __rhs.gptr() - __p; | |
__einp = __rhs.egptr() - __p; | |
} | |
ptrdiff_t __bout = -1; | |
ptrdiff_t __nout = -1; | |
ptrdiff_t __eout = -1; | |
if (__rhs.pbase() != nullptr) | |
{ | |
__bout = __rhs.pbase() - __p; | |
__nout = __rhs.pptr() - __p; | |
__eout = __rhs.epptr() - __p; | |
} | |
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; | |
__str_ = _VSTD::move(__rhs.__str_); | |
__p = const_cast<char_type*>(__str_.data()); | |
if (__binp != -1) | |
this->setg(__p + __binp, __p + __ninp, __p + __einp); | |
if (__bout != -1) | |
{ | |
this->setp(__p + __bout, __p + __eout); | |
this->pbump(__nout); | |
} | |
__hm_ = __hm == -1 ? nullptr : __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) | |
{ | |
char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); | |
ptrdiff_t __binp = -1; | |
ptrdiff_t __ninp = -1; | |
ptrdiff_t __einp = -1; | |
if (__rhs.eback() != nullptr) | |
{ | |
__binp = __rhs.eback() - __p; | |
__ninp = __rhs.gptr() - __p; | |
__einp = __rhs.egptr() - __p; | |
} | |
ptrdiff_t __bout = -1; | |
ptrdiff_t __nout = -1; | |
ptrdiff_t __eout = -1; | |
if (__rhs.pbase() != nullptr) | |
{ | |
__bout = __rhs.pbase() - __p; | |
__nout = __rhs.pptr() - __p; | |
__eout = __rhs.epptr() - __p; | |
} | |
ptrdiff_t __hm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; | |
__str_ = _VSTD::move(__rhs.__str_); | |
__p = const_cast<char_type*>(__str_.data()); | |
if (__binp != -1) | |
this->setg(__p + __binp, __p + __ninp, __p + __einp); | |
else | |
this->setg(nullptr, nullptr, nullptr); | |
if (__bout != -1) | |
{ | |
this->setp(__p + __bout, __p + __eout); | |
this->pbump(__nout); | |
} | |
else | |
this->setp(nullptr, nullptr); | |
__hm_ = __hm == -1 ? nullptr : __p + __hm; | |
__mode_ = __rhs.__mode_; | |
__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) | |
{ | |
char_type* __p = const_cast<char_type*>(__rhs.__str_.data()); | |
ptrdiff_t __rbinp = -1; | |
ptrdiff_t __rninp = -1; | |
ptrdiff_t __reinp = -1; | |
if (__rhs.eback() != nullptr) | |
{ | |
__rbinp = __rhs.eback() - __p; | |
__rninp = __rhs.gptr() - __p; | |
__reinp = __rhs.egptr() - __p; | |
} | |
ptrdiff_t __rbout = -1; | |
ptrdiff_t __rnout = -1; | |
ptrdiff_t __reout = -1; | |
if (__rhs.pbase() != nullptr) | |
{ | |
__rbout = __rhs.pbase() - __p; | |
__rnout = __rhs.pptr() - __p; | |
__reout = __rhs.epptr() - __p; | |
} | |
ptrdiff_t __rhm = __rhs.__hm_ == nullptr ? -1 : __rhs.__hm_ - __p; | |
__p = const_cast<char_type*>(__str_.data()); | |
ptrdiff_t __lbinp = -1; | |
ptrdiff_t __lninp = -1; | |
ptrdiff_t __leinp = -1; | |
if (this->eback() != nullptr) | |
{ | |
__lbinp = this->eback() - __p; | |
__lninp = this->gptr() - __p; | |
__leinp = this->egptr() - __p; | |
} | |
ptrdiff_t __lbout = -1; | |
ptrdiff_t __lnout = -1; | |
ptrdiff_t __leout = -1; | |
if (this->pbase() != nullptr) | |
{ | |
__lbout = this->pbase() - __p; | |
__lnout = this->pptr() - __p; | |
__leout = this->epptr() - __p; | |
} | |
ptrdiff_t __lhm = __hm_ == nullptr ? -1 : __hm_ - __p; | |
_VSTD::swap(__mode_, __rhs.__mode_); | |
__str_.swap(__rhs.__str_); | |
__p = const_cast<char_type*>(__str_.data()); | |
if (__rbinp != -1) | |
this->setg(__p + __rbinp, __p + __rninp, __p + __reinp); | |
else | |
this->setg(nullptr, nullptr, nullptr); | |
if (__rbout != -1) | |
{ | |
this->setp(__p + __rbout, __p + __reout); | |
this->pbump(__rnout); | |
} | |
else | |
this->setp(nullptr, nullptr); | |
__hm_ = __rhm == -1 ? nullptr : __p + __rhm; | |
__p = const_cast<char_type*>(__rhs.__str_.data()); | |
if (__lbinp != -1) | |
__rhs.setg(__p + __lbinp, __p + __lninp, __p + __leinp); | |
else | |
__rhs.setg(nullptr, nullptr, nullptr); | |
if (__lbout != -1) | |
{ | |
__rhs.setp(__p + __lbout, __p + __leout); | |
__rhs.pbump(__lnout); | |
} | |
else | |
__rhs.setp(nullptr, nullptr); | |
__rhs.__hm_ = __lhm == -1 ? nullptr : __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 | |
+inline | |
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_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_istringstream(ios_base::openmode __wch = ios_base::in); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_istringstream(const string_type& __s, | |
ios_base::openmode __wch = ios_base::in); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_istringstream(basic_istringstream&& __rhs); | |
// 27.8.2.2 Assign and swap: | |
basic_istringstream& operator=(basic_istringstream&& __rhs); | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_istringstream& __rhs); | |
// 27.8.2.3 Members: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
string_type str() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
void str(const string_type& __s); | |
}; | |
template <class _CharT, class _Traits, class _Allocator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ostringstream(ios_base::openmode __wch = ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_ostringstream(const string_type& __s, | |
ios_base::openmode __wch = ios_base::out); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_ostringstream(basic_ostringstream&& __rhs); | |
// 27.8.2.2 Assign and swap: | |
basic_ostringstream& operator=(basic_ostringstream&& __rhs); | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_ostringstream& __rhs); | |
// 27.8.2.3 Members: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
string_type str() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
void str(const string_type& __s); | |
}; | |
template <class _CharT, class _Traits, class _Allocator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_stringstream(ios_base::openmode __wch = ios_base::in | ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
explicit basic_stringstream(const string_type& __s, | |
ios_base::openmode __wch = ios_base::in | ios_base::out); | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_stringstream(basic_stringstream&& __rhs); | |
// 27.8.2.2 Assign and swap: | |
basic_stringstream& operator=(basic_stringstream&& __rhs); | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
void swap(basic_stringstream& __rhs); | |
// 27.8.2.3 Members: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_stringbuf<char_type, traits_type, allocator_type>* rdbuf() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
string_type str() const; | |
+ _LIBCPP_INLINE_VISIBILITY | |
void str(const string_type& __s); | |
}; | |
template <class _CharT, class _Traits, class _Allocator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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/streambuf b/include/streambuf | |
index 603c680..ead4387 100644 | |
--- a/include/streambuf | |
+++ b/include/streambuf | |
@@ -1,575 +1,594 @@ | |
// -*- 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_TYPE_VIS_ONLY 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: | |
+ _LIBCPP_INLINE_VISIBILITY | |
locale pubimbue(const locale& __loc); | |
+ _LIBCPP_INLINE_VISIBILITY | |
locale getloc() const; | |
// 27.6.2.2.2 buffer and positioning: | |
+ _LIBCPP_INLINE_VISIBILITY | |
basic_streambuf* pubsetbuf(char_type* __s, streamsize __n); | |
+ _LIBCPP_INLINE_VISIBILITY | |
pos_type pubseekoff(off_type __off, ios_base::seekdir __way, | |
ios_base::openmode __which = ios_base::in | ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
pos_type pubseekpos(pos_type __sp, | |
ios_base::openmode __which = ios_base::in | ios_base::out); | |
+ _LIBCPP_INLINE_VISIBILITY | |
int pubsync(); | |
// Get and put areas: | |
// 27.6.2.2.3 Get area: | |
+ _LIBCPP_INLINE_VISIBILITY | |
streamsize in_avail(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type snextc(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type sbumpc(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type sgetc(); | |
+ _LIBCPP_INLINE_VISIBILITY | |
streamsize sgetn(char_type* __s, streamsize __n); | |
// 27.6.2.2.4 Putback: | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type sputbackc(char_type __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type sungetc(); | |
// 27.6.2.2.5 Put area: | |
+ _LIBCPP_INLINE_VISIBILITY | |
int_type sputc(char_type __c); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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_;} | |
+ _LIBCPP_INLINE_VISIBILITY | |
void gbump(int __n); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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_;} | |
+ _LIBCPP_INLINE_VISIBILITY | |
void pbump(int __n); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+inline | |
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 | |
+inline | |
locale | |
basic_streambuf<_CharT, _Traits>::getloc() const | |
{ | |
return __loc_; | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
int | |
basic_streambuf<_CharT, _Traits>::pubsync() | |
{ | |
return sync(); | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
streamsize | |
basic_streambuf<_CharT, _Traits>::sgetn(char_type* __s, streamsize __n) | |
{ | |
return xsgetn(__s, __n); | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
void | |
basic_streambuf<_CharT, _Traits>::gbump(int __n) | |
{ | |
__ninp_ += __n; | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
+inline | |
void | |
basic_streambuf<_CharT, _Traits>::pbump(int __n) | |
{ | |
__nout_ += __n; | |
} | |
template <class _CharT, class _Traits> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
basic_streambuf<_CharT, _Traits>::setp(char_type* __pbeg, char_type* __pend) | |
{ | |
__bout_ = __nout_ = __pbeg; | |
__eout_ = __pend; | |
} | |
template <class _CharT, class _Traits> | |
void | |
basic_streambuf<_CharT, _Traits>::imbue(const locale&) | |
{ | |
} | |
template <class _CharT, class _Traits> | |
basic_streambuf<_CharT, _Traits>* | |
basic_streambuf<_CharT, _Traits>::setbuf(char_type*, streamsize) | |
{ | |
return this; | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::pos_type | |
basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir, | |
ios_base::openmode) | |
{ | |
return pos_type(off_type(-1)); | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::pos_type | |
basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode) | |
{ | |
return pos_type(off_type(-1)); | |
} | |
template <class _CharT, class _Traits> | |
int | |
basic_streambuf<_CharT, _Traits>::sync() | |
{ | |
return 0; | |
} | |
template <class _CharT, class _Traits> | |
streamsize | |
basic_streambuf<_CharT, _Traits>::showmanyc() | |
{ | |
return 0; | |
} | |
template <class _CharT, class _Traits> | |
streamsize | |
basic_streambuf<_CharT, _Traits>::xsgetn(char_type* __s, streamsize __n) | |
{ | |
const int_type __eof = traits_type::eof(); | |
int_type __c; | |
streamsize __i = 0; | |
for (;__i < __n; ++__i, ++__s) | |
{ | |
if (__ninp_ < __einp_) | |
*__s = *__ninp_++; | |
else if ((__c = uflow()) != __eof) | |
*__s = traits_type::to_char_type(__c); | |
else | |
break; | |
} | |
return __i; | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::int_type | |
basic_streambuf<_CharT, _Traits>::underflow() | |
{ | |
return traits_type::eof(); | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::int_type | |
basic_streambuf<_CharT, _Traits>::uflow() | |
{ | |
if (underflow() == traits_type::eof()) | |
return traits_type::eof(); | |
return traits_type::to_int_type(*__ninp_++); | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::int_type | |
basic_streambuf<_CharT, _Traits>::pbackfail(int_type) | |
{ | |
return traits_type::eof(); | |
} | |
template <class _CharT, class _Traits> | |
streamsize | |
basic_streambuf<_CharT, _Traits>::xsputn(const char_type* __s, streamsize __n) | |
{ | |
streamsize __i = 0; | |
int_type __eof = traits_type::eof(); | |
while( __i < __n) | |
{ | |
if (__nout_ >= __eout_) | |
{ | |
if (overflow(traits_type::to_int_type(*__s)) == __eof) | |
break; | |
++__s; | |
++__i; | |
} | |
else | |
{ | |
streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i); | |
traits_type::copy(__nout_, __s, __chunk_size); | |
__nout_ += __chunk_size; | |
__s += __chunk_size; | |
__i += __chunk_size; | |
} | |
} | |
return __i; | |
} | |
template <class _CharT, class _Traits> | |
typename basic_streambuf<_CharT, _Traits>::int_type | |
basic_streambuf<_CharT, _Traits>::overflow(int_type) | |
{ | |
return traits_type::eof(); | |
} | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<char>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<wchar_t>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<char>) | |
_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<wchar_t>) | |
_LIBCPP_END_NAMESPACE_STD | |
#endif // _LIBCPP_STEAMBUF | |
diff --git a/include/unordered_map b/include/unordered_map | |
index 2af450b..319c71e 100644 | |
--- a/include/unordered_map | |
+++ b/include/unordered_map | |
@@ -1,2061 +1,2071 @@ | |
// -*- 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(size_type n, const allocator_type& a) | |
: unordered_map(n, hasher(), key_equal(), a) {} // C++14 | |
unordered_map(size_type n, const hasher& hf, const allocator_type& a) | |
: unordered_map(n, hf, key_equal(), a) {} // C++14 | |
template <class InputIterator> | |
unordered_map(InputIterator f, InputIterator l, size_type n, const allocator_type& a) | |
: unordered_map(f, l, n, hasher(), key_equal(), a) {} // C++14 | |
template <class InputIterator> | |
unordered_map(InputIterator f, InputIterator l, size_type n, const hasher& hf, | |
const allocator_type& a) | |
: unordered_map(f, l, n, hf, key_equal(), a) {} // C++14 | |
unordered_map(initializer_list<value_type> il, size_type n, const allocator_type& a) | |
: unordered_map(il, n, hasher(), key_equal(), a) {} // C++14 | |
unordered_map(initializer_list<value_type> il, size_type n, const hasher& hf, | |
const allocator_type& a) | |
: unordered_map(il, n, hf, key_equal(), a) {} // C++14 | |
~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>); | |
template <class... Args> | |
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 | |
template <class... Args> | |
pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 | |
template <class... Args> | |
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 | |
template <class... Args> | |
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 | |
template <class M> | |
pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 | |
template <class M> | |
pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 | |
template <class M> | |
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 | |
template <class M> | |
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 | |
iterator erase(const_iterator position); | |
iterator erase(iterator position); // C++14 | |
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(size_type n, const allocator_type& a) | |
: unordered_multimap(n, hasher(), key_equal(), a) {} // C++14 | |
unordered_multimap(size_type n, const hasher& hf, const allocator_type& a) | |
: unordered_multimap(n, hf, key_equal(), a) {} // C++14 | |
template <class InputIterator> | |
unordered_multimap(InputIterator f, InputIterator l, size_type n, const allocator_type& a) | |
: unordered_multimap(f, l, n, hasher(), key_equal(), a) {} // C++14 | |
template <class InputIterator> | |
unordered_multimap(InputIterator f, InputIterator l, size_type n, const hasher& hf, | |
const allocator_type& a) | |
: unordered_multimap(f, l, n, hf, key_equal(), a) {} // C++14 | |
unordered_multimap(initializer_list<value_type> il, size_type n, const allocator_type& a) | |
: unordered_multimap(il, n, hasher(), key_equal(), a) {} // C++14 | |
unordered_multimap(initializer_list<value_type> il, size_type n, const hasher& hf, | |
const allocator_type& a) | |
: unordered_multimap(il, n, hf, key_equal(), a) {} // C++14 | |
~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); | |
iterator erase(iterator position); // C++14 | |
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> | |
#include <tuple> | |
#include <__debug> | |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
#pragma GCC system_header | |
#endif | |
_LIBCPP_BEGIN_NAMESPACE_STD | |
template <class _Key, class _Cp, class _Hash, | |
bool = is_empty<_Hash>::value && !__libcpp_is_final<_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 _Cp& __x) const | |
{return static_cast<const _Hash&>(*this)(__x.__cc.first);} | |
_LIBCPP_INLINE_VISIBILITY | |
size_t operator()(const _Key& __x) const | |
{return static_cast<const _Hash&>(*this)(__x);} | |
void swap(__unordered_map_hasher&__y) | |
_NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) | |
{ | |
using _VSTD::swap; | |
swap(static_cast<const _Hash&>(*this), static_cast<const _Hash&>(__y)); | |
} | |
}; | |
template <class _Key, class _Cp, class _Hash> | |
class __unordered_map_hasher<_Key, _Cp, _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 _Cp& __x) const | |
{return __hash_(__x.__cc.first);} | |
_LIBCPP_INLINE_VISIBILITY | |
size_t operator()(const _Key& __x) const | |
{return __hash_(__x);} | |
void swap(__unordered_map_hasher&__y) | |
_NOEXCEPT_(__is_nothrow_swappable<_Hash>::value) | |
{ | |
using _VSTD::swap; | |
swap(__hash_, __y.__hash_); | |
} | |
}; | |
template <class _Key, class _Cp, class _Hash, bool __b> | |
inline _LIBCPP_INLINE_VISIBILITY | |
void | |
swap(__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __x, | |
__unordered_map_hasher<_Key, _Cp, _Hash, __b>& __y) | |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) | |
{ | |
__x.swap(__y); | |
} | |
template <class _Key, class _Cp, class _Pred, | |
bool = is_empty<_Pred>::value && !__libcpp_is_final<_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 _Cp& __x, const _Cp& __y) const | |
{return static_cast<const _Pred&>(*this)(__x.__cc.first, __y.__cc.first);} | |
_LIBCPP_INLINE_VISIBILITY | |
bool operator()(const _Cp& __x, const _Key& __y) const | |
{return static_cast<const _Pred&>(*this)(__x.__cc.first, __y);} | |
_LIBCPP_INLINE_VISIBILITY | |
bool operator()(const _Key& __x, const _Cp& __y) const | |
{return static_cast<const _Pred&>(*this)(__x, __y.__cc.first);} | |
void swap(__unordered_map_equal&__y) | |
_NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) | |
{ | |
using _VSTD::swap; | |
swap(static_cast<const _Pred&>(*this), static_cast<const _Pred&>(__y)); | |
} | |
}; | |
template <class _Key, class _Cp, class _Pred> | |
class __unordered_map_equal<_Key, _Cp, _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 _Cp& __x, const _Cp& __y) const | |
{return __pred_(__x.__cc.first, __y.__cc.first);} | |
_LIBCPP_INLINE_VISIBILITY | |
bool operator()(const _Cp& __x, const _Key& __y) const | |
{return __pred_(__x.__cc.first, __y);} | |
_LIBCPP_INLINE_VISIBILITY | |
bool operator()(const _Key& __x, const _Cp& __y) const | |
{return __pred_(__x, __y.__cc.first);} | |
void swap(__unordered_map_equal&__y) | |
_NOEXCEPT_(__is_nothrow_swappable<_Pred>::value) | |
{ | |
using _VSTD::swap; | |
swap(__pred_, __y.__pred_); | |
} | |
}; | |
template <class _Key, class _Cp, class _Pred, bool __b> | |
inline _LIBCPP_INLINE_VISIBILITY | |
void | |
swap(__unordered_map_equal<_Key, _Cp, _Pred, __b>& __x, | |
__unordered_map_equal<_Key, _Cp, _Pred, __b>& __y) | |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) | |
{ | |
__x.swap(__y); | |
} | |
template <class _Alloc> | |
class __hash_map_node_destructor | |
{ | |
typedef _Alloc allocator_type; | |
typedef allocator_traits<allocator_type> __alloc_traits; | |
public: | |
typedef typename __alloc_traits::pointer pointer; | |
private: | |
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_.__cc.second)); | |
if (__first_constructed) | |
__alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); | |
if (__p) | |
__alloc_traits::deallocate(__na_, __p, 1); | |
} | |
}; | |
#ifndef _LIBCPP_CXX03_LANG | |
template <class _Key, class _Tp> | |
union __hash_value_type | |
{ | |
typedef _Key key_type; | |
typedef _Tp mapped_type; | |
typedef pair<const key_type, mapped_type> value_type; | |
typedef pair<key_type, mapped_type> __nc_value_type; | |
value_type __cc; | |
__nc_value_type __nc; | |
_LIBCPP_INLINE_VISIBILITY | |
__hash_value_type& operator=(const __hash_value_type& __v) | |
{__nc = __v.__cc; return *this;} | |
_LIBCPP_INLINE_VISIBILITY | |
__hash_value_type& operator=(__hash_value_type&& __v) | |
{__nc = _VSTD::move(__v.__nc); return *this;} | |
template <class _ValueTp, | |
class = typename enable_if< | |
__is_same_uncvref<_ValueTp, value_type>::value | |
>::type | |
> | |
_LIBCPP_INLINE_VISIBILITY | |
__hash_value_type& operator=(_ValueTp&& __v) { | |
__nc = _VSTD::forward<_ValueTp>(__v); return *this; | |
} | |
private: | |
__hash_value_type(const __hash_value_type& __v) = delete; | |
__hash_value_type(__hash_value_type&& __v) = delete; | |
template <class ..._Args> | |
explicit __hash_value_type(_Args&& ...__args) = delete; | |
~__hash_value_type() = delete; | |
}; | |
#else | |
template <class _Key, class _Tp> | |
struct __hash_value_type | |
{ | |
typedef _Key key_type; | |
typedef _Tp mapped_type; | |
typedef pair<const key_type, mapped_type> value_type; | |
value_type __cc; | |
private: | |
~__hash_value_type(); | |
}; | |
#endif | |
template <class _HashIterator> | |
class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator | |
{ | |
_HashIterator __i_; | |
typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; | |
public: | |
typedef forward_iterator_tag iterator_category; | |
typedef typename _NodeTypes::__map_value_type value_type; | |
typedef typename _NodeTypes::difference_type difference_type; | |
typedef value_type& reference; | |
typedef typename _NodeTypes::__map_value_type_pointer 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 __i_->__cc;} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} | |
_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_TYPE_VIS_ONLY unordered_map; | |
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator; | |
}; | |
template <class _HashIterator> | |
class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator | |
{ | |
_HashIterator __i_; | |
typedef __hash_node_types_from_iterator<_HashIterator> _NodeTypes; | |
public: | |
typedef forward_iterator_tag iterator_category; | |
typedef typename _NodeTypes::__map_value_type value_type; | |
typedef typename _NodeTypes::difference_type difference_type; | |
typedef const value_type& reference; | |
typedef typename _NodeTypes::__const_map_value_type_pointer 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 __i_->__cc;} | |
_LIBCPP_INLINE_VISIBILITY | |
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} | |
_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_TYPE_VIS_ONLY unordered_map; | |
template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY unordered_multimap; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; | |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __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_TYPE_VIS_ONLY 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 pair<key_type, mapped_type> __nc_value_type; | |
typedef value_type& reference; | |
typedef const value_type& const_reference; | |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), | |
"Invalid allocator::value_type"); | |
private: | |
typedef __hash_value_type<key_type, mapped_type> __value_type; | |
typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; | |
typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; | |
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, | |
__value_type>::type __allocator_type; | |
typedef __hash_table<__value_type, __hasher, | |
__key_equal, __allocator_type> __table; | |
__table __table_; | |
typedef typename __table::_NodeTypes _NodeTypes; | |
typedef typename __table::__node_pointer __node_pointer; | |
typedef typename __table::__node_const_pointer __node_const_pointer; | |
typedef typename __table::__node_traits __node_traits; | |
typedef typename __table::__node_allocator __node_allocator; | |
typedef typename __table::__node __node; | |
typedef __hash_map_node_destructor<__node_allocator> _Dp; | |
typedef unique_ptr<__node, _Dp> __node_holder; | |
typedef allocator_traits<allocator_type> __alloc_traits; | |
static_assert((is_same<typename __table::__container_value_type, value_type>::value), ""); | |
static_assert((is_same<typename __table::__node_value_type, __value_type>::value), ""); | |
public: | |
typedef typename __alloc_traits::pointer pointer; | |
typedef typename __alloc_traits::const_pointer const_pointer; | |
typedef typename __table::size_type size_type; | |
typedef typename __table::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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
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); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
#if _LIBCPP_STD_VER > 11 | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(size_type __n, const allocator_type& __a) | |
: unordered_map(__n, hasher(), key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_map(__n, __hf, key_equal(), __a) {} | |
template <class _InputIterator> | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) | |
: unordered_map(__first, __last, __n, hasher(), key_equal(), __a) {} | |
template <class _InputIterator> | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, | |
const allocator_type& __a) | |
: unordered_map(__first, __last, __n, __hf, key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) | |
: unordered_map(__il, __n, hasher(), key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map(initializer_list<value_type> __il, size_type __n, const hasher& __hf, | |
const allocator_type& __a) | |
: unordered_map(__il, __n, __hf, key_equal(), __a) {} | |
#endif | |
// ~unordered_map() = default; | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_map& operator=(const unordered_map& __u) | |
{ | |
#if __cplusplus >= 201103L | |
__table_ = __u.__table_; | |
#else | |
if (this != &__u) { | |
__table_.clear(); | |
__table_.hash_function() = __u.__table_.hash_function(); | |
__table_.key_eq() = __u.__table_.key_eq(); | |
__table_.max_load_factor() = __u.__table_.max_load_factor(); | |
__table_.__copy_assign_alloc(__u.__table_); | |
insert(__u.begin(), __u.end()); | |
} | |
#endif | |
return *this; | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
unordered_map& operator=(unordered_map&& __u) | |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
+ _LIBCPP_INLINE_VISIBILITY | |
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();} | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert(const value_type& __x) | |
{return __table_.__insert_unique(__x);} | |
iterator insert(const_iterator __p, const value_type& __x) { | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::insert(const_iterator, const value_type&) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return insert(__x).first; | |
} | |
template <class _InputIterator> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
#ifndef _LIBCPP_CXX03_LANG | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert(value_type&& __x) | |
{return __table_.__insert_unique(_VSTD::move(__x));} | |
iterator insert(const_iterator __p, value_type&& __x) { | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::insert(const_iterator, const value_type&) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return __table_.__insert_unique(_VSTD::move(__x)).first; | |
} | |
template <class _Pp, | |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert(_Pp&& __x) | |
{return __table_.__insert_unique(_VSTD::forward<_Pp>(__x));} | |
template <class _Pp, | |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator __p, _Pp&& __x) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::insert(const_iterator, value_type&&) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return insert(_VSTD::forward<_Pp>(__x)).first; | |
} | |
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 __p, _Args&&... __args) { | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::emplace_hint(const_iterator, args...) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; | |
} | |
#endif // _LIBCPP_CXX03_LANG | |
#if _LIBCPP_STD_VER > 14 | |
template <class... _Args> | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) | |
{ | |
return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct, | |
_VSTD::forward_as_tuple(__k), | |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); | |
} | |
template <class... _Args> | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) | |
{ | |
return __table_.__emplace_unique_key_args(__k, _VSTD::piecewise_construct, | |
_VSTD::forward_as_tuple(_VSTD::move(__k)), | |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); | |
} | |
template <class... _Args> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return try_emplace(__k, _VSTD::forward<_Args>(__args)...).first; | |
} | |
template <class... _Args> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_map::try_emplace(const_iterator, key, args...) called with an iterator not" | |
" referring to this unordered_map"); | |
#endif | |
return try_emplace(_VSTD::move(__k), _VSTD::forward<_Args>(__args)...).first; | |
} | |
template <class _Vp> | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) | |
{ | |
pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, | |
__k, _VSTD::forward<_Vp>(__v)); | |
if (!__res.second) { | |
__res.first->second = _VSTD::forward<_Vp>(__v); | |
} | |
return __res; | |
} | |
template <class _Vp> | |
_LIBCPP_INLINE_VISIBILITY | |
pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) | |
{ | |
pair<iterator, bool> __res = __table_.__emplace_unique_key_args(__k, | |
_VSTD::move(__k), _VSTD::forward<_Vp>(__v)); | |
if (!__res.second) { | |
__res.first->second = _VSTD::forward<_Vp>(__v); | |
} | |
return __res; | |
} | |
template <class _Vp> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v) | |
{ | |
return insert_or_assign(__k, _VSTD::forward<_Vp>(__v)).first; | |
} | |
template <class _Vp> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v) | |
{ | |
return insert_or_assign(_VSTD::move(__k), _VSTD::forward<_Vp>(__v)).first; | |
} | |
#endif | |
_LIBCPP_INLINE_VISIBILITY | |
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator erase(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_CXX03_LANG | |
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);} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
bool __dereferenceable(const const_iterator* __i) const | |
{return __table_.__dereferenceable(&__i->__i_);} | |
bool __decrementable(const const_iterator* __i) const | |
{return __table_.__decrementable(&__i->__i_);} | |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(&__i->__i_, __n);} | |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(&__i->__i_, __n);} | |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 | |
private: | |
#ifdef _LIBCPP_CXX03_LANG | |
__node_holder __construct_node_with_key(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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__table_.rehash(__n); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( | |
const allocator_type& __a) | |
: __table_(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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_) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map( | |
unordered_map&& __u) | |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) | |
: __table_(_VSTD::move(__u.__table_)) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
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 _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
if (__a != __u.get_allocator()) | |
{ | |
iterator __i = __u.begin(); | |
while (__u.size() != 0) { | |
__table_.__emplace_unique(_VSTD::move( | |
__u.__table_.remove((__i++).__i_)->__value_.__nc)); | |
} | |
} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
else | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
#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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
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 | |
+inline | |
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 | |
#ifdef _LIBCPP_CXX03_LANG | |
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_with_key(const key_type& __k) | |
{ | |
__node_allocator& __na = __table_.__node_alloc(); | |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); | |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); | |
__h.get_deleter().__first_constructed = true; | |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); | |
__h.get_deleter().__second_constructed = true; | |
return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 | |
} | |
#endif | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
void | |
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, | |
_InputIterator __last) | |
{ | |
for (; __first != __last; ++__first) | |
__table_.__insert_unique(*__first); | |
} | |
#ifdef _LIBCPP_CXX03_LANG | |
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_with_key(__k); | |
pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); | |
__h.release(); | |
return __r.first->second; | |
} | |
#else | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
_Tp& | |
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) | |
{ | |
return __table_.__emplace_unique_key_args(__k, | |
std::piecewise_construct, std::forward_as_tuple(__k), | |
std::forward_as_tuple()).first->__cc.second; | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
_Tp& | |
unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](key_type&& __k) | |
{ | |
return __table_.__emplace_unique_key_args(__k, | |
std::piecewise_construct, std::forward_as_tuple(std::move(__k)), | |
std::forward_as_tuple()).first->__cc.second; | |
} | |
#endif // !_LIBCPP_CXX03_MODE | |
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_TYPE_VIS_ONLY 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 pair<key_type, mapped_type> __nc_value_type; | |
typedef value_type& reference; | |
typedef const value_type& const_reference; | |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), | |
"Invalid allocator::value_type"); | |
private: | |
typedef __hash_value_type<key_type, mapped_type> __value_type; | |
typedef __unordered_map_hasher<key_type, __value_type, hasher> __hasher; | |
typedef __unordered_map_equal<key_type, __value_type, key_equal> __key_equal; | |
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, | |
__value_type>::type __allocator_type; | |
typedef __hash_table<__value_type, __hasher, | |
__key_equal, __allocator_type> __table; | |
__table __table_; | |
typedef typename __table::_NodeTypes _NodeTypes; | |
typedef typename __table::__node_traits __node_traits; | |
typedef typename __table::__node_allocator __node_allocator; | |
typedef typename __table::__node __node; | |
typedef __hash_map_node_destructor<__node_allocator> _Dp; | |
typedef unique_ptr<__node, _Dp> __node_holder; | |
typedef allocator_traits<allocator_type> __alloc_traits; | |
static_assert((is_same<typename __node_traits::size_type, | |
typename __alloc_traits::size_type>::value), | |
"Allocator uses different size_type for different types"); | |
public: | |
typedef typename __alloc_traits::pointer pointer; | |
typedef typename __alloc_traits::const_pointer const_pointer; | |
typedef typename __table::size_type size_type; | |
typedef typename __table::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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
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); | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
#if _LIBCPP_STD_VER > 11 | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(size_type __n, const allocator_type& __a) | |
: unordered_multimap(__n, hasher(), key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_multimap(__n, __hf, key_equal(), __a) {} | |
template <class _InputIterator> | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const allocator_type& __a) | |
: unordered_multimap(__first, __last, __n, hasher(), key_equal(), __a) {} | |
template <class _InputIterator> | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(_InputIterator __first, _InputIterator __last, size_type __n, const hasher& __hf, | |
const allocator_type& __a) | |
: unordered_multimap(__first, __last, __n, __hf, key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) | |
: unordered_multimap(__il, __n, hasher(), key_equal(), __a) {} | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap(initializer_list<value_type> __il, size_type __n, const hasher& __hf, | |
const allocator_type& __a) | |
: unordered_multimap(__il, __n, __hf, key_equal(), __a) {} | |
#endif | |
// ~unordered_multimap() = default; | |
_LIBCPP_INLINE_VISIBILITY | |
unordered_multimap& operator=(const unordered_multimap& __u) | |
{ | |
#if __cplusplus >= 201103L | |
__table_ = __u.__table_; | |
#else | |
if (this != &__u) { | |
__table_.clear(); | |
__table_.hash_function() = __u.__table_.hash_function(); | |
__table_.key_eq() = __u.__table_.key_eq(); | |
__table_.max_load_factor() = __u.__table_.max_load_factor(); | |
__table_.__copy_assign_alloc(__u.__table_); | |
insert(__u.begin(), __u.end()); | |
} | |
#endif | |
return *this; | |
} | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
+ _LIBCPP_INLINE_VISIBILITY | |
unordered_multimap& operator=(unordered_multimap&& __u) | |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
+ _LIBCPP_INLINE_VISIBILITY | |
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();} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator __p, const value_type& __x) | |
{return __table_.__insert_multi(__p.__i_, __x);} | |
template <class _InputIterator> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
#ifndef _LIBCPP_CXX03_LANG | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator __p, value_type&& __x) | |
{return __table_.__insert_multi(__p.__i_, _VSTD::move(__x));} | |
template <class _Pp, | |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(_Pp&& __x) | |
{return __table_.__insert_multi(_VSTD::forward<_Pp>(__x));} | |
template <class _Pp, | |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> | |
_LIBCPP_INLINE_VISIBILITY | |
iterator insert(const_iterator __p, _Pp&& __x) | |
{return __table_.__insert_multi(__p.__i_, _VSTD::forward<_Pp>(__x));} | |
template <class... _Args> | |
iterator emplace(_Args&&... __args) { | |
return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...); | |
} | |
template <class... _Args> | |
iterator emplace_hint(const_iterator __p, _Args&&... __args) { | |
return __table_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); | |
} | |
#endif // _LIBCPP_CXX03_LANG | |
_LIBCPP_INLINE_VISIBILITY | |
iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} | |
_LIBCPP_INLINE_VISIBILITY | |
iterator erase(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);} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
bool __dereferenceable(const const_iterator* __i) const | |
{return __table_.__dereferenceable(&__i->__i_);} | |
bool __decrementable(const const_iterator* __i) const | |
{return __table_.__decrementable(&__i->__i_);} | |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(&__i->__i_, __n);} | |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(&__i->__i_, __n);} | |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 | |
}; | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__table_.rehash(__n); | |
insert(__first, __last); | |
} | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( | |
const allocator_type& __a) | |
: __table_(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
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_) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
unordered_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_multimap( | |
unordered_multimap&& __u) | |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) | |
: __table_(_VSTD::move(__u.__table_)) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
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 _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
if (__a != __u.get_allocator()) | |
{ | |
iterator __i = __u.begin(); | |
while (__u.size() != 0) | |
{ | |
__table_.__insert_multi( | |
_VSTD::move(__u.__table_.remove((__i++).__i_)->__value_.__nc) | |
); | |
} | |
} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
else | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
#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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
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 | |
+inline | |
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 | |
template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> | |
template <class _InputIterator> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
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 | |
index f6ccdc3..fb38b64 100644 | |
--- a/include/unordered_set | |
+++ b/include/unordered_set | |
@@ -1,1379 +1,1388 @@ | |
// -*- 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(size_type n, const allocator_type& a); // C++14 | |
unordered_set(size_type n, const hasher& hf, const allocator_type& a); // C++14 | |
template <class InputIterator> | |
unordered_set(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 | |
template <class InputIterator> | |
unordered_set(InputIterator f, InputIterator l, size_type n, | |
const hasher& hf, const allocator_type& a); // C++14 | |
unordered_set(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 | |
unordered_set(initializer_list<value_type> il, size_type n, | |
const hasher& hf, const allocator_type& a); // C++14 | |
~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); | |
iterator erase(iterator position); // C++14 | |
size_type erase(const key_type& k); | |
iterator erase(const_iterator first, const_iterator last); | |
void clear() noexcept; | |
void swap(unordered_set&) | |
noexcept(allocator_traits<Allocator>::is_always_equal::value && | |
noexcept(swap(declval<hasher&>(), declval<hasher&>())) && | |
noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 | |
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(size_type n, const allocator_type& a); // C++14 | |
unordered_multiset(size_type n, const hasher& hf, const allocator_type& a); // C++14 | |
template <class InputIterator> | |
unordered_multiset(InputIterator f, InputIterator l, size_type n, const allocator_type& a); // C++14 | |
template <class InputIterator> | |
unordered_multiset(InputIterator f, InputIterator l, size_type n, | |
const hasher& hf, const allocator_type& a); // C++14 | |
unordered_multiset(initializer_list<value_type> il, size_type n, const allocator_type& a); // C++14 | |
unordered_multiset(initializer_list<value_type> il, size_type n, | |
const hasher& hf, const allocator_type& a); // C++14 | |
~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); | |
iterator erase(iterator position); // C++14 | |
size_type erase(const key_type& k); | |
iterator erase(const_iterator first, const_iterator last); | |
void clear() noexcept; | |
void swap(unordered_multiset&) | |
noexcept(allocator_traits<Allocator>::is_always_equal::value && | |
noexcept(swap(declval<hasher&>(), declval<hasher&>())) && | |
noexcept(swap(declval<key_equal&>(), declval<key_equal&>()))); // C++17 | |
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> | |
#include <__debug> | |
#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_TYPE_VIS_ONLY 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; | |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), | |
"Invalid allocator::value_type"); | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
explicit unordered_set(size_type __n, const hasher& __hf = hasher(), | |
const key_equal& __eql = key_equal()); | |
#if _LIBCPP_STD_VER > 11 | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_set(size_type __n, const allocator_type& __a) | |
: unordered_set(__n, hasher(), key_equal(), __a) {} | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_set(size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_set(__n, __hf, key_equal(), __a) {} | |
#endif | |
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); | |
#if _LIBCPP_STD_VER > 11 | |
template <class _InputIterator> | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_set(_InputIterator __first, _InputIterator __last, | |
size_type __n, const allocator_type& __a) | |
: unordered_set(__first, __last, __n, hasher(), key_equal(), __a) {} | |
template <class _InputIterator> | |
unordered_set(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_set(__first, __last, __n, __hf, key_equal(), __a) {} | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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); | |
#if _LIBCPP_STD_VER > 11 | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_set(initializer_list<value_type> __il, size_type __n, | |
const allocator_type& __a) | |
: unordered_set(__il, __n, hasher(), key_equal(), __a) {} | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_set(initializer_list<value_type> __il, size_type __n, | |
const hasher& __hf, const allocator_type& __a) | |
: unordered_set(__il, __n, __hf, key_equal(), __a) {} | |
#endif | |
#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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
unordered_set& operator=(unordered_set&& __u) | |
_NOEXCEPT_(is_nothrow_move_assignable<__table>::value); | |
#endif | |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
iterator emplace_hint(const_iterator __p, _Args&&... __args) | |
{ | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_set::emplace_hint(const_iterator, args...) called with an iterator not" | |
" referring to this unordered_set"); | |
return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first; | |
} | |
#else | |
iterator emplace_hint(const_iterator, _Args&&... __args) | |
{return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;} | |
#endif | |
#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 | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
iterator insert(const_iterator __p, const value_type& __x) | |
{ | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_set::insert(const_iterator, const value_type&) called with an iterator not" | |
" referring to this unordered_set"); | |
return insert(__x).first; | |
} | |
#else | |
iterator insert(const_iterator, const value_type& __x) | |
{return insert(__x).first;} | |
#endif | |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
_LIBCPP_INLINE_VISIBILITY | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
iterator insert(const_iterator __p, value_type&& __x) | |
{ | |
_LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this, | |
"unordered_set::insert(const_iterator, value_type&&) called with an iterator not" | |
" referring to this unordered_set"); | |
return insert(_VSTD::move(__x)).first; | |
} | |
#else | |
iterator insert(const_iterator, value_type&& __x) | |
{return insert(_VSTD::move(__x)).first;} | |
#endif | |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES | |
template <class _InputIterator> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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);} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
bool __dereferenceable(const const_iterator* __i) const | |
{return __table_.__dereferenceable(__i);} | |
bool __decrementable(const const_iterator* __i) const | |
{return __table_.__decrementable(__i);} | |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(__i, __n);} | |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(__i, __n);} | |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 | |
}; | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__table_.rehash(__n); | |
insert(__first, __last); | |
} | |
template <class _Value, class _Hash, class _Pred, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( | |
const allocator_type& __a) | |
: __table_(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
template <class _Value, class _Hash, class _Pred, class _Alloc> | |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( | |
const unordered_set& __u) | |
: __table_(__u.__table_) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set( | |
unordered_set&& __u) | |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) | |
: __table_(_VSTD::move(__u.__table_)) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
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 _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
if (__a != __u.get_allocator()) | |
{ | |
iterator __i = __u.begin(); | |
while (__u.size() != 0) | |
__table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_)); | |
} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
else | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
#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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
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 | |
+inline | |
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 | |
+inline | |
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_TYPE_VIS_ONLY 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; | |
static_assert((is_same<value_type, typename allocator_type::value_type>::value), | |
"Invalid allocator::value_type"); | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
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); | |
#if _LIBCPP_STD_VER > 11 | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(size_type __n, const allocator_type& __a) | |
: unordered_multiset(__n, hasher(), key_equal(), __a) {} | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_multiset(__n, __hf, key_equal(), __a) {} | |
#endif | |
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); | |
#if _LIBCPP_STD_VER > 11 | |
template <class _InputIterator> | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(_InputIterator __first, _InputIterator __last, | |
size_type __n, const allocator_type& __a) | |
: unordered_multiset(__first, __last, __n, hasher(), key_equal(), __a) {} | |
template <class _InputIterator> | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(_InputIterator __first, _InputIterator __last, | |
size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_multiset(__first, __last, __n, __hf, key_equal(), __a) {} | |
#endif | |
+ _LIBCPP_INLINE_VISIBILITY | |
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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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); | |
#if _LIBCPP_STD_VER > 11 | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(initializer_list<value_type> __il, size_type __n, const allocator_type& __a) | |
: unordered_multiset(__il, __n, hasher(), key_equal(), __a) {} | |
inline _LIBCPP_INLINE_VISIBILITY | |
unordered_multiset(initializer_list<value_type> __il, size_type __n, const hasher& __hf, const allocator_type& __a) | |
: unordered_multiset(__il, __n, __hf, key_equal(), __a) {} | |
#endif | |
#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 | |
+ _LIBCPP_INLINE_VISIBILITY | |
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> | |
+ _LIBCPP_INLINE_VISIBILITY | |
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);} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
bool __dereferenceable(const const_iterator* __i) const | |
{return __table_.__dereferenceable(__i);} | |
bool __decrementable(const const_iterator* __i) const | |
{return __table_.__decrementable(__i);} | |
bool __addable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(__i, __n);} | |
bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const | |
{return __table_.__addable(__i, __n);} | |
#endif // _LIBCPP_DEBUG_LEVEL >= 2 | |
}; | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__table_.rehash(__n); | |
insert(__first, __last); | |
} | |
template <class _Value, class _Hash, class _Pred, class _Alloc> | |
-inline _LIBCPP_INLINE_VISIBILITY | |
+inline | |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( | |
const allocator_type& __a) | |
: __table_(__a) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
} | |
template <class _Value, class _Hash, class _Pred, class _Alloc> | |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( | |
const unordered_multiset& __u) | |
: __table_(__u.__table_) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset( | |
unordered_multiset&& __u) | |
_NOEXCEPT_(is_nothrow_move_constructible<__table>::value) | |
: __table_(_VSTD::move(__u.__table_)) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
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 _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
if (__a != __u.get_allocator()) | |
{ | |
iterator __i = __u.begin(); | |
while (__u.size() != 0) | |
__table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_)); | |
} | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
else | |
__get_db()->swap(this, &__u); | |
#endif | |
} | |
#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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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) | |
{ | |
#if _LIBCPP_DEBUG_LEVEL >= 2 | |
__get_db()->__insert_c(this); | |
#endif | |
__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 | |
+inline | |
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 | |
+inline | |
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment