1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===-------------------------- ios.cpp -----------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include "__config"
11938c6a083bce2e362949600bab3d6885eff663e0Dan Albert
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ios"
13f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert
14f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include <stdlib.h>
15f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "__locale"
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm"
18f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include "config_elast.h"
19f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include "istream"
20f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include "limits"
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "memory"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "new"
23f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include "streambuf"
24f608ad69d7f05ea357afaeded64419c3b615ff15Dan Albert#include "string"
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_ios<char>;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_ios<wchar_t>;
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_streambuf<char>;
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_streambuf<wchar_t>;
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_istream<char>;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_istream<wchar_t>;
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_ostream<char>;
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_ostream<wchar_t>;
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class basic_iostream<char>;
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN __iostream_category
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public __do_message
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
461e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant    virtual const char* name() const _NOEXCEPT;
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string message(int ev) const;
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
511e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant__iostream_category::name() const _NOEXCEPT
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return "iostream";
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__iostream_category::message(int ev) const
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
59adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    if (ev != static_cast<int>(io_errc::stream)
607112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifdef _LIBCPP_ELAST
617112dae6acac544a0271a85d95342c583441e2d1Dan Albert        && ev <= _LIBCPP_ELAST
627112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif  // _LIBCPP_ELAST
63adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant        )
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __do_message::message(ev);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return string("unspecified iostream_category error");
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst error_category&
6961a8422ffa89b7a1788dc9f51407b950ea3b8d0cMarshall Clowiostream_category() _NOEXCEPT
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static __iostream_category s;
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// ios_base::failure
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::failure::failure(const string& msg, const error_code& ec)
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : system_error(ec, msg)
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::failure::failure(const char* msg, const error_code& ec)
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : system_error(ec, msg)
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::failure::~failure() throw()
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// ios_base locale
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::boolalpha;
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::dec;
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::fixed;
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::hex;
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::internal;
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::left;
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::oct;
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::right;
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::scientific;
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::showbase;
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::showpoint;
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::showpos;
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::skipws;
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::unitbuf;
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::uppercase;
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::adjustfield;
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::basefield;
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::fmtflags ios_base::floatfield;
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::iostate ios_base::badbit;
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::iostate ios_base::eofbit;
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::iostate ios_base::failbit;
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::iostate ios_base::goodbit;
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::app;
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::ate;
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::binary;
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::in;
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::out;
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ios_base::openmode ios_base::trunc;
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::__call_callbacks(event ev)
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t i = __event_size_; i;)
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        --i;
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __fn_[i](ev, *this, __index_[i]);
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::imbue(const locale& newloc)
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static_assert(sizeof(locale) == sizeof(__loc_), "");
1404c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale oldloc = loc_storage;
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    loc_storage = newloc;
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __call_callbacks(imbue_event);
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return oldloc;
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::getloc() const
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1504c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return loc_storage;
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// xalloc
1557112dae6acac544a0271a85d95342c583441e2d1Dan Albert#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
156206ce1faaf35284f829bbfcdd28421098509e17eMarshall Clowatomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
157206ce1faaf35284f829bbfcdd28421098509e17eMarshall Clow#else
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint ios_base::__xindex_ = 0;
159206ce1faaf35284f829bbfcdd28421098509e17eMarshall Clow#endif
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1617112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate <typename _Tp>
1627112dae6acac544a0271a85d95342c583441e2d1Dan Albertstatic size_t __ios_new_cap(size_t __req_size, size_t __current_cap)
1637112dae6acac544a0271a85d95342c583441e2d1Dan Albert{ // Precondition: __req_size > __current_cap
1647112dae6acac544a0271a85d95342c583441e2d1Dan Albert	const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
1657112dae6acac544a0271a85d95342c583441e2d1Dan Albert	if (__req_size < mx/2)
1667112dae6acac544a0271a85d95342c583441e2d1Dan Albert		return _VSTD::max(2 * __current_cap, __req_size);
1677112dae6acac544a0271a85d95342c583441e2d1Dan Albert	else
1687112dae6acac544a0271a85d95342c583441e2d1Dan Albert		return mx;
1697112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
1707112dae6acac544a0271a85d95342c583441e2d1Dan Albert
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::xalloc()
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __xindex_++;
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlong&
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::iword(int index)
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    size_t req_size = static_cast<size_t>(index)+1;
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (req_size > __iarray_cap_)
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1837112dae6acac544a0271a85d95342c583441e2d1Dan Albert        size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
1847112dae6acac544a0271a85d95342c583441e2d1Dan Albert        long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (iarray == 0)
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            setstate(badbit);
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            static long error;
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            error = 0;
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __iarray_ = iarray;
1937112dae6acac544a0271a85d95342c583441e2d1Dan Albert        for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *p = 0;
1957112dae6acac544a0271a85d95342c583441e2d1Dan Albert        __iarray_cap_ = newcap;
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_size_ = max<size_t>(__iarray_size_, req_size);
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __iarray_[index];
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid*&
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::pword(int index)
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    size_t req_size = static_cast<size_t>(index)+1;
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (req_size > __parray_cap_)
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2077112dae6acac544a0271a85d95342c583441e2d1Dan Albert        size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_);
2087112dae6acac544a0271a85d95342c583441e2d1Dan Albert        void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *)));
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (parray == 0)
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            setstate(badbit);
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            static void* error;
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            error = 0;
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __parray_ = parray;
2177112dae6acac544a0271a85d95342c583441e2d1Dan Albert        for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *p = 0;
2197112dae6acac544a0271a85d95342c583441e2d1Dan Albert        __parray_cap_ = newcap;
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_size_ = max<size_t>(__parray_size_, req_size);
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __parray_[index];
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// register_callback
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::register_callback(event_callback fn, int index)
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    size_t req_size = __event_size_ + 1;
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (req_size > __event_cap_)
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2337112dae6acac544a0271a85d95342c583441e2d1Dan Albert        size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_);
2347112dae6acac544a0271a85d95342c583441e2d1Dan Albert        event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (fns == 0)
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            setstate(badbit);
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __fn_ = fns;
2387112dae6acac544a0271a85d95342c583441e2d1Dan Albert        int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int)));
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (indxs == 0)
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            setstate(badbit);
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __index_ = indxs;
2427112dae6acac544a0271a85d95342c583441e2d1Dan Albert        __event_cap_ = newcap;
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fn_[__event_size_] = fn;
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __index_[__event_size_] = index;
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ++__event_size_;
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::~ios_base()
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __call_callbacks(erase_event);
2524c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    loc_storage.~locale();
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    free(__fn_);
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    free(__index_);
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    free(__iarray_);
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    free(__parray_);
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// iostate
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::clear(iostate state)
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__rdbuf_)
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __rdstate_ = state;
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __rdstate_ = state | badbit;
269d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0)
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw failure("ios_base::clear");
27216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// init
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::init(void* sb)
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdbuf_ = sb;
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdstate_ = __rdbuf_ ? goodbit : badbit;
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __exceptions_ = goodbit;
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fmtflags_ = skipws | dec;
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __width_ = 0;
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __precision_ = 6;
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fn_ = 0;
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __index_ = 0;
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __event_size_ = 0;
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __event_cap_ = 0;
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_ = 0;
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_size_ = 0;
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_cap_ = 0;
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_ = 0;
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_size_ = 0;
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_cap_ = 0;
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new(&__loc_) locale;
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::copyfmt(const ios_base& rhs)
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
30390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    // Don't alter *this until all needed resources are acquired
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free);
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<int, void (*)(void*)> new_ints(0, free);
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<long, void (*)(void*)> new_longs(0, free);
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<void*, void (*)(void*)> new_pointers(0, free);
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__event_cap_ < rhs.__event_size_)
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
3104c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        size_t newesize = sizeof(event_callback) * rhs.__event_size_;
3114c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        new_callbacks.reset(static_cast<event_callback*>(malloc(newesize)));
312d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!new_callbacks)
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw bad_alloc();
31516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
3164c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger
3174c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        size_t newisize = sizeof(int) * rhs.__event_size_;
3184c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        new_ints.reset(static_cast<int *>(malloc(newisize)));
319d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!new_ints)
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw bad_alloc();
32216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__iarray_cap_ < rhs.__iarray_size_)
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
3264c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        size_t newsize = sizeof(long) * rhs.__iarray_size_;
3274c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        new_longs.reset(static_cast<long*>(malloc(newsize)));
328d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!new_longs)
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw bad_alloc();
33116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__parray_cap_ < rhs.__parray_size_)
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
3354c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        size_t newsize = sizeof(void*) * rhs.__parray_size_;
3364c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger        new_pointers.reset(static_cast<void**>(malloc(newsize)));
337d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!new_pointers)
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw bad_alloc();
34016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // Got everything we need.  Copy everything but __rdstate_, __rdbuf_ and __exceptions_
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fmtflags_ = rhs.__fmtflags_;
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __precision_ = rhs.__precision_;
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __width_ = rhs.__width_;
3464c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
3474c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_);
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    lhs_loc = rhs_loc;
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__event_cap_ < rhs.__event_size_)
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        free(__fn_);
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __fn_ = new_callbacks.release();
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        free(__index_);
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __index_ = new_ints.release();
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __event_cap_ = rhs.__event_size_;
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_)
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __fn_[__event_size_] = rhs.__fn_[__event_size_];
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __index_[__event_size_] = rhs.__index_[__event_size_];
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__iarray_cap_ < rhs.__iarray_size_)
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        free(__iarray_);
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __iarray_ = new_longs.release();
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __iarray_cap_ = rhs.__iarray_size_;
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_)
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_];
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__parray_cap_ < rhs.__parray_size_)
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        free(__parray_);
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __parray_ = new_pointers.release();
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __parray_cap_ = rhs.__parray_size_;
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_)
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __parray_[__parray_size_] = rhs.__parray_[__parray_size_];
378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::move(ios_base& rhs)
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // *this is uninitialized
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fmtflags_ = rhs.__fmtflags_;
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __precision_ = rhs.__precision_;
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __width_ = rhs.__width_;
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdstate_ = rhs.__rdstate_;
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __exceptions_ = rhs.__exceptions_;
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdbuf_ = 0;
3904c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new(&__loc_) locale(rhs_loc);
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fn_ = rhs.__fn_;
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__fn_ = 0;
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __index_ = rhs.__index_;
395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__index_ = 0;
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __event_size_ = rhs.__event_size_;
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__event_size_ = 0;
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __event_cap_ = rhs.__event_cap_;
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__event_cap_ = 0;
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_ = rhs.__iarray_;
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__iarray_ = 0;
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_size_ = rhs.__iarray_size_;
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__iarray_size_ = 0;
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __iarray_cap_ = rhs.__iarray_cap_;
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__iarray_cap_ = 0;
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_ = rhs.__parray_;
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__parray_ = 0;
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_size_ = rhs.__parray_size_;
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__parray_size_ = 0;
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __parray_cap_ = rhs.__parray_cap_;
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    rhs.__parray_cap_ = 0;
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
415f57bd564fd16203c8969aaa29631f3e1bbaa993fHoward Hinnantios_base::swap(ios_base& rhs) _NOEXCEPT
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4170949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__fmtflags_, rhs.__fmtflags_);
4180949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__precision_, rhs.__precision_);
4190949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__width_, rhs.__width_);
4200949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__rdstate_, rhs.__rdstate_);
4210949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__exceptions_, rhs.__exceptions_);
4224c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
4234c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
4240949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(lhs_loc, rhs_loc);
4250949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__fn_, rhs.__fn_);
4260949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__index_, rhs.__index_);
4270949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__event_size_, rhs.__event_size_);
4280949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__event_cap_, rhs.__event_cap_);
4290949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__iarray_, rhs.__iarray_);
4300949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__iarray_size_, rhs.__iarray_size_);
4310949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_);
4320949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__parray_, rhs.__parray_);
4330949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__parray_size_, rhs.__parray_size_);
4340949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    _VSTD::swap(__parray_cap_, rhs.__parray_cap_);
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::__set_badbit_and_consider_rethrow()
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdstate_ |= badbit;
441d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__exceptions_ & badbit)
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
44416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::__set_failbit_and_consider_rethrow()
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __rdstate_ |= failbit;
451d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__exceptions_ & failbit)
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
45416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantios_base::sync_with_stdio(bool sync)
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static bool previous_state = true;
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool r = previous_state;
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    previous_state = sync;
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
467