xref: /freebsd/contrib/llvm-project/libcxx/src/ios.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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