xref: /llvm-project-15.0.7/libcxx/src/ios.cpp (revision bbb0f2c7)
1eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
23e519524SHoward Hinnant //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63e519524SHoward Hinnant //
73e519524SHoward Hinnant //===----------------------------------------------------------------------===//
83e519524SHoward Hinnant 
9*bbb0f2c7SArthur O'Dwyer #include <__config>
10*bbb0f2c7SArthur O'Dwyer #include <__locale>
11*bbb0f2c7SArthur O'Dwyer #include <algorithm>
12*bbb0f2c7SArthur O'Dwyer #include <ios>
13*bbb0f2c7SArthur O'Dwyer #include <limits>
14*bbb0f2c7SArthur O'Dwyer #include <memory>
15*bbb0f2c7SArthur O'Dwyer #include <new>
16a76dfbd4SDan Albert #include <stdlib.h>
17*bbb0f2c7SArthur O'Dwyer #include <string>
18a76dfbd4SDan Albert 
19e8fd1645SEric Fiselier #include "include/config_elast.h"
20*bbb0f2c7SArthur O'Dwyer 
21*bbb0f2c7SArthur O'Dwyer _LIBCPP_PUSH_MACROS
22*bbb0f2c7SArthur O'Dwyer #include <__undef_macros>
233e519524SHoward Hinnant 
243e519524SHoward Hinnant _LIBCPP_BEGIN_NAMESPACE_STD
253e519524SHoward Hinnant 
263e519524SHoward Hinnant class _LIBCPP_HIDDEN __iostream_category
273e519524SHoward Hinnant     : public __do_message
283e519524SHoward Hinnant {
293e519524SHoward Hinnant public:
305601305fSLouis Dionne     virtual const char* name() const noexcept;
313e519524SHoward Hinnant     virtual string message(int ev) const;
323e519524SHoward Hinnant };
333e519524SHoward Hinnant 
343e519524SHoward Hinnant const char*
name() const355601305fSLouis Dionne __iostream_category::name() const noexcept
363e519524SHoward Hinnant {
373e519524SHoward Hinnant     return "iostream";
383e519524SHoward Hinnant }
393e519524SHoward Hinnant 
403e519524SHoward Hinnant string
message(int ev) const413e519524SHoward Hinnant __iostream_category::message(int ev) const
423e519524SHoward Hinnant {
43128ba719SHoward Hinnant     if (ev != static_cast<int>(io_errc::stream)
44a409d59cSJonathan Roelofs #ifdef _LIBCPP_ELAST
45a409d59cSJonathan Roelofs         && ev <= _LIBCPP_ELAST
46a409d59cSJonathan Roelofs #endif // _LIBCPP_ELAST
47128ba719SHoward Hinnant         )
483e519524SHoward Hinnant         return __do_message::message(ev);
493e519524SHoward Hinnant     return string("unspecified iostream_category error");
503e519524SHoward Hinnant }
513e519524SHoward Hinnant 
523e519524SHoward Hinnant const error_category&
iostream_category()535601305fSLouis Dionne iostream_category() noexcept
543e519524SHoward Hinnant {
553e519524SHoward Hinnant     static __iostream_category s;
563e519524SHoward Hinnant     return s;
573e519524SHoward Hinnant }
583e519524SHoward Hinnant 
593e519524SHoward Hinnant // ios_base::failure
603e519524SHoward Hinnant 
failure(const string & msg,const error_code & ec)613e519524SHoward Hinnant ios_base::failure::failure(const string& msg, const error_code& ec)
623e519524SHoward Hinnant     : system_error(ec, msg)
633e519524SHoward Hinnant {
643e519524SHoward Hinnant }
653e519524SHoward Hinnant 
failure(const char * msg,const error_code & ec)663e519524SHoward Hinnant ios_base::failure::failure(const char* msg, const error_code& ec)
673e519524SHoward Hinnant     : system_error(ec, msg)
683e519524SHoward Hinnant {
693e519524SHoward Hinnant }
703e519524SHoward Hinnant 
~failure()713e519524SHoward Hinnant ios_base::failure::~failure() throw()
723e519524SHoward Hinnant {
733e519524SHoward Hinnant }
743e519524SHoward Hinnant 
753e519524SHoward Hinnant // ios_base locale
763e519524SHoward Hinnant 
773e519524SHoward Hinnant const ios_base::fmtflags ios_base::boolalpha;
783e519524SHoward Hinnant const ios_base::fmtflags ios_base::dec;
793e519524SHoward Hinnant const ios_base::fmtflags ios_base::fixed;
803e519524SHoward Hinnant const ios_base::fmtflags ios_base::hex;
813e519524SHoward Hinnant const ios_base::fmtflags ios_base::internal;
823e519524SHoward Hinnant const ios_base::fmtflags ios_base::left;
833e519524SHoward Hinnant const ios_base::fmtflags ios_base::oct;
843e519524SHoward Hinnant const ios_base::fmtflags ios_base::right;
853e519524SHoward Hinnant const ios_base::fmtflags ios_base::scientific;
863e519524SHoward Hinnant const ios_base::fmtflags ios_base::showbase;
873e519524SHoward Hinnant const ios_base::fmtflags ios_base::showpoint;
883e519524SHoward Hinnant const ios_base::fmtflags ios_base::showpos;
893e519524SHoward Hinnant const ios_base::fmtflags ios_base::skipws;
903e519524SHoward Hinnant const ios_base::fmtflags ios_base::unitbuf;
913e519524SHoward Hinnant const ios_base::fmtflags ios_base::uppercase;
923e519524SHoward Hinnant const ios_base::fmtflags ios_base::adjustfield;
933e519524SHoward Hinnant const ios_base::fmtflags ios_base::basefield;
943e519524SHoward Hinnant const ios_base::fmtflags ios_base::floatfield;
953e519524SHoward Hinnant 
963e519524SHoward Hinnant const ios_base::iostate ios_base::badbit;
973e519524SHoward Hinnant const ios_base::iostate ios_base::eofbit;
983e519524SHoward Hinnant const ios_base::iostate ios_base::failbit;
993e519524SHoward Hinnant const ios_base::iostate ios_base::goodbit;
1003e519524SHoward Hinnant 
1013e519524SHoward Hinnant const ios_base::openmode ios_base::app;
1023e519524SHoward Hinnant const ios_base::openmode ios_base::ate;
1033e519524SHoward Hinnant const ios_base::openmode ios_base::binary;
1043e519524SHoward Hinnant const ios_base::openmode ios_base::in;
1053e519524SHoward Hinnant const ios_base::openmode ios_base::out;
1063e519524SHoward Hinnant const ios_base::openmode ios_base::trunc;
1073e519524SHoward Hinnant 
1083e519524SHoward Hinnant void
__call_callbacks(event ev)1093e519524SHoward Hinnant ios_base::__call_callbacks(event ev)
1103e519524SHoward Hinnant {
1113e519524SHoward Hinnant     for (size_t i = __event_size_; i;)
1123e519524SHoward Hinnant     {
1133e519524SHoward Hinnant         --i;
1143e519524SHoward Hinnant         __fn_[i](ev, *this, __index_[i]);
1153e519524SHoward Hinnant     }
1163e519524SHoward Hinnant }
1173e519524SHoward Hinnant 
1183e519524SHoward Hinnant // locale
1193e519524SHoward Hinnant 
1203e519524SHoward Hinnant locale
imbue(const locale & newloc)1213e519524SHoward Hinnant ios_base::imbue(const locale& newloc)
1223e519524SHoward Hinnant {
1233e519524SHoward Hinnant     static_assert(sizeof(locale) == sizeof(__loc_), "");
124634b9dd7SJoerg Sonnenberger     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
1253e519524SHoward Hinnant     locale oldloc = loc_storage;
1263e519524SHoward Hinnant     loc_storage = newloc;
1273e519524SHoward Hinnant     __call_callbacks(imbue_event);
1283e519524SHoward Hinnant     return oldloc;
1293e519524SHoward Hinnant }
1303e519524SHoward Hinnant 
1313e519524SHoward Hinnant locale
getloc() const1323e519524SHoward Hinnant ios_base::getloc() const
1333e519524SHoward Hinnant {
134634b9dd7SJoerg Sonnenberger     const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_);
1353e519524SHoward Hinnant     return loc_storage;
1363e519524SHoward Hinnant }
1373e519524SHoward Hinnant 
1383e519524SHoward Hinnant // xalloc
139749adebaSEric Fiselier #if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
1404e730aebSRaul Tambre atomic<int> ios_base::__xindex_{0};
141f28fd284SMarshall Clow #else
1423e519524SHoward Hinnant int ios_base::__xindex_ = 0;
143f28fd284SMarshall Clow #endif
1443e519524SHoward Hinnant 
145a5027324SMarshall Clow template <typename _Tp>
__ios_new_cap(size_t __req_size,size_t __current_cap)146a5027324SMarshall Clow static size_t __ios_new_cap(size_t __req_size, size_t __current_cap)
147a5027324SMarshall Clow { // Precondition: __req_size > __current_cap
148a5027324SMarshall Clow 	const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
149a5027324SMarshall Clow 	if (__req_size < mx/2)
150a5027324SMarshall Clow 		return _VSTD::max(2 * __current_cap, __req_size);
151a5027324SMarshall Clow 	else
152a5027324SMarshall Clow 		return mx;
153a5027324SMarshall Clow }
154a5027324SMarshall Clow 
1553e519524SHoward Hinnant int
xalloc()1563e519524SHoward Hinnant ios_base::xalloc()
1573e519524SHoward Hinnant {
1583e519524SHoward Hinnant     return __xindex_++;
1593e519524SHoward Hinnant }
1603e519524SHoward Hinnant 
1613e519524SHoward Hinnant long&
iword(int index)1623e519524SHoward Hinnant ios_base::iword(int index)
1633e519524SHoward Hinnant {
1643e519524SHoward Hinnant     size_t req_size = static_cast<size_t>(index)+1;
1653e519524SHoward Hinnant     if (req_size > __iarray_cap_)
1663e519524SHoward Hinnant     {
167a5027324SMarshall Clow         size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
168a5027324SMarshall Clow         long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
1693e519524SHoward Hinnant         if (iarray == 0)
1703e519524SHoward Hinnant         {
1713e519524SHoward Hinnant             setstate(badbit);
1723e519524SHoward Hinnant             static long error;
1733e519524SHoward Hinnant             error = 0;
1743e519524SHoward Hinnant             return error;
1753e519524SHoward Hinnant         }
1763e519524SHoward Hinnant         __iarray_ = iarray;
177a5027324SMarshall Clow         for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
1783e519524SHoward Hinnant             *p = 0;
179a5027324SMarshall Clow         __iarray_cap_ = newcap;
1803e519524SHoward Hinnant     }
1813e519524SHoward Hinnant     __iarray_size_ = max<size_t>(__iarray_size_, req_size);
1823e519524SHoward Hinnant     return __iarray_[index];
1833e519524SHoward Hinnant }
1843e519524SHoward Hinnant 
1853e519524SHoward Hinnant void*&
pword(int index)1863e519524SHoward Hinnant ios_base::pword(int index)
1873e519524SHoward Hinnant {
1883e519524SHoward Hinnant     size_t req_size = static_cast<size_t>(index)+1;
1893e519524SHoward Hinnant     if (req_size > __parray_cap_)
1903e519524SHoward Hinnant     {
191a5027324SMarshall Clow         size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_);
192a5027324SMarshall Clow         void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *)));
1933e519524SHoward Hinnant         if (parray == 0)
1943e519524SHoward Hinnant         {
1953e519524SHoward Hinnant             setstate(badbit);
1963e519524SHoward Hinnant             static void* error;
1973e519524SHoward Hinnant             error = 0;
1983e519524SHoward Hinnant             return error;
1993e519524SHoward Hinnant         }
2003e519524SHoward Hinnant         __parray_ = parray;
201a5027324SMarshall Clow         for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
2023e519524SHoward Hinnant             *p = 0;
203a5027324SMarshall Clow         __parray_cap_ = newcap;
2043e519524SHoward Hinnant     }
2053e519524SHoward Hinnant     __parray_size_ = max<size_t>(__parray_size_, req_size);
2063e519524SHoward Hinnant     return __parray_[index];
2073e519524SHoward Hinnant }
2083e519524SHoward Hinnant 
2093e519524SHoward Hinnant // register_callback
2103e519524SHoward Hinnant 
2113e519524SHoward Hinnant void
register_callback(event_callback fn,int index)2123e519524SHoward Hinnant ios_base::register_callback(event_callback fn, int index)
2133e519524SHoward Hinnant {
2143e519524SHoward Hinnant     size_t req_size = __event_size_ + 1;
2153e519524SHoward Hinnant     if (req_size > __event_cap_)
2163e519524SHoward Hinnant     {
217a5027324SMarshall Clow         size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_);
218a5027324SMarshall Clow         event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
2193e519524SHoward Hinnant         if (fns == 0)
2203e519524SHoward Hinnant             setstate(badbit);
2213e519524SHoward Hinnant         __fn_ = fns;
222a5027324SMarshall Clow         int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int)));
2233e519524SHoward Hinnant         if (indxs == 0)
2243e519524SHoward Hinnant             setstate(badbit);
2253e519524SHoward Hinnant         __index_ = indxs;
226a5027324SMarshall Clow         __event_cap_ = newcap;
2273e519524SHoward Hinnant     }
2283e519524SHoward Hinnant     __fn_[__event_size_] = fn;
2293e519524SHoward Hinnant     __index_[__event_size_] = index;
2303e519524SHoward Hinnant     ++__event_size_;
2313e519524SHoward Hinnant }
2323e519524SHoward Hinnant 
~ios_base()2333e519524SHoward Hinnant ios_base::~ios_base()
2343e519524SHoward Hinnant {
2353e519524SHoward Hinnant     __call_callbacks(erase_event);
236634b9dd7SJoerg Sonnenberger     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
2373e519524SHoward Hinnant     loc_storage.~locale();
2383e519524SHoward Hinnant     free(__fn_);
2393e519524SHoward Hinnant     free(__index_);
2403e519524SHoward Hinnant     free(__iarray_);
2413e519524SHoward Hinnant     free(__parray_);
2423e519524SHoward Hinnant }
2433e519524SHoward Hinnant 
2443e519524SHoward Hinnant // iostate
2453e519524SHoward Hinnant 
2463e519524SHoward Hinnant void
clear(iostate state)2473e519524SHoward Hinnant ios_base::clear(iostate state)
2483e519524SHoward Hinnant {
2493e519524SHoward Hinnant     if (__rdbuf_)
2503e519524SHoward Hinnant         __rdstate_ = state;
2513e519524SHoward Hinnant     else
2523e519524SHoward Hinnant         __rdstate_ = state | badbit;
2537232a84eSLouis Dionne 
2543e519524SHoward Hinnant     if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0)
2557232a84eSLouis Dionne         __throw_failure("ios_base::clear");
2563e519524SHoward Hinnant }
2573e519524SHoward Hinnant 
2583e519524SHoward Hinnant // init
2593e519524SHoward Hinnant 
2603e519524SHoward Hinnant void
init(void * sb)2613e519524SHoward Hinnant ios_base::init(void* sb)
2623e519524SHoward Hinnant {
2633e519524SHoward Hinnant     __rdbuf_ = sb;
2643e519524SHoward Hinnant     __rdstate_ = __rdbuf_ ? goodbit : badbit;
2653e519524SHoward Hinnant     __exceptions_ = goodbit;
2663e519524SHoward Hinnant     __fmtflags_ = skipws | dec;
2673e519524SHoward Hinnant     __width_ = 0;
2683e519524SHoward Hinnant     __precision_ = 6;
2693e519524SHoward Hinnant     __fn_ = 0;
2703e519524SHoward Hinnant     __index_ = 0;
2713e519524SHoward Hinnant     __event_size_ = 0;
2723e519524SHoward Hinnant     __event_cap_ = 0;
2733e519524SHoward Hinnant     __iarray_ = 0;
2743e519524SHoward Hinnant     __iarray_size_ = 0;
2753e519524SHoward Hinnant     __iarray_cap_ = 0;
2763e519524SHoward Hinnant     __parray_ = 0;
2773e519524SHoward Hinnant     __parray_size_ = 0;
2783e519524SHoward Hinnant     __parray_cap_ = 0;
2793e519524SHoward Hinnant     ::new(&__loc_) locale;
2803e519524SHoward Hinnant }
2813e519524SHoward Hinnant 
2823e519524SHoward Hinnant void
copyfmt(const ios_base & rhs)2833e519524SHoward Hinnant ios_base::copyfmt(const ios_base& rhs)
2843e519524SHoward Hinnant {
2853e519524SHoward Hinnant     // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
286f03763a4SAlp Toker     // Don't alter *this until all needed resources are acquired
2873e519524SHoward Hinnant     unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free);
2883e519524SHoward Hinnant     unique_ptr<int, void (*)(void*)> new_ints(0, free);
2893e519524SHoward Hinnant     unique_ptr<long, void (*)(void*)> new_longs(0, free);
2903e519524SHoward Hinnant     unique_ptr<void*, void (*)(void*)> new_pointers(0, free);
2913e519524SHoward Hinnant     if (__event_cap_ < rhs.__event_size_)
2923e519524SHoward Hinnant     {
293634b9dd7SJoerg Sonnenberger         size_t newesize = sizeof(event_callback) * rhs.__event_size_;
294634b9dd7SJoerg Sonnenberger         new_callbacks.reset(static_cast<event_callback*>(malloc(newesize)));
2953e519524SHoward Hinnant         if (!new_callbacks)
2967232a84eSLouis Dionne             __throw_bad_alloc();
297634b9dd7SJoerg Sonnenberger 
298634b9dd7SJoerg Sonnenberger         size_t newisize = sizeof(int) * rhs.__event_size_;
299634b9dd7SJoerg Sonnenberger         new_ints.reset(static_cast<int *>(malloc(newisize)));
3003e519524SHoward Hinnant         if (!new_ints)
3017232a84eSLouis Dionne             __throw_bad_alloc();
3023e519524SHoward Hinnant     }
3033e519524SHoward Hinnant     if (__iarray_cap_ < rhs.__iarray_size_)
3043e519524SHoward Hinnant     {
305634b9dd7SJoerg Sonnenberger         size_t newsize = sizeof(long) * rhs.__iarray_size_;
306634b9dd7SJoerg Sonnenberger         new_longs.reset(static_cast<long*>(malloc(newsize)));
3073e519524SHoward Hinnant         if (!new_longs)
3087232a84eSLouis Dionne             __throw_bad_alloc();
3093e519524SHoward Hinnant     }
3103e519524SHoward Hinnant     if (__parray_cap_ < rhs.__parray_size_)
3113e519524SHoward Hinnant     {
312634b9dd7SJoerg Sonnenberger         size_t newsize = sizeof(void*) * rhs.__parray_size_;
313634b9dd7SJoerg Sonnenberger         new_pointers.reset(static_cast<void**>(malloc(newsize)));
3143e519524SHoward Hinnant         if (!new_pointers)
3157232a84eSLouis Dionne             __throw_bad_alloc();
3163e519524SHoward Hinnant     }
3173e519524SHoward Hinnant     // Got everything we need.  Copy everything but __rdstate_, __rdbuf_ and __exceptions_
3183e519524SHoward Hinnant     __fmtflags_ = rhs.__fmtflags_;
3193e519524SHoward Hinnant     __precision_ = rhs.__precision_;
3203e519524SHoward Hinnant     __width_ = rhs.__width_;
321634b9dd7SJoerg Sonnenberger     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
322634b9dd7SJoerg Sonnenberger     const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_);
3233e519524SHoward Hinnant     lhs_loc = rhs_loc;
3243e519524SHoward Hinnant     if (__event_cap_ < rhs.__event_size_)
3253e519524SHoward Hinnant     {
3263e519524SHoward Hinnant         free(__fn_);
3273e519524SHoward Hinnant         __fn_ = new_callbacks.release();
3283e519524SHoward Hinnant         free(__index_);
3293e519524SHoward Hinnant         __index_ = new_ints.release();
3303e519524SHoward Hinnant         __event_cap_ = rhs.__event_size_;
3313e519524SHoward Hinnant     }
3323e519524SHoward Hinnant     for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_)
3333e519524SHoward Hinnant     {
3343e519524SHoward Hinnant         __fn_[__event_size_] = rhs.__fn_[__event_size_];
3353e519524SHoward Hinnant         __index_[__event_size_] = rhs.__index_[__event_size_];
3363e519524SHoward Hinnant     }
3373e519524SHoward Hinnant     if (__iarray_cap_ < rhs.__iarray_size_)
3383e519524SHoward Hinnant     {
3393e519524SHoward Hinnant         free(__iarray_);
3403e519524SHoward Hinnant         __iarray_ = new_longs.release();
3413e519524SHoward Hinnant         __iarray_cap_ = rhs.__iarray_size_;
3423e519524SHoward Hinnant     }
3433e519524SHoward Hinnant     for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_)
3443e519524SHoward Hinnant         __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_];
3453e519524SHoward Hinnant     if (__parray_cap_ < rhs.__parray_size_)
3463e519524SHoward Hinnant     {
3473e519524SHoward Hinnant         free(__parray_);
3483e519524SHoward Hinnant         __parray_ = new_pointers.release();
3493e519524SHoward Hinnant         __parray_cap_ = rhs.__parray_size_;
3503e519524SHoward Hinnant     }
3513e519524SHoward Hinnant     for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_)
3523e519524SHoward Hinnant         __parray_[__parray_size_] = rhs.__parray_[__parray_size_];
3533e519524SHoward Hinnant }
3543e519524SHoward Hinnant 
3553e519524SHoward Hinnant void
move(ios_base & rhs)3563e519524SHoward Hinnant ios_base::move(ios_base& rhs)
3573e519524SHoward Hinnant {
3583e519524SHoward Hinnant     // *this is uninitialized
3593e519524SHoward Hinnant     __fmtflags_ = rhs.__fmtflags_;
3603e519524SHoward Hinnant     __precision_ = rhs.__precision_;
3613e519524SHoward Hinnant     __width_ = rhs.__width_;
3623e519524SHoward Hinnant     __rdstate_ = rhs.__rdstate_;
3633e519524SHoward Hinnant     __exceptions_ = rhs.__exceptions_;
3643e519524SHoward Hinnant     __rdbuf_ = 0;
365634b9dd7SJoerg Sonnenberger     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
3663e519524SHoward Hinnant     ::new(&__loc_) locale(rhs_loc);
3673e519524SHoward Hinnant     __fn_ = rhs.__fn_;
3683e519524SHoward Hinnant     rhs.__fn_ = 0;
3693e519524SHoward Hinnant     __index_ = rhs.__index_;
3703e519524SHoward Hinnant     rhs.__index_ = 0;
3713e519524SHoward Hinnant     __event_size_ = rhs.__event_size_;
3723e519524SHoward Hinnant     rhs.__event_size_ = 0;
3733e519524SHoward Hinnant     __event_cap_ = rhs.__event_cap_;
3743e519524SHoward Hinnant     rhs.__event_cap_ = 0;
3753e519524SHoward Hinnant     __iarray_ = rhs.__iarray_;
3763e519524SHoward Hinnant     rhs.__iarray_ = 0;
3773e519524SHoward Hinnant     __iarray_size_ = rhs.__iarray_size_;
3783e519524SHoward Hinnant     rhs.__iarray_size_ = 0;
3793e519524SHoward Hinnant     __iarray_cap_ = rhs.__iarray_cap_;
3803e519524SHoward Hinnant     rhs.__iarray_cap_ = 0;
3813e519524SHoward Hinnant     __parray_ = rhs.__parray_;
3823e519524SHoward Hinnant     rhs.__parray_ = 0;
3833e519524SHoward Hinnant     __parray_size_ = rhs.__parray_size_;
3843e519524SHoward Hinnant     rhs.__parray_size_ = 0;
3853e519524SHoward Hinnant     __parray_cap_ = rhs.__parray_cap_;
3863e519524SHoward Hinnant     rhs.__parray_cap_ = 0;
3873e519524SHoward Hinnant }
3883e519524SHoward Hinnant 
3893e519524SHoward Hinnant void
swap(ios_base & rhs)3905601305fSLouis Dionne ios_base::swap(ios_base& rhs) noexcept
3913e519524SHoward Hinnant {
392ce48a113SHoward Hinnant     _VSTD::swap(__fmtflags_, rhs.__fmtflags_);
393ce48a113SHoward Hinnant     _VSTD::swap(__precision_, rhs.__precision_);
394ce48a113SHoward Hinnant     _VSTD::swap(__width_, rhs.__width_);
395ce48a113SHoward Hinnant     _VSTD::swap(__rdstate_, rhs.__rdstate_);
396ce48a113SHoward Hinnant     _VSTD::swap(__exceptions_, rhs.__exceptions_);
397634b9dd7SJoerg Sonnenberger     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
398634b9dd7SJoerg Sonnenberger     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
399ce48a113SHoward Hinnant     _VSTD::swap(lhs_loc, rhs_loc);
400ce48a113SHoward Hinnant     _VSTD::swap(__fn_, rhs.__fn_);
401ce48a113SHoward Hinnant     _VSTD::swap(__index_, rhs.__index_);
402ce48a113SHoward Hinnant     _VSTD::swap(__event_size_, rhs.__event_size_);
403ce48a113SHoward Hinnant     _VSTD::swap(__event_cap_, rhs.__event_cap_);
404ce48a113SHoward Hinnant     _VSTD::swap(__iarray_, rhs.__iarray_);
405ce48a113SHoward Hinnant     _VSTD::swap(__iarray_size_, rhs.__iarray_size_);
406ce48a113SHoward Hinnant     _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_);
407ce48a113SHoward Hinnant     _VSTD::swap(__parray_, rhs.__parray_);
408ce48a113SHoward Hinnant     _VSTD::swap(__parray_size_, rhs.__parray_size_);
409ce48a113SHoward Hinnant     _VSTD::swap(__parray_cap_, rhs.__parray_cap_);
4103e519524SHoward Hinnant }
4113e519524SHoward Hinnant 
4123e519524SHoward Hinnant void
__set_badbit_and_consider_rethrow()4133e519524SHoward Hinnant ios_base::__set_badbit_and_consider_rethrow()
4143e519524SHoward Hinnant {
4153e519524SHoward Hinnant     __rdstate_ |= badbit;
41654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
4173e519524SHoward Hinnant     if (__exceptions_ & badbit)
4183e519524SHoward Hinnant         throw;
419940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS
4203e519524SHoward Hinnant }
4213e519524SHoward Hinnant 
4223e519524SHoward Hinnant void
__set_failbit_and_consider_rethrow()4233e519524SHoward Hinnant ios_base::__set_failbit_and_consider_rethrow()
4243e519524SHoward Hinnant {
4253e519524SHoward Hinnant     __rdstate_ |= failbit;
42654b409fdSHoward Hinnant #ifndef _LIBCPP_NO_EXCEPTIONS
4273e519524SHoward Hinnant     if (__exceptions_ & failbit)
4283e519524SHoward Hinnant         throw;
429940e211cSHoward Hinnant #endif // _LIBCPP_NO_EXCEPTIONS
4303e519524SHoward Hinnant }
4313e519524SHoward Hinnant 
4323e519524SHoward Hinnant bool
sync_with_stdio(bool sync)4333e519524SHoward Hinnant ios_base::sync_with_stdio(bool sync)
4343e519524SHoward Hinnant {
4353e519524SHoward Hinnant     static bool previous_state = true;
4363e519524SHoward Hinnant     bool r = previous_state;
4373e519524SHoward Hinnant     previous_state = sync;
4383e519524SHoward Hinnant     return r;
4393e519524SHoward Hinnant }
4403e519524SHoward Hinnant 
4413e519524SHoward Hinnant _LIBCPP_END_NAMESPACE_STD
442*bbb0f2c7SArthur O'Dwyer 
443*bbb0f2c7SArthur O'Dwyer _LIBCPP_POP_MACROS
444