1*0b57cec5SDimitry Andric //===-------------------------- ios.cpp -----------------------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "__config" 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric #include "ios" 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include <stdlib.h> 14*0b57cec5SDimitry Andric 15*0b57cec5SDimitry Andric #include "__locale" 16*0b57cec5SDimitry Andric #include "algorithm" 17*0b57cec5SDimitry Andric #include "include/config_elast.h" 18*0b57cec5SDimitry Andric #include "istream" 19*0b57cec5SDimitry Andric #include "limits" 20*0b57cec5SDimitry Andric #include "memory" 21*0b57cec5SDimitry Andric #include "new" 22*0b57cec5SDimitry Andric #include "streambuf" 23*0b57cec5SDimitry Andric #include "string" 24*0b57cec5SDimitry Andric #include "__undef_macros" 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<char>; 29*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<wchar_t>; 30*0b57cec5SDimitry Andric 31*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<char>; 32*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<wchar_t>; 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<char>; 35*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<wchar_t>; 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<char>; 38*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<wchar_t>; 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_iostream<char>; 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andric class _LIBCPP_HIDDEN __iostream_category 43*0b57cec5SDimitry Andric : public __do_message 44*0b57cec5SDimitry Andric { 45*0b57cec5SDimitry Andric public: 46*0b57cec5SDimitry Andric virtual const char* name() const _NOEXCEPT; 47*0b57cec5SDimitry Andric virtual string message(int ev) const; 48*0b57cec5SDimitry Andric }; 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric const char* 51*0b57cec5SDimitry Andric __iostream_category::name() const _NOEXCEPT 52*0b57cec5SDimitry Andric { 53*0b57cec5SDimitry Andric return "iostream"; 54*0b57cec5SDimitry Andric } 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric string 57*0b57cec5SDimitry Andric __iostream_category::message(int ev) const 58*0b57cec5SDimitry Andric { 59*0b57cec5SDimitry Andric if (ev != static_cast<int>(io_errc::stream) 60*0b57cec5SDimitry Andric #ifdef _LIBCPP_ELAST 61*0b57cec5SDimitry Andric && ev <= _LIBCPP_ELAST 62*0b57cec5SDimitry Andric #endif // _LIBCPP_ELAST 63*0b57cec5SDimitry Andric ) 64*0b57cec5SDimitry Andric return __do_message::message(ev); 65*0b57cec5SDimitry Andric return string("unspecified iostream_category error"); 66*0b57cec5SDimitry Andric } 67*0b57cec5SDimitry Andric 68*0b57cec5SDimitry Andric const error_category& 69*0b57cec5SDimitry Andric iostream_category() _NOEXCEPT 70*0b57cec5SDimitry Andric { 71*0b57cec5SDimitry Andric static __iostream_category s; 72*0b57cec5SDimitry Andric return s; 73*0b57cec5SDimitry Andric } 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric // ios_base::failure 76*0b57cec5SDimitry Andric 77*0b57cec5SDimitry Andric ios_base::failure::failure(const string& msg, const error_code& ec) 78*0b57cec5SDimitry Andric : system_error(ec, msg) 79*0b57cec5SDimitry Andric { 80*0b57cec5SDimitry Andric } 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric ios_base::failure::failure(const char* msg, const error_code& ec) 83*0b57cec5SDimitry Andric : system_error(ec, msg) 84*0b57cec5SDimitry Andric { 85*0b57cec5SDimitry Andric } 86*0b57cec5SDimitry Andric 87*0b57cec5SDimitry Andric ios_base::failure::~failure() throw() 88*0b57cec5SDimitry Andric { 89*0b57cec5SDimitry Andric } 90*0b57cec5SDimitry Andric 91*0b57cec5SDimitry Andric // ios_base locale 92*0b57cec5SDimitry Andric 93*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::boolalpha; 94*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::dec; 95*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::fixed; 96*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::hex; 97*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::internal; 98*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::left; 99*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::oct; 100*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::right; 101*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::scientific; 102*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::showbase; 103*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::showpoint; 104*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::showpos; 105*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::skipws; 106*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::unitbuf; 107*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::uppercase; 108*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::adjustfield; 109*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::basefield; 110*0b57cec5SDimitry Andric const ios_base::fmtflags ios_base::floatfield; 111*0b57cec5SDimitry Andric 112*0b57cec5SDimitry Andric const ios_base::iostate ios_base::badbit; 113*0b57cec5SDimitry Andric const ios_base::iostate ios_base::eofbit; 114*0b57cec5SDimitry Andric const ios_base::iostate ios_base::failbit; 115*0b57cec5SDimitry Andric const ios_base::iostate ios_base::goodbit; 116*0b57cec5SDimitry Andric 117*0b57cec5SDimitry Andric const ios_base::openmode ios_base::app; 118*0b57cec5SDimitry Andric const ios_base::openmode ios_base::ate; 119*0b57cec5SDimitry Andric const ios_base::openmode ios_base::binary; 120*0b57cec5SDimitry Andric const ios_base::openmode ios_base::in; 121*0b57cec5SDimitry Andric const ios_base::openmode ios_base::out; 122*0b57cec5SDimitry Andric const ios_base::openmode ios_base::trunc; 123*0b57cec5SDimitry Andric 124*0b57cec5SDimitry Andric void 125*0b57cec5SDimitry Andric ios_base::__call_callbacks(event ev) 126*0b57cec5SDimitry Andric { 127*0b57cec5SDimitry Andric for (size_t i = __event_size_; i;) 128*0b57cec5SDimitry Andric { 129*0b57cec5SDimitry Andric --i; 130*0b57cec5SDimitry Andric __fn_[i](ev, *this, __index_[i]); 131*0b57cec5SDimitry Andric } 132*0b57cec5SDimitry Andric } 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric // locale 135*0b57cec5SDimitry Andric 136*0b57cec5SDimitry Andric locale 137*0b57cec5SDimitry Andric ios_base::imbue(const locale& newloc) 138*0b57cec5SDimitry Andric { 139*0b57cec5SDimitry Andric static_assert(sizeof(locale) == sizeof(__loc_), ""); 140*0b57cec5SDimitry Andric locale& loc_storage = *reinterpret_cast<locale*>(&__loc_); 141*0b57cec5SDimitry Andric locale oldloc = loc_storage; 142*0b57cec5SDimitry Andric loc_storage = newloc; 143*0b57cec5SDimitry Andric __call_callbacks(imbue_event); 144*0b57cec5SDimitry Andric return oldloc; 145*0b57cec5SDimitry Andric } 146*0b57cec5SDimitry Andric 147*0b57cec5SDimitry Andric locale 148*0b57cec5SDimitry Andric ios_base::getloc() const 149*0b57cec5SDimitry Andric { 150*0b57cec5SDimitry Andric const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_); 151*0b57cec5SDimitry Andric return loc_storage; 152*0b57cec5SDimitry Andric } 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric // xalloc 155*0b57cec5SDimitry Andric #if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS) 156*0b57cec5SDimitry Andric atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0); 157*0b57cec5SDimitry Andric #else 158*0b57cec5SDimitry Andric int ios_base::__xindex_ = 0; 159*0b57cec5SDimitry Andric #endif 160*0b57cec5SDimitry Andric 161*0b57cec5SDimitry Andric template <typename _Tp> 162*0b57cec5SDimitry Andric static size_t __ios_new_cap(size_t __req_size, size_t __current_cap) 163*0b57cec5SDimitry Andric { // Precondition: __req_size > __current_cap 164*0b57cec5SDimitry Andric const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp); 165*0b57cec5SDimitry Andric if (__req_size < mx/2) 166*0b57cec5SDimitry Andric return _VSTD::max(2 * __current_cap, __req_size); 167*0b57cec5SDimitry Andric else 168*0b57cec5SDimitry Andric return mx; 169*0b57cec5SDimitry Andric } 170*0b57cec5SDimitry Andric 171*0b57cec5SDimitry Andric int 172*0b57cec5SDimitry Andric ios_base::xalloc() 173*0b57cec5SDimitry Andric { 174*0b57cec5SDimitry Andric return __xindex_++; 175*0b57cec5SDimitry Andric } 176*0b57cec5SDimitry Andric 177*0b57cec5SDimitry Andric long& 178*0b57cec5SDimitry Andric ios_base::iword(int index) 179*0b57cec5SDimitry Andric { 180*0b57cec5SDimitry Andric size_t req_size = static_cast<size_t>(index)+1; 181*0b57cec5SDimitry Andric if (req_size > __iarray_cap_) 182*0b57cec5SDimitry Andric { 183*0b57cec5SDimitry Andric size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_); 184*0b57cec5SDimitry Andric long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long))); 185*0b57cec5SDimitry Andric if (iarray == 0) 186*0b57cec5SDimitry Andric { 187*0b57cec5SDimitry Andric setstate(badbit); 188*0b57cec5SDimitry Andric static long error; 189*0b57cec5SDimitry Andric error = 0; 190*0b57cec5SDimitry Andric return error; 191*0b57cec5SDimitry Andric } 192*0b57cec5SDimitry Andric __iarray_ = iarray; 193*0b57cec5SDimitry Andric for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p) 194*0b57cec5SDimitry Andric *p = 0; 195*0b57cec5SDimitry Andric __iarray_cap_ = newcap; 196*0b57cec5SDimitry Andric } 197*0b57cec5SDimitry Andric __iarray_size_ = max<size_t>(__iarray_size_, req_size); 198*0b57cec5SDimitry Andric return __iarray_[index]; 199*0b57cec5SDimitry Andric } 200*0b57cec5SDimitry Andric 201*0b57cec5SDimitry Andric void*& 202*0b57cec5SDimitry Andric ios_base::pword(int index) 203*0b57cec5SDimitry Andric { 204*0b57cec5SDimitry Andric size_t req_size = static_cast<size_t>(index)+1; 205*0b57cec5SDimitry Andric if (req_size > __parray_cap_) 206*0b57cec5SDimitry Andric { 207*0b57cec5SDimitry Andric size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_); 208*0b57cec5SDimitry Andric void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *))); 209*0b57cec5SDimitry Andric if (parray == 0) 210*0b57cec5SDimitry Andric { 211*0b57cec5SDimitry Andric setstate(badbit); 212*0b57cec5SDimitry Andric static void* error; 213*0b57cec5SDimitry Andric error = 0; 214*0b57cec5SDimitry Andric return error; 215*0b57cec5SDimitry Andric } 216*0b57cec5SDimitry Andric __parray_ = parray; 217*0b57cec5SDimitry Andric for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p) 218*0b57cec5SDimitry Andric *p = 0; 219*0b57cec5SDimitry Andric __parray_cap_ = newcap; 220*0b57cec5SDimitry Andric } 221*0b57cec5SDimitry Andric __parray_size_ = max<size_t>(__parray_size_, req_size); 222*0b57cec5SDimitry Andric return __parray_[index]; 223*0b57cec5SDimitry Andric } 224*0b57cec5SDimitry Andric 225*0b57cec5SDimitry Andric // register_callback 226*0b57cec5SDimitry Andric 227*0b57cec5SDimitry Andric void 228*0b57cec5SDimitry Andric ios_base::register_callback(event_callback fn, int index) 229*0b57cec5SDimitry Andric { 230*0b57cec5SDimitry Andric size_t req_size = __event_size_ + 1; 231*0b57cec5SDimitry Andric if (req_size > __event_cap_) 232*0b57cec5SDimitry Andric { 233*0b57cec5SDimitry Andric size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_); 234*0b57cec5SDimitry Andric event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback))); 235*0b57cec5SDimitry Andric if (fns == 0) 236*0b57cec5SDimitry Andric setstate(badbit); 237*0b57cec5SDimitry Andric __fn_ = fns; 238*0b57cec5SDimitry Andric int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int))); 239*0b57cec5SDimitry Andric if (indxs == 0) 240*0b57cec5SDimitry Andric setstate(badbit); 241*0b57cec5SDimitry Andric __index_ = indxs; 242*0b57cec5SDimitry Andric __event_cap_ = newcap; 243*0b57cec5SDimitry Andric } 244*0b57cec5SDimitry Andric __fn_[__event_size_] = fn; 245*0b57cec5SDimitry Andric __index_[__event_size_] = index; 246*0b57cec5SDimitry Andric ++__event_size_; 247*0b57cec5SDimitry Andric } 248*0b57cec5SDimitry Andric 249*0b57cec5SDimitry Andric ios_base::~ios_base() 250*0b57cec5SDimitry Andric { 251*0b57cec5SDimitry Andric __call_callbacks(erase_event); 252*0b57cec5SDimitry Andric locale& loc_storage = *reinterpret_cast<locale*>(&__loc_); 253*0b57cec5SDimitry Andric loc_storage.~locale(); 254*0b57cec5SDimitry Andric free(__fn_); 255*0b57cec5SDimitry Andric free(__index_); 256*0b57cec5SDimitry Andric free(__iarray_); 257*0b57cec5SDimitry Andric free(__parray_); 258*0b57cec5SDimitry Andric } 259*0b57cec5SDimitry Andric 260*0b57cec5SDimitry Andric // iostate 261*0b57cec5SDimitry Andric 262*0b57cec5SDimitry Andric void 263*0b57cec5SDimitry Andric ios_base::clear(iostate state) 264*0b57cec5SDimitry Andric { 265*0b57cec5SDimitry Andric if (__rdbuf_) 266*0b57cec5SDimitry Andric __rdstate_ = state; 267*0b57cec5SDimitry Andric else 268*0b57cec5SDimitry Andric __rdstate_ = state | badbit; 269*0b57cec5SDimitry Andric 270*0b57cec5SDimitry Andric if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0) 271*0b57cec5SDimitry Andric __throw_failure("ios_base::clear"); 272*0b57cec5SDimitry Andric } 273*0b57cec5SDimitry Andric 274*0b57cec5SDimitry Andric // init 275*0b57cec5SDimitry Andric 276*0b57cec5SDimitry Andric void 277*0b57cec5SDimitry Andric ios_base::init(void* sb) 278*0b57cec5SDimitry Andric { 279*0b57cec5SDimitry Andric __rdbuf_ = sb; 280*0b57cec5SDimitry Andric __rdstate_ = __rdbuf_ ? goodbit : badbit; 281*0b57cec5SDimitry Andric __exceptions_ = goodbit; 282*0b57cec5SDimitry Andric __fmtflags_ = skipws | dec; 283*0b57cec5SDimitry Andric __width_ = 0; 284*0b57cec5SDimitry Andric __precision_ = 6; 285*0b57cec5SDimitry Andric __fn_ = 0; 286*0b57cec5SDimitry Andric __index_ = 0; 287*0b57cec5SDimitry Andric __event_size_ = 0; 288*0b57cec5SDimitry Andric __event_cap_ = 0; 289*0b57cec5SDimitry Andric __iarray_ = 0; 290*0b57cec5SDimitry Andric __iarray_size_ = 0; 291*0b57cec5SDimitry Andric __iarray_cap_ = 0; 292*0b57cec5SDimitry Andric __parray_ = 0; 293*0b57cec5SDimitry Andric __parray_size_ = 0; 294*0b57cec5SDimitry Andric __parray_cap_ = 0; 295*0b57cec5SDimitry Andric ::new(&__loc_) locale; 296*0b57cec5SDimitry Andric } 297*0b57cec5SDimitry Andric 298*0b57cec5SDimitry Andric void 299*0b57cec5SDimitry Andric ios_base::copyfmt(const ios_base& rhs) 300*0b57cec5SDimitry Andric { 301*0b57cec5SDimitry Andric // If we can't acquire the needed resources, throw bad_alloc (can't set badbit) 302*0b57cec5SDimitry Andric // Don't alter *this until all needed resources are acquired 303*0b57cec5SDimitry Andric unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free); 304*0b57cec5SDimitry Andric unique_ptr<int, void (*)(void*)> new_ints(0, free); 305*0b57cec5SDimitry Andric unique_ptr<long, void (*)(void*)> new_longs(0, free); 306*0b57cec5SDimitry Andric unique_ptr<void*, void (*)(void*)> new_pointers(0, free); 307*0b57cec5SDimitry Andric if (__event_cap_ < rhs.__event_size_) 308*0b57cec5SDimitry Andric { 309*0b57cec5SDimitry Andric size_t newesize = sizeof(event_callback) * rhs.__event_size_; 310*0b57cec5SDimitry Andric new_callbacks.reset(static_cast<event_callback*>(malloc(newesize))); 311*0b57cec5SDimitry Andric if (!new_callbacks) 312*0b57cec5SDimitry Andric __throw_bad_alloc(); 313*0b57cec5SDimitry Andric 314*0b57cec5SDimitry Andric size_t newisize = sizeof(int) * rhs.__event_size_; 315*0b57cec5SDimitry Andric new_ints.reset(static_cast<int *>(malloc(newisize))); 316*0b57cec5SDimitry Andric if (!new_ints) 317*0b57cec5SDimitry Andric __throw_bad_alloc(); 318*0b57cec5SDimitry Andric } 319*0b57cec5SDimitry Andric if (__iarray_cap_ < rhs.__iarray_size_) 320*0b57cec5SDimitry Andric { 321*0b57cec5SDimitry Andric size_t newsize = sizeof(long) * rhs.__iarray_size_; 322*0b57cec5SDimitry Andric new_longs.reset(static_cast<long*>(malloc(newsize))); 323*0b57cec5SDimitry Andric if (!new_longs) 324*0b57cec5SDimitry Andric __throw_bad_alloc(); 325*0b57cec5SDimitry Andric } 326*0b57cec5SDimitry Andric if (__parray_cap_ < rhs.__parray_size_) 327*0b57cec5SDimitry Andric { 328*0b57cec5SDimitry Andric size_t newsize = sizeof(void*) * rhs.__parray_size_; 329*0b57cec5SDimitry Andric new_pointers.reset(static_cast<void**>(malloc(newsize))); 330*0b57cec5SDimitry Andric if (!new_pointers) 331*0b57cec5SDimitry Andric __throw_bad_alloc(); 332*0b57cec5SDimitry Andric } 333*0b57cec5SDimitry Andric // Got everything we need. Copy everything but __rdstate_, __rdbuf_ and __exceptions_ 334*0b57cec5SDimitry Andric __fmtflags_ = rhs.__fmtflags_; 335*0b57cec5SDimitry Andric __precision_ = rhs.__precision_; 336*0b57cec5SDimitry Andric __width_ = rhs.__width_; 337*0b57cec5SDimitry Andric locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_); 338*0b57cec5SDimitry Andric const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_); 339*0b57cec5SDimitry Andric lhs_loc = rhs_loc; 340*0b57cec5SDimitry Andric if (__event_cap_ < rhs.__event_size_) 341*0b57cec5SDimitry Andric { 342*0b57cec5SDimitry Andric free(__fn_); 343*0b57cec5SDimitry Andric __fn_ = new_callbacks.release(); 344*0b57cec5SDimitry Andric free(__index_); 345*0b57cec5SDimitry Andric __index_ = new_ints.release(); 346*0b57cec5SDimitry Andric __event_cap_ = rhs.__event_size_; 347*0b57cec5SDimitry Andric } 348*0b57cec5SDimitry Andric for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_) 349*0b57cec5SDimitry Andric { 350*0b57cec5SDimitry Andric __fn_[__event_size_] = rhs.__fn_[__event_size_]; 351*0b57cec5SDimitry Andric __index_[__event_size_] = rhs.__index_[__event_size_]; 352*0b57cec5SDimitry Andric } 353*0b57cec5SDimitry Andric if (__iarray_cap_ < rhs.__iarray_size_) 354*0b57cec5SDimitry Andric { 355*0b57cec5SDimitry Andric free(__iarray_); 356*0b57cec5SDimitry Andric __iarray_ = new_longs.release(); 357*0b57cec5SDimitry Andric __iarray_cap_ = rhs.__iarray_size_; 358*0b57cec5SDimitry Andric } 359*0b57cec5SDimitry Andric for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_) 360*0b57cec5SDimitry Andric __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_]; 361*0b57cec5SDimitry Andric if (__parray_cap_ < rhs.__parray_size_) 362*0b57cec5SDimitry Andric { 363*0b57cec5SDimitry Andric free(__parray_); 364*0b57cec5SDimitry Andric __parray_ = new_pointers.release(); 365*0b57cec5SDimitry Andric __parray_cap_ = rhs.__parray_size_; 366*0b57cec5SDimitry Andric } 367*0b57cec5SDimitry Andric for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_) 368*0b57cec5SDimitry Andric __parray_[__parray_size_] = rhs.__parray_[__parray_size_]; 369*0b57cec5SDimitry Andric } 370*0b57cec5SDimitry Andric 371*0b57cec5SDimitry Andric void 372*0b57cec5SDimitry Andric ios_base::move(ios_base& rhs) 373*0b57cec5SDimitry Andric { 374*0b57cec5SDimitry Andric // *this is uninitialized 375*0b57cec5SDimitry Andric __fmtflags_ = rhs.__fmtflags_; 376*0b57cec5SDimitry Andric __precision_ = rhs.__precision_; 377*0b57cec5SDimitry Andric __width_ = rhs.__width_; 378*0b57cec5SDimitry Andric __rdstate_ = rhs.__rdstate_; 379*0b57cec5SDimitry Andric __exceptions_ = rhs.__exceptions_; 380*0b57cec5SDimitry Andric __rdbuf_ = 0; 381*0b57cec5SDimitry Andric locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_); 382*0b57cec5SDimitry Andric ::new(&__loc_) locale(rhs_loc); 383*0b57cec5SDimitry Andric __fn_ = rhs.__fn_; 384*0b57cec5SDimitry Andric rhs.__fn_ = 0; 385*0b57cec5SDimitry Andric __index_ = rhs.__index_; 386*0b57cec5SDimitry Andric rhs.__index_ = 0; 387*0b57cec5SDimitry Andric __event_size_ = rhs.__event_size_; 388*0b57cec5SDimitry Andric rhs.__event_size_ = 0; 389*0b57cec5SDimitry Andric __event_cap_ = rhs.__event_cap_; 390*0b57cec5SDimitry Andric rhs.__event_cap_ = 0; 391*0b57cec5SDimitry Andric __iarray_ = rhs.__iarray_; 392*0b57cec5SDimitry Andric rhs.__iarray_ = 0; 393*0b57cec5SDimitry Andric __iarray_size_ = rhs.__iarray_size_; 394*0b57cec5SDimitry Andric rhs.__iarray_size_ = 0; 395*0b57cec5SDimitry Andric __iarray_cap_ = rhs.__iarray_cap_; 396*0b57cec5SDimitry Andric rhs.__iarray_cap_ = 0; 397*0b57cec5SDimitry Andric __parray_ = rhs.__parray_; 398*0b57cec5SDimitry Andric rhs.__parray_ = 0; 399*0b57cec5SDimitry Andric __parray_size_ = rhs.__parray_size_; 400*0b57cec5SDimitry Andric rhs.__parray_size_ = 0; 401*0b57cec5SDimitry Andric __parray_cap_ = rhs.__parray_cap_; 402*0b57cec5SDimitry Andric rhs.__parray_cap_ = 0; 403*0b57cec5SDimitry Andric } 404*0b57cec5SDimitry Andric 405*0b57cec5SDimitry Andric void 406*0b57cec5SDimitry Andric ios_base::swap(ios_base& rhs) _NOEXCEPT 407*0b57cec5SDimitry Andric { 408*0b57cec5SDimitry Andric _VSTD::swap(__fmtflags_, rhs.__fmtflags_); 409*0b57cec5SDimitry Andric _VSTD::swap(__precision_, rhs.__precision_); 410*0b57cec5SDimitry Andric _VSTD::swap(__width_, rhs.__width_); 411*0b57cec5SDimitry Andric _VSTD::swap(__rdstate_, rhs.__rdstate_); 412*0b57cec5SDimitry Andric _VSTD::swap(__exceptions_, rhs.__exceptions_); 413*0b57cec5SDimitry Andric locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_); 414*0b57cec5SDimitry Andric locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_); 415*0b57cec5SDimitry Andric _VSTD::swap(lhs_loc, rhs_loc); 416*0b57cec5SDimitry Andric _VSTD::swap(__fn_, rhs.__fn_); 417*0b57cec5SDimitry Andric _VSTD::swap(__index_, rhs.__index_); 418*0b57cec5SDimitry Andric _VSTD::swap(__event_size_, rhs.__event_size_); 419*0b57cec5SDimitry Andric _VSTD::swap(__event_cap_, rhs.__event_cap_); 420*0b57cec5SDimitry Andric _VSTD::swap(__iarray_, rhs.__iarray_); 421*0b57cec5SDimitry Andric _VSTD::swap(__iarray_size_, rhs.__iarray_size_); 422*0b57cec5SDimitry Andric _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_); 423*0b57cec5SDimitry Andric _VSTD::swap(__parray_, rhs.__parray_); 424*0b57cec5SDimitry Andric _VSTD::swap(__parray_size_, rhs.__parray_size_); 425*0b57cec5SDimitry Andric _VSTD::swap(__parray_cap_, rhs.__parray_cap_); 426*0b57cec5SDimitry Andric } 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andric void 429*0b57cec5SDimitry Andric ios_base::__set_badbit_and_consider_rethrow() 430*0b57cec5SDimitry Andric { 431*0b57cec5SDimitry Andric __rdstate_ |= badbit; 432*0b57cec5SDimitry Andric #ifndef _LIBCPP_NO_EXCEPTIONS 433*0b57cec5SDimitry Andric if (__exceptions_ & badbit) 434*0b57cec5SDimitry Andric throw; 435*0b57cec5SDimitry Andric #endif // _LIBCPP_NO_EXCEPTIONS 436*0b57cec5SDimitry Andric } 437*0b57cec5SDimitry Andric 438*0b57cec5SDimitry Andric void 439*0b57cec5SDimitry Andric ios_base::__set_failbit_and_consider_rethrow() 440*0b57cec5SDimitry Andric { 441*0b57cec5SDimitry Andric __rdstate_ |= failbit; 442*0b57cec5SDimitry Andric #ifndef _LIBCPP_NO_EXCEPTIONS 443*0b57cec5SDimitry Andric if (__exceptions_ & failbit) 444*0b57cec5SDimitry Andric throw; 445*0b57cec5SDimitry Andric #endif // _LIBCPP_NO_EXCEPTIONS 446*0b57cec5SDimitry Andric } 447*0b57cec5SDimitry Andric 448*0b57cec5SDimitry Andric bool 449*0b57cec5SDimitry Andric ios_base::sync_with_stdio(bool sync) 450*0b57cec5SDimitry Andric { 451*0b57cec5SDimitry Andric static bool previous_state = true; 452*0b57cec5SDimitry Andric bool r = previous_state; 453*0b57cec5SDimitry Andric previous_state = sync; 454*0b57cec5SDimitry Andric return r; 455*0b57cec5SDimitry Andric } 456*0b57cec5SDimitry Andric 457*0b57cec5SDimitry Andric _LIBCPP_END_NAMESPACE_STD 458