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