xref: /freebsd-12.1/contrib/libc++/src/ios.cpp (revision f9448bf3)
17a984708SDavid Chisnall //===-------------------------- ios.cpp -----------------------------------===//
27a984708SDavid Chisnall //
37a984708SDavid Chisnall //                     The LLVM Compiler Infrastructure
47a984708SDavid Chisnall //
57a984708SDavid Chisnall // This file is dual licensed under the MIT and the University of Illinois Open
67a984708SDavid Chisnall // Source Licenses. See LICENSE.TXT for details.
77a984708SDavid Chisnall //
87a984708SDavid Chisnall //===----------------------------------------------------------------------===//
97a984708SDavid Chisnall 
10d72607e9SDimitry Andric #include "__config"
11854fa44bSDimitry Andric 
127a984708SDavid Chisnall #include "ios"
13854fa44bSDimitry Andric 
14854fa44bSDimitry Andric #include <stdlib.h>
15854fa44bSDimitry Andric 
167a984708SDavid Chisnall #include "__locale"
177a984708SDavid Chisnall #include "algorithm"
189729cf09SDimitry Andric #include "include/config_elast.h"
19854fa44bSDimitry Andric #include "istream"
20854fa44bSDimitry Andric #include "limits"
217a984708SDavid Chisnall #include "memory"
227a984708SDavid Chisnall #include "new"
23854fa44bSDimitry Andric #include "streambuf"
24854fa44bSDimitry Andric #include "string"
25*f9448bf3SDimitry Andric #include "__undef_macros"
267a984708SDavid Chisnall 
277a984708SDavid Chisnall _LIBCPP_BEGIN_NAMESPACE_STD
287a984708SDavid Chisnall 
29aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<char>;
30aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<wchar_t>;
317a984708SDavid Chisnall 
32aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<char>;
33aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<wchar_t>;
347a984708SDavid Chisnall 
35aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<char>;
36aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<wchar_t>;
377a984708SDavid Chisnall 
38aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<char>;
39aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<wchar_t>;
407a984708SDavid Chisnall 
41aed8d94eSDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_iostream<char>;
427a984708SDavid Chisnall 
437a984708SDavid Chisnall class _LIBCPP_HIDDEN __iostream_category
447a984708SDavid Chisnall     : public __do_message
457a984708SDavid Chisnall {
467a984708SDavid Chisnall public:
477a984708SDavid Chisnall     virtual const char* name() const _NOEXCEPT;
487a984708SDavid Chisnall     virtual string message(int ev) const;
497a984708SDavid Chisnall };
507a984708SDavid Chisnall 
517a984708SDavid Chisnall const char*
name() const527a984708SDavid Chisnall __iostream_category::name() const _NOEXCEPT
537a984708SDavid Chisnall {
547a984708SDavid Chisnall     return "iostream";
557a984708SDavid Chisnall }
567a984708SDavid Chisnall 
577a984708SDavid Chisnall string
message(int ev) const587a984708SDavid Chisnall __iostream_category::message(int ev) const
597a984708SDavid Chisnall {
607a984708SDavid Chisnall     if (ev != static_cast<int>(io_errc::stream)
61d72607e9SDimitry Andric #ifdef _LIBCPP_ELAST
62d72607e9SDimitry Andric         && ev <= _LIBCPP_ELAST
63d72607e9SDimitry Andric #endif  // _LIBCPP_ELAST
647a984708SDavid Chisnall         )
657a984708SDavid Chisnall         return __do_message::message(ev);
667a984708SDavid Chisnall     return string("unspecified iostream_category error");
677a984708SDavid Chisnall }
687a984708SDavid Chisnall 
697a984708SDavid Chisnall const error_category&
iostream_category()704f7ab58eSDimitry Andric iostream_category() _NOEXCEPT
717a984708SDavid Chisnall {
727a984708SDavid Chisnall     static __iostream_category s;
737a984708SDavid Chisnall     return s;
747a984708SDavid Chisnall }
757a984708SDavid Chisnall 
767a984708SDavid Chisnall // ios_base::failure
777a984708SDavid Chisnall 
failure(const string & msg,const error_code & ec)787a984708SDavid Chisnall ios_base::failure::failure(const string& msg, const error_code& ec)
797a984708SDavid Chisnall     : system_error(ec, msg)
807a984708SDavid Chisnall {
817a984708SDavid Chisnall }
827a984708SDavid Chisnall 
failure(const char * msg,const error_code & ec)837a984708SDavid Chisnall ios_base::failure::failure(const char* msg, const error_code& ec)
847a984708SDavid Chisnall     : system_error(ec, msg)
857a984708SDavid Chisnall {
867a984708SDavid Chisnall }
877a984708SDavid Chisnall 
~failure()887a984708SDavid Chisnall ios_base::failure::~failure() throw()
897a984708SDavid Chisnall {
907a984708SDavid Chisnall }
917a984708SDavid Chisnall 
927a984708SDavid Chisnall // ios_base locale
937a984708SDavid Chisnall 
947a984708SDavid Chisnall const ios_base::fmtflags ios_base::boolalpha;
957a984708SDavid Chisnall const ios_base::fmtflags ios_base::dec;
967a984708SDavid Chisnall const ios_base::fmtflags ios_base::fixed;
977a984708SDavid Chisnall const ios_base::fmtflags ios_base::hex;
987a984708SDavid Chisnall const ios_base::fmtflags ios_base::internal;
997a984708SDavid Chisnall const ios_base::fmtflags ios_base::left;
1007a984708SDavid Chisnall const ios_base::fmtflags ios_base::oct;
1017a984708SDavid Chisnall const ios_base::fmtflags ios_base::right;
1027a984708SDavid Chisnall const ios_base::fmtflags ios_base::scientific;
1037a984708SDavid Chisnall const ios_base::fmtflags ios_base::showbase;
1047a984708SDavid Chisnall const ios_base::fmtflags ios_base::showpoint;
1057a984708SDavid Chisnall const ios_base::fmtflags ios_base::showpos;
1067a984708SDavid Chisnall const ios_base::fmtflags ios_base::skipws;
1077a984708SDavid Chisnall const ios_base::fmtflags ios_base::unitbuf;
1087a984708SDavid Chisnall const ios_base::fmtflags ios_base::uppercase;
1097a984708SDavid Chisnall const ios_base::fmtflags ios_base::adjustfield;
1107a984708SDavid Chisnall const ios_base::fmtflags ios_base::basefield;
1117a984708SDavid Chisnall const ios_base::fmtflags ios_base::floatfield;
1127a984708SDavid Chisnall 
1137a984708SDavid Chisnall const ios_base::iostate ios_base::badbit;
1147a984708SDavid Chisnall const ios_base::iostate ios_base::eofbit;
1157a984708SDavid Chisnall const ios_base::iostate ios_base::failbit;
1167a984708SDavid Chisnall const ios_base::iostate ios_base::goodbit;
1177a984708SDavid Chisnall 
1187a984708SDavid Chisnall const ios_base::openmode ios_base::app;
1197a984708SDavid Chisnall const ios_base::openmode ios_base::ate;
1207a984708SDavid Chisnall const ios_base::openmode ios_base::binary;
1217a984708SDavid Chisnall const ios_base::openmode ios_base::in;
1227a984708SDavid Chisnall const ios_base::openmode ios_base::out;
1237a984708SDavid Chisnall const ios_base::openmode ios_base::trunc;
1247a984708SDavid Chisnall 
1257a984708SDavid Chisnall void
__call_callbacks(event ev)1267a984708SDavid Chisnall ios_base::__call_callbacks(event ev)
1277a984708SDavid Chisnall {
1287a984708SDavid Chisnall     for (size_t i = __event_size_; i;)
1297a984708SDavid Chisnall     {
1307a984708SDavid Chisnall         --i;
1317a984708SDavid Chisnall         __fn_[i](ev, *this, __index_[i]);
1327a984708SDavid Chisnall     }
1337a984708SDavid Chisnall }
1347a984708SDavid Chisnall 
1357a984708SDavid Chisnall // locale
1367a984708SDavid Chisnall 
1377a984708SDavid Chisnall locale
imbue(const locale & newloc)1387a984708SDavid Chisnall ios_base::imbue(const locale& newloc)
1397a984708SDavid Chisnall {
1407a984708SDavid Chisnall     static_assert(sizeof(locale) == sizeof(__loc_), "");
141d72607e9SDimitry Andric     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
1427a984708SDavid Chisnall     locale oldloc = loc_storage;
1437a984708SDavid Chisnall     loc_storage = newloc;
1447a984708SDavid Chisnall     __call_callbacks(imbue_event);
1457a984708SDavid Chisnall     return oldloc;
1467a984708SDavid Chisnall }
1477a984708SDavid Chisnall 
1487a984708SDavid Chisnall locale
getloc() const1497a984708SDavid Chisnall ios_base::getloc() const
1507a984708SDavid Chisnall {
151d72607e9SDimitry Andric     const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_);
1527a984708SDavid Chisnall     return loc_storage;
1537a984708SDavid Chisnall }
1547a984708SDavid Chisnall 
1557a984708SDavid Chisnall // xalloc
1569729cf09SDimitry Andric #if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
1574f7ab58eSDimitry Andric atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
1584f7ab58eSDimitry Andric #else
1597a984708SDavid Chisnall int ios_base::__xindex_ = 0;
1604f7ab58eSDimitry Andric #endif
1617a984708SDavid Chisnall 
162d72607e9SDimitry Andric template <typename _Tp>
__ios_new_cap(size_t __req_size,size_t __current_cap)163d72607e9SDimitry Andric static size_t __ios_new_cap(size_t __req_size, size_t __current_cap)
164d72607e9SDimitry Andric { // Precondition: __req_size > __current_cap
165d72607e9SDimitry Andric 	const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
166d72607e9SDimitry Andric 	if (__req_size < mx/2)
167d72607e9SDimitry Andric 		return _VSTD::max(2 * __current_cap, __req_size);
168d72607e9SDimitry Andric 	else
169d72607e9SDimitry Andric 		return mx;
170d72607e9SDimitry Andric }
171d72607e9SDimitry Andric 
1727a984708SDavid Chisnall int
xalloc()1737a984708SDavid Chisnall ios_base::xalloc()
1747a984708SDavid Chisnall {
1757a984708SDavid Chisnall     return __xindex_++;
1767a984708SDavid Chisnall }
1777a984708SDavid Chisnall 
1787a984708SDavid Chisnall long&
iword(int index)1797a984708SDavid Chisnall ios_base::iword(int index)
1807a984708SDavid Chisnall {
1817a984708SDavid Chisnall     size_t req_size = static_cast<size_t>(index)+1;
1827a984708SDavid Chisnall     if (req_size > __iarray_cap_)
1837a984708SDavid Chisnall     {
184d72607e9SDimitry Andric         size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
185d72607e9SDimitry Andric         long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
1867a984708SDavid Chisnall         if (iarray == 0)
1877a984708SDavid Chisnall         {
1887a984708SDavid Chisnall             setstate(badbit);
1897a984708SDavid Chisnall             static long error;
1907a984708SDavid Chisnall             error = 0;
1917a984708SDavid Chisnall             return error;
1927a984708SDavid Chisnall         }
1937a984708SDavid Chisnall         __iarray_ = iarray;
194d72607e9SDimitry Andric         for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
1957a984708SDavid Chisnall             *p = 0;
196d72607e9SDimitry Andric         __iarray_cap_ = newcap;
1977a984708SDavid Chisnall     }
1987a984708SDavid Chisnall     __iarray_size_ = max<size_t>(__iarray_size_, req_size);
1997a984708SDavid Chisnall     return __iarray_[index];
2007a984708SDavid Chisnall }
2017a984708SDavid Chisnall 
2027a984708SDavid Chisnall void*&
pword(int index)2037a984708SDavid Chisnall ios_base::pword(int index)
2047a984708SDavid Chisnall {
2057a984708SDavid Chisnall     size_t req_size = static_cast<size_t>(index)+1;
2067a984708SDavid Chisnall     if (req_size > __parray_cap_)
2077a984708SDavid Chisnall     {
208d72607e9SDimitry Andric         size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_);
209d72607e9SDimitry Andric         void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *)));
2107a984708SDavid Chisnall         if (parray == 0)
2117a984708SDavid Chisnall         {
2127a984708SDavid Chisnall             setstate(badbit);
2137a984708SDavid Chisnall             static void* error;
2147a984708SDavid Chisnall             error = 0;
2157a984708SDavid Chisnall             return error;
2167a984708SDavid Chisnall         }
2177a984708SDavid Chisnall         __parray_ = parray;
218d72607e9SDimitry Andric         for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
2197a984708SDavid Chisnall             *p = 0;
220d72607e9SDimitry Andric         __parray_cap_ = newcap;
2217a984708SDavid Chisnall     }
2227a984708SDavid Chisnall     __parray_size_ = max<size_t>(__parray_size_, req_size);
2237a984708SDavid Chisnall     return __parray_[index];
2247a984708SDavid Chisnall }
2257a984708SDavid Chisnall 
2267a984708SDavid Chisnall // register_callback
2277a984708SDavid Chisnall 
2287a984708SDavid Chisnall void
register_callback(event_callback fn,int index)2297a984708SDavid Chisnall ios_base::register_callback(event_callback fn, int index)
2307a984708SDavid Chisnall {
2317a984708SDavid Chisnall     size_t req_size = __event_size_ + 1;
2327a984708SDavid Chisnall     if (req_size > __event_cap_)
2337a984708SDavid Chisnall     {
234d72607e9SDimitry Andric         size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_);
235d72607e9SDimitry Andric         event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
2367a984708SDavid Chisnall         if (fns == 0)
2377a984708SDavid Chisnall             setstate(badbit);
2387a984708SDavid Chisnall         __fn_ = fns;
239d72607e9SDimitry Andric         int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int)));
2407a984708SDavid Chisnall         if (indxs == 0)
2417a984708SDavid Chisnall             setstate(badbit);
2427a984708SDavid Chisnall         __index_ = indxs;
243d72607e9SDimitry Andric         __event_cap_ = newcap;
2447a984708SDavid Chisnall     }
2457a984708SDavid Chisnall     __fn_[__event_size_] = fn;
2467a984708SDavid Chisnall     __index_[__event_size_] = index;
2477a984708SDavid Chisnall     ++__event_size_;
2487a984708SDavid Chisnall }
2497a984708SDavid Chisnall 
~ios_base()2507a984708SDavid Chisnall ios_base::~ios_base()
2517a984708SDavid Chisnall {
2527a984708SDavid Chisnall     __call_callbacks(erase_event);
253d72607e9SDimitry Andric     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
2547a984708SDavid Chisnall     loc_storage.~locale();
2557a984708SDavid Chisnall     free(__fn_);
2567a984708SDavid Chisnall     free(__index_);
2577a984708SDavid Chisnall     free(__iarray_);
2587a984708SDavid Chisnall     free(__parray_);
2597a984708SDavid Chisnall }
2607a984708SDavid Chisnall 
2617a984708SDavid Chisnall // iostate
2627a984708SDavid Chisnall 
2637a984708SDavid Chisnall void
clear(iostate state)2647a984708SDavid Chisnall ios_base::clear(iostate state)
2657a984708SDavid Chisnall {
2667a984708SDavid Chisnall     if (__rdbuf_)
2677a984708SDavid Chisnall         __rdstate_ = state;
2687a984708SDavid Chisnall     else
2697a984708SDavid Chisnall         __rdstate_ = state | badbit;
2707a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
2717a984708SDavid Chisnall     if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0)
2727a984708SDavid Chisnall         throw failure("ios_base::clear");
2737a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
2747a984708SDavid Chisnall }
2757a984708SDavid Chisnall 
2767a984708SDavid Chisnall // init
2777a984708SDavid Chisnall 
2787a984708SDavid Chisnall void
init(void * sb)2797a984708SDavid Chisnall ios_base::init(void* sb)
2807a984708SDavid Chisnall {
2817a984708SDavid Chisnall     __rdbuf_ = sb;
2827a984708SDavid Chisnall     __rdstate_ = __rdbuf_ ? goodbit : badbit;
2837a984708SDavid Chisnall     __exceptions_ = goodbit;
2847a984708SDavid Chisnall     __fmtflags_ = skipws | dec;
2857a984708SDavid Chisnall     __width_ = 0;
2867a984708SDavid Chisnall     __precision_ = 6;
2877a984708SDavid Chisnall     __fn_ = 0;
2887a984708SDavid Chisnall     __index_ = 0;
2897a984708SDavid Chisnall     __event_size_ = 0;
2907a984708SDavid Chisnall     __event_cap_ = 0;
2917a984708SDavid Chisnall     __iarray_ = 0;
2927a984708SDavid Chisnall     __iarray_size_ = 0;
2937a984708SDavid Chisnall     __iarray_cap_ = 0;
2947a984708SDavid Chisnall     __parray_ = 0;
2957a984708SDavid Chisnall     __parray_size_ = 0;
2967a984708SDavid Chisnall     __parray_cap_ = 0;
2977a984708SDavid Chisnall     ::new(&__loc_) locale;
2987a984708SDavid Chisnall }
2997a984708SDavid Chisnall 
3007a984708SDavid Chisnall void
copyfmt(const ios_base & rhs)3017a984708SDavid Chisnall ios_base::copyfmt(const ios_base& rhs)
3027a984708SDavid Chisnall {
3037a984708SDavid Chisnall     // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
304d72607e9SDimitry Andric     // Don't alter *this until all needed resources are acquired
3057a984708SDavid Chisnall     unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free);
3067a984708SDavid Chisnall     unique_ptr<int, void (*)(void*)> new_ints(0, free);
3077a984708SDavid Chisnall     unique_ptr<long, void (*)(void*)> new_longs(0, free);
3087a984708SDavid Chisnall     unique_ptr<void*, void (*)(void*)> new_pointers(0, free);
3097a984708SDavid Chisnall     if (__event_cap_ < rhs.__event_size_)
3107a984708SDavid Chisnall     {
311d72607e9SDimitry Andric         size_t newesize = sizeof(event_callback) * rhs.__event_size_;
312d72607e9SDimitry Andric         new_callbacks.reset(static_cast<event_callback*>(malloc(newesize)));
3137a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
3147a984708SDavid Chisnall         if (!new_callbacks)
3157a984708SDavid Chisnall             throw bad_alloc();
3167a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
317d72607e9SDimitry Andric 
318d72607e9SDimitry Andric         size_t newisize = sizeof(int) * rhs.__event_size_;
319d72607e9SDimitry Andric         new_ints.reset(static_cast<int *>(malloc(newisize)));
3207a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
3217a984708SDavid Chisnall         if (!new_ints)
3227a984708SDavid Chisnall             throw bad_alloc();
3237a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
3247a984708SDavid Chisnall     }
3257a984708SDavid Chisnall     if (__iarray_cap_ < rhs.__iarray_size_)
3267a984708SDavid Chisnall     {
327d72607e9SDimitry Andric         size_t newsize = sizeof(long) * rhs.__iarray_size_;
328d72607e9SDimitry Andric         new_longs.reset(static_cast<long*>(malloc(newsize)));
3297a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
3307a984708SDavid Chisnall         if (!new_longs)
3317a984708SDavid Chisnall             throw bad_alloc();
3327a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
3337a984708SDavid Chisnall     }
3347a984708SDavid Chisnall     if (__parray_cap_ < rhs.__parray_size_)
3357a984708SDavid Chisnall     {
336d72607e9SDimitry Andric         size_t newsize = sizeof(void*) * rhs.__parray_size_;
337d72607e9SDimitry Andric         new_pointers.reset(static_cast<void**>(malloc(newsize)));
3387a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
3397a984708SDavid Chisnall         if (!new_pointers)
3407a984708SDavid Chisnall             throw bad_alloc();
3417a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
3427a984708SDavid Chisnall     }
3437a984708SDavid Chisnall     // Got everything we need.  Copy everything but __rdstate_, __rdbuf_ and __exceptions_
3447a984708SDavid Chisnall     __fmtflags_ = rhs.__fmtflags_;
3457a984708SDavid Chisnall     __precision_ = rhs.__precision_;
3467a984708SDavid Chisnall     __width_ = rhs.__width_;
347d72607e9SDimitry Andric     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
348d72607e9SDimitry Andric     const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_);
3497a984708SDavid Chisnall     lhs_loc = rhs_loc;
3507a984708SDavid Chisnall     if (__event_cap_ < rhs.__event_size_)
3517a984708SDavid Chisnall     {
3527a984708SDavid Chisnall         free(__fn_);
3537a984708SDavid Chisnall         __fn_ = new_callbacks.release();
3547a984708SDavid Chisnall         free(__index_);
3557a984708SDavid Chisnall         __index_ = new_ints.release();
3567a984708SDavid Chisnall         __event_cap_ = rhs.__event_size_;
3577a984708SDavid Chisnall     }
3587a984708SDavid Chisnall     for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_)
3597a984708SDavid Chisnall     {
3607a984708SDavid Chisnall         __fn_[__event_size_] = rhs.__fn_[__event_size_];
3617a984708SDavid Chisnall         __index_[__event_size_] = rhs.__index_[__event_size_];
3627a984708SDavid Chisnall     }
3637a984708SDavid Chisnall     if (__iarray_cap_ < rhs.__iarray_size_)
3647a984708SDavid Chisnall     {
3657a984708SDavid Chisnall         free(__iarray_);
3667a984708SDavid Chisnall         __iarray_ = new_longs.release();
3677a984708SDavid Chisnall         __iarray_cap_ = rhs.__iarray_size_;
3687a984708SDavid Chisnall     }
3697a984708SDavid Chisnall     for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_)
3707a984708SDavid Chisnall         __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_];
3717a984708SDavid Chisnall     if (__parray_cap_ < rhs.__parray_size_)
3727a984708SDavid Chisnall     {
3737a984708SDavid Chisnall         free(__parray_);
3747a984708SDavid Chisnall         __parray_ = new_pointers.release();
3757a984708SDavid Chisnall         __parray_cap_ = rhs.__parray_size_;
3767a984708SDavid Chisnall     }
3777a984708SDavid Chisnall     for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_)
3787a984708SDavid Chisnall         __parray_[__parray_size_] = rhs.__parray_[__parray_size_];
3797a984708SDavid Chisnall }
3807a984708SDavid Chisnall 
3817a984708SDavid Chisnall void
move(ios_base & rhs)3827a984708SDavid Chisnall ios_base::move(ios_base& rhs)
3837a984708SDavid Chisnall {
3847a984708SDavid Chisnall     // *this is uninitialized
3857a984708SDavid Chisnall     __fmtflags_ = rhs.__fmtflags_;
3867a984708SDavid Chisnall     __precision_ = rhs.__precision_;
3877a984708SDavid Chisnall     __width_ = rhs.__width_;
3887a984708SDavid Chisnall     __rdstate_ = rhs.__rdstate_;
3897a984708SDavid Chisnall     __exceptions_ = rhs.__exceptions_;
3907a984708SDavid Chisnall     __rdbuf_ = 0;
391d72607e9SDimitry Andric     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
3927a984708SDavid Chisnall     ::new(&__loc_) locale(rhs_loc);
3937a984708SDavid Chisnall     __fn_ = rhs.__fn_;
3947a984708SDavid Chisnall     rhs.__fn_ = 0;
3957a984708SDavid Chisnall     __index_ = rhs.__index_;
3967a984708SDavid Chisnall     rhs.__index_ = 0;
3977a984708SDavid Chisnall     __event_size_ = rhs.__event_size_;
3987a984708SDavid Chisnall     rhs.__event_size_ = 0;
3997a984708SDavid Chisnall     __event_cap_ = rhs.__event_cap_;
4007a984708SDavid Chisnall     rhs.__event_cap_ = 0;
4017a984708SDavid Chisnall     __iarray_ = rhs.__iarray_;
4027a984708SDavid Chisnall     rhs.__iarray_ = 0;
4037a984708SDavid Chisnall     __iarray_size_ = rhs.__iarray_size_;
4047a984708SDavid Chisnall     rhs.__iarray_size_ = 0;
4057a984708SDavid Chisnall     __iarray_cap_ = rhs.__iarray_cap_;
4067a984708SDavid Chisnall     rhs.__iarray_cap_ = 0;
4077a984708SDavid Chisnall     __parray_ = rhs.__parray_;
4087a984708SDavid Chisnall     rhs.__parray_ = 0;
4097a984708SDavid Chisnall     __parray_size_ = rhs.__parray_size_;
4107a984708SDavid Chisnall     rhs.__parray_size_ = 0;
4117a984708SDavid Chisnall     __parray_cap_ = rhs.__parray_cap_;
4127a984708SDavid Chisnall     rhs.__parray_cap_ = 0;
4137a984708SDavid Chisnall }
4147a984708SDavid Chisnall 
4157a984708SDavid Chisnall void
swap(ios_base & rhs)416936e9439SDimitry Andric ios_base::swap(ios_base& rhs) _NOEXCEPT
4177a984708SDavid Chisnall {
4187a984708SDavid Chisnall     _VSTD::swap(__fmtflags_, rhs.__fmtflags_);
4197a984708SDavid Chisnall     _VSTD::swap(__precision_, rhs.__precision_);
4207a984708SDavid Chisnall     _VSTD::swap(__width_, rhs.__width_);
4217a984708SDavid Chisnall     _VSTD::swap(__rdstate_, rhs.__rdstate_);
4227a984708SDavid Chisnall     _VSTD::swap(__exceptions_, rhs.__exceptions_);
423d72607e9SDimitry Andric     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
424d72607e9SDimitry Andric     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
4257a984708SDavid Chisnall     _VSTD::swap(lhs_loc, rhs_loc);
4267a984708SDavid Chisnall     _VSTD::swap(__fn_, rhs.__fn_);
4277a984708SDavid Chisnall     _VSTD::swap(__index_, rhs.__index_);
4287a984708SDavid Chisnall     _VSTD::swap(__event_size_, rhs.__event_size_);
4297a984708SDavid Chisnall     _VSTD::swap(__event_cap_, rhs.__event_cap_);
4307a984708SDavid Chisnall     _VSTD::swap(__iarray_, rhs.__iarray_);
4317a984708SDavid Chisnall     _VSTD::swap(__iarray_size_, rhs.__iarray_size_);
4327a984708SDavid Chisnall     _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_);
4337a984708SDavid Chisnall     _VSTD::swap(__parray_, rhs.__parray_);
4347a984708SDavid Chisnall     _VSTD::swap(__parray_size_, rhs.__parray_size_);
4357a984708SDavid Chisnall     _VSTD::swap(__parray_cap_, rhs.__parray_cap_);
4367a984708SDavid Chisnall }
4377a984708SDavid Chisnall 
4387a984708SDavid Chisnall void
__set_badbit_and_consider_rethrow()4397a984708SDavid Chisnall ios_base::__set_badbit_and_consider_rethrow()
4407a984708SDavid Chisnall {
4417a984708SDavid Chisnall     __rdstate_ |= badbit;
4427a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
4437a984708SDavid Chisnall     if (__exceptions_ & badbit)
4447a984708SDavid Chisnall         throw;
4457a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
4467a984708SDavid Chisnall }
4477a984708SDavid Chisnall 
4487a984708SDavid Chisnall void
__set_failbit_and_consider_rethrow()4497a984708SDavid Chisnall ios_base::__set_failbit_and_consider_rethrow()
4507a984708SDavid Chisnall {
4517a984708SDavid Chisnall     __rdstate_ |= failbit;
4527a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
4537a984708SDavid Chisnall     if (__exceptions_ & failbit)
4547a984708SDavid Chisnall         throw;
4557a984708SDavid Chisnall #endif  // _LIBCPP_NO_EXCEPTIONS
4567a984708SDavid Chisnall }
4577a984708SDavid Chisnall 
4587a984708SDavid Chisnall bool
sync_with_stdio(bool sync)4597a984708SDavid Chisnall ios_base::sync_with_stdio(bool sync)
4607a984708SDavid Chisnall {
4617a984708SDavid Chisnall     static bool previous_state = true;
4627a984708SDavid Chisnall     bool r = previous_state;
4637a984708SDavid Chisnall     previous_state = sync;
4647a984708SDavid Chisnall     return r;
4657a984708SDavid Chisnall }
4667a984708SDavid Chisnall 
4677a984708SDavid Chisnall _LIBCPP_END_NAMESPACE_STD
468