xref: /openbsd-src/gnu/llvm/libcxx/src/ios.cpp (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
1*4bdff4beSrobert //===----------------------------------------------------------------------===//
246035553Spatrick //
346035553Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
446035553Spatrick // See https://llvm.org/LICENSE.txt for license information.
546035553Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
646035553Spatrick //
746035553Spatrick //===----------------------------------------------------------------------===//
846035553Spatrick 
9*4bdff4beSrobert #include <__config>
10*4bdff4beSrobert #include <__locale>
11*4bdff4beSrobert #include <algorithm>
12*4bdff4beSrobert #include <ios>
13*4bdff4beSrobert #include <limits>
14*4bdff4beSrobert #include <memory>
15*4bdff4beSrobert #include <new>
1646035553Spatrick #include <stdlib.h>
17*4bdff4beSrobert #include <string>
1846035553Spatrick 
1946035553Spatrick #include "include/config_elast.h"
20*4bdff4beSrobert 
21*4bdff4beSrobert _LIBCPP_PUSH_MACROS
22*4bdff4beSrobert #include <__undef_macros>
2346035553Spatrick 
2446035553Spatrick _LIBCPP_BEGIN_NAMESPACE_STD
2546035553Spatrick 
2646035553Spatrick class _LIBCPP_HIDDEN __iostream_category
2746035553Spatrick     : public __do_message
2846035553Spatrick {
2946035553Spatrick public:
3076d0caaeSpatrick     virtual const char* name() const noexcept;
3146035553Spatrick     virtual string message(int ev) const;
3246035553Spatrick };
3346035553Spatrick 
3446035553Spatrick const char*
name() const3576d0caaeSpatrick __iostream_category::name() const noexcept
3646035553Spatrick {
3746035553Spatrick     return "iostream";
3846035553Spatrick }
3946035553Spatrick 
4046035553Spatrick string
message(int ev) const4146035553Spatrick __iostream_category::message(int ev) const
4246035553Spatrick {
4346035553Spatrick     if (ev != static_cast<int>(io_errc::stream)
4446035553Spatrick #ifdef _LIBCPP_ELAST
4546035553Spatrick         && ev <= _LIBCPP_ELAST
4646035553Spatrick #endif // _LIBCPP_ELAST
4746035553Spatrick         )
4846035553Spatrick         return __do_message::message(ev);
4946035553Spatrick     return string("unspecified iostream_category error");
5046035553Spatrick }
5146035553Spatrick 
5246035553Spatrick const error_category&
iostream_category()5376d0caaeSpatrick iostream_category() noexcept
5446035553Spatrick {
5546035553Spatrick     static __iostream_category s;
5646035553Spatrick     return s;
5746035553Spatrick }
5846035553Spatrick 
5946035553Spatrick // ios_base::failure
6046035553Spatrick 
failure(const string & msg,const error_code & ec)6146035553Spatrick ios_base::failure::failure(const string& msg, const error_code& ec)
6246035553Spatrick     : system_error(ec, msg)
6346035553Spatrick {
6446035553Spatrick }
6546035553Spatrick 
failure(const char * msg,const error_code & ec)6646035553Spatrick ios_base::failure::failure(const char* msg, const error_code& ec)
6746035553Spatrick     : system_error(ec, msg)
6846035553Spatrick {
6946035553Spatrick }
7046035553Spatrick 
~failure()7146035553Spatrick ios_base::failure::~failure() throw()
7246035553Spatrick {
7346035553Spatrick }
7446035553Spatrick 
7546035553Spatrick // ios_base locale
7646035553Spatrick 
7746035553Spatrick const ios_base::fmtflags ios_base::boolalpha;
7846035553Spatrick const ios_base::fmtflags ios_base::dec;
7946035553Spatrick const ios_base::fmtflags ios_base::fixed;
8046035553Spatrick const ios_base::fmtflags ios_base::hex;
8146035553Spatrick const ios_base::fmtflags ios_base::internal;
8246035553Spatrick const ios_base::fmtflags ios_base::left;
8346035553Spatrick const ios_base::fmtflags ios_base::oct;
8446035553Spatrick const ios_base::fmtflags ios_base::right;
8546035553Spatrick const ios_base::fmtflags ios_base::scientific;
8646035553Spatrick const ios_base::fmtflags ios_base::showbase;
8746035553Spatrick const ios_base::fmtflags ios_base::showpoint;
8846035553Spatrick const ios_base::fmtflags ios_base::showpos;
8946035553Spatrick const ios_base::fmtflags ios_base::skipws;
9046035553Spatrick const ios_base::fmtflags ios_base::unitbuf;
9146035553Spatrick const ios_base::fmtflags ios_base::uppercase;
9246035553Spatrick const ios_base::fmtflags ios_base::adjustfield;
9346035553Spatrick const ios_base::fmtflags ios_base::basefield;
9446035553Spatrick const ios_base::fmtflags ios_base::floatfield;
9546035553Spatrick 
9646035553Spatrick const ios_base::iostate ios_base::badbit;
9746035553Spatrick const ios_base::iostate ios_base::eofbit;
9846035553Spatrick const ios_base::iostate ios_base::failbit;
9946035553Spatrick const ios_base::iostate ios_base::goodbit;
10046035553Spatrick 
10146035553Spatrick const ios_base::openmode ios_base::app;
10246035553Spatrick const ios_base::openmode ios_base::ate;
10346035553Spatrick const ios_base::openmode ios_base::binary;
10446035553Spatrick const ios_base::openmode ios_base::in;
10546035553Spatrick const ios_base::openmode ios_base::out;
10646035553Spatrick const ios_base::openmode ios_base::trunc;
10746035553Spatrick 
10846035553Spatrick void
__call_callbacks(event ev)10946035553Spatrick ios_base::__call_callbacks(event ev)
11046035553Spatrick {
11146035553Spatrick     for (size_t i = __event_size_; i;)
11246035553Spatrick     {
11346035553Spatrick         --i;
11446035553Spatrick         __fn_[i](ev, *this, __index_[i]);
11546035553Spatrick     }
11646035553Spatrick }
11746035553Spatrick 
11846035553Spatrick // locale
11946035553Spatrick 
12046035553Spatrick locale
imbue(const locale & newloc)12146035553Spatrick ios_base::imbue(const locale& newloc)
12246035553Spatrick {
12346035553Spatrick     static_assert(sizeof(locale) == sizeof(__loc_), "");
12446035553Spatrick     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
12546035553Spatrick     locale oldloc = loc_storage;
12646035553Spatrick     loc_storage = newloc;
12746035553Spatrick     __call_callbacks(imbue_event);
12846035553Spatrick     return oldloc;
12946035553Spatrick }
13046035553Spatrick 
13146035553Spatrick locale
getloc() const13246035553Spatrick ios_base::getloc() const
13346035553Spatrick {
13446035553Spatrick     const locale& loc_storage = *reinterpret_cast<const locale*>(&__loc_);
13546035553Spatrick     return loc_storage;
13646035553Spatrick }
13746035553Spatrick 
13846035553Spatrick // xalloc
13946035553Spatrick #if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
140*4bdff4beSrobert atomic<int> ios_base::__xindex_{0};
14146035553Spatrick #else
14246035553Spatrick int ios_base::__xindex_ = 0;
14346035553Spatrick #endif
14446035553Spatrick 
14546035553Spatrick template <typename _Tp>
__ios_new_cap(size_t __req_size,size_t __current_cap)14646035553Spatrick static size_t __ios_new_cap(size_t __req_size, size_t __current_cap)
14746035553Spatrick { // Precondition: __req_size > __current_cap
14846035553Spatrick     const size_t mx = std::numeric_limits<size_t>::max() / sizeof(_Tp);
14946035553Spatrick     if (__req_size < mx/2)
15046035553Spatrick         return _VSTD::max(2 * __current_cap, __req_size);
15146035553Spatrick     else
15246035553Spatrick         return mx;
15346035553Spatrick }
15446035553Spatrick 
15546035553Spatrick int
xalloc()15646035553Spatrick ios_base::xalloc()
15746035553Spatrick {
15846035553Spatrick     return __xindex_++;
15946035553Spatrick }
16046035553Spatrick 
16146035553Spatrick long&
iword(int index)16246035553Spatrick ios_base::iword(int index)
16346035553Spatrick {
16446035553Spatrick     size_t req_size = static_cast<size_t>(index)+1;
16546035553Spatrick     if (req_size > __iarray_cap_)
16646035553Spatrick     {
16746035553Spatrick         size_t newcap = __ios_new_cap<long>(req_size, __iarray_cap_);
16846035553Spatrick         long* iarray = static_cast<long*>(realloc(__iarray_, newcap * sizeof(long)));
16946035553Spatrick         if (iarray == 0)
17046035553Spatrick         {
17146035553Spatrick             setstate(badbit);
17246035553Spatrick             static long error;
17346035553Spatrick             error = 0;
17446035553Spatrick             return error;
17546035553Spatrick         }
17646035553Spatrick         __iarray_ = iarray;
17746035553Spatrick         for (long* p = __iarray_ + __iarray_size_; p < __iarray_ + newcap; ++p)
17846035553Spatrick             *p = 0;
17946035553Spatrick         __iarray_cap_ = newcap;
18046035553Spatrick     }
18146035553Spatrick     __iarray_size_ = max<size_t>(__iarray_size_, req_size);
18246035553Spatrick     return __iarray_[index];
18346035553Spatrick }
18446035553Spatrick 
18546035553Spatrick void*&
pword(int index)18646035553Spatrick ios_base::pword(int index)
18746035553Spatrick {
18846035553Spatrick     size_t req_size = static_cast<size_t>(index)+1;
18946035553Spatrick     if (req_size > __parray_cap_)
19046035553Spatrick     {
19146035553Spatrick         size_t newcap = __ios_new_cap<void *>(req_size, __iarray_cap_);
19246035553Spatrick         void** parray = static_cast<void**>(realloc(__parray_, newcap * sizeof(void *)));
19346035553Spatrick         if (parray == 0)
19446035553Spatrick         {
19546035553Spatrick             setstate(badbit);
19646035553Spatrick             static void* error;
19746035553Spatrick             error = 0;
19846035553Spatrick             return error;
19946035553Spatrick         }
20046035553Spatrick         __parray_ = parray;
20146035553Spatrick         for (void** p = __parray_ + __parray_size_; p < __parray_ + newcap; ++p)
20246035553Spatrick             *p = 0;
20346035553Spatrick         __parray_cap_ = newcap;
20446035553Spatrick     }
20546035553Spatrick     __parray_size_ = max<size_t>(__parray_size_, req_size);
20646035553Spatrick     return __parray_[index];
20746035553Spatrick }
20846035553Spatrick 
20946035553Spatrick // register_callback
21046035553Spatrick 
21146035553Spatrick void
register_callback(event_callback fn,int index)21246035553Spatrick ios_base::register_callback(event_callback fn, int index)
21346035553Spatrick {
21446035553Spatrick     size_t req_size = __event_size_ + 1;
21546035553Spatrick     if (req_size > __event_cap_)
21646035553Spatrick     {
21746035553Spatrick         size_t newcap = __ios_new_cap<event_callback>(req_size, __event_cap_);
21846035553Spatrick         event_callback* fns = static_cast<event_callback*>(realloc(__fn_, newcap * sizeof(event_callback)));
21946035553Spatrick         if (fns == 0)
22046035553Spatrick             setstate(badbit);
22146035553Spatrick         __fn_ = fns;
22246035553Spatrick         int* indxs = static_cast<int *>(realloc(__index_, newcap * sizeof(int)));
22346035553Spatrick         if (indxs == 0)
22446035553Spatrick             setstate(badbit);
22546035553Spatrick         __index_ = indxs;
22646035553Spatrick         __event_cap_ = newcap;
22746035553Spatrick     }
22846035553Spatrick     __fn_[__event_size_] = fn;
22946035553Spatrick     __index_[__event_size_] = index;
23046035553Spatrick     ++__event_size_;
23146035553Spatrick }
23246035553Spatrick 
~ios_base()23346035553Spatrick ios_base::~ios_base()
23446035553Spatrick {
23546035553Spatrick     __call_callbacks(erase_event);
23646035553Spatrick     locale& loc_storage = *reinterpret_cast<locale*>(&__loc_);
23746035553Spatrick     loc_storage.~locale();
23846035553Spatrick     free(__fn_);
23946035553Spatrick     free(__index_);
24046035553Spatrick     free(__iarray_);
24146035553Spatrick     free(__parray_);
24246035553Spatrick }
24346035553Spatrick 
24446035553Spatrick // iostate
24546035553Spatrick 
24646035553Spatrick void
clear(iostate state)24746035553Spatrick ios_base::clear(iostate state)
24846035553Spatrick {
24946035553Spatrick     if (__rdbuf_)
25046035553Spatrick         __rdstate_ = state;
25146035553Spatrick     else
25246035553Spatrick         __rdstate_ = state | badbit;
25346035553Spatrick 
25446035553Spatrick     if (((state | (__rdbuf_ ? goodbit : badbit)) & __exceptions_) != 0)
25546035553Spatrick         __throw_failure("ios_base::clear");
25646035553Spatrick }
25746035553Spatrick 
25846035553Spatrick // init
25946035553Spatrick 
26046035553Spatrick void
init(void * sb)26146035553Spatrick ios_base::init(void* sb)
26246035553Spatrick {
26346035553Spatrick     __rdbuf_ = sb;
26446035553Spatrick     __rdstate_ = __rdbuf_ ? goodbit : badbit;
26546035553Spatrick     __exceptions_ = goodbit;
26646035553Spatrick     __fmtflags_ = skipws | dec;
26746035553Spatrick     __width_ = 0;
26846035553Spatrick     __precision_ = 6;
26946035553Spatrick     __fn_ = 0;
27046035553Spatrick     __index_ = 0;
27146035553Spatrick     __event_size_ = 0;
27246035553Spatrick     __event_cap_ = 0;
27346035553Spatrick     __iarray_ = 0;
27446035553Spatrick     __iarray_size_ = 0;
27546035553Spatrick     __iarray_cap_ = 0;
27646035553Spatrick     __parray_ = 0;
27746035553Spatrick     __parray_size_ = 0;
27846035553Spatrick     __parray_cap_ = 0;
27946035553Spatrick     ::new(&__loc_) locale;
28046035553Spatrick }
28146035553Spatrick 
28246035553Spatrick void
copyfmt(const ios_base & rhs)28346035553Spatrick ios_base::copyfmt(const ios_base& rhs)
28446035553Spatrick {
28546035553Spatrick     // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
28646035553Spatrick     // Don't alter *this until all needed resources are acquired
28746035553Spatrick     unique_ptr<event_callback, void (*)(void*)> new_callbacks(0, free);
28846035553Spatrick     unique_ptr<int, void (*)(void*)> new_ints(0, free);
28946035553Spatrick     unique_ptr<long, void (*)(void*)> new_longs(0, free);
29046035553Spatrick     unique_ptr<void*, void (*)(void*)> new_pointers(0, free);
29146035553Spatrick     if (__event_cap_ < rhs.__event_size_)
29246035553Spatrick     {
29346035553Spatrick         size_t newesize = sizeof(event_callback) * rhs.__event_size_;
29446035553Spatrick         new_callbacks.reset(static_cast<event_callback*>(malloc(newesize)));
29546035553Spatrick         if (!new_callbacks)
29646035553Spatrick             __throw_bad_alloc();
29746035553Spatrick 
29846035553Spatrick         size_t newisize = sizeof(int) * rhs.__event_size_;
29946035553Spatrick         new_ints.reset(static_cast<int *>(malloc(newisize)));
30046035553Spatrick         if (!new_ints)
30146035553Spatrick             __throw_bad_alloc();
30246035553Spatrick     }
30346035553Spatrick     if (__iarray_cap_ < rhs.__iarray_size_)
30446035553Spatrick     {
30546035553Spatrick         size_t newsize = sizeof(long) * rhs.__iarray_size_;
30646035553Spatrick         new_longs.reset(static_cast<long*>(malloc(newsize)));
30746035553Spatrick         if (!new_longs)
30846035553Spatrick             __throw_bad_alloc();
30946035553Spatrick     }
31046035553Spatrick     if (__parray_cap_ < rhs.__parray_size_)
31146035553Spatrick     {
31246035553Spatrick         size_t newsize = sizeof(void*) * rhs.__parray_size_;
31346035553Spatrick         new_pointers.reset(static_cast<void**>(malloc(newsize)));
31446035553Spatrick         if (!new_pointers)
31546035553Spatrick             __throw_bad_alloc();
31646035553Spatrick     }
31746035553Spatrick     // Got everything we need.  Copy everything but __rdstate_, __rdbuf_ and __exceptions_
31846035553Spatrick     __fmtflags_ = rhs.__fmtflags_;
31946035553Spatrick     __precision_ = rhs.__precision_;
32046035553Spatrick     __width_ = rhs.__width_;
32146035553Spatrick     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
32246035553Spatrick     const locale& rhs_loc = *reinterpret_cast<const locale*>(&rhs.__loc_);
32346035553Spatrick     lhs_loc = rhs_loc;
32446035553Spatrick     if (__event_cap_ < rhs.__event_size_)
32546035553Spatrick     {
32646035553Spatrick         free(__fn_);
32746035553Spatrick         __fn_ = new_callbacks.release();
32846035553Spatrick         free(__index_);
32946035553Spatrick         __index_ = new_ints.release();
33046035553Spatrick         __event_cap_ = rhs.__event_size_;
33146035553Spatrick     }
33246035553Spatrick     for (__event_size_ = 0; __event_size_ < rhs.__event_size_; ++__event_size_)
33346035553Spatrick     {
33446035553Spatrick         __fn_[__event_size_] = rhs.__fn_[__event_size_];
33546035553Spatrick         __index_[__event_size_] = rhs.__index_[__event_size_];
33646035553Spatrick     }
33746035553Spatrick     if (__iarray_cap_ < rhs.__iarray_size_)
33846035553Spatrick     {
33946035553Spatrick         free(__iarray_);
34046035553Spatrick         __iarray_ = new_longs.release();
34146035553Spatrick         __iarray_cap_ = rhs.__iarray_size_;
34246035553Spatrick     }
34346035553Spatrick     for (__iarray_size_ = 0; __iarray_size_ < rhs.__iarray_size_; ++__iarray_size_)
34446035553Spatrick         __iarray_[__iarray_size_] = rhs.__iarray_[__iarray_size_];
34546035553Spatrick     if (__parray_cap_ < rhs.__parray_size_)
34646035553Spatrick     {
34746035553Spatrick         free(__parray_);
34846035553Spatrick         __parray_ = new_pointers.release();
34946035553Spatrick         __parray_cap_ = rhs.__parray_size_;
35046035553Spatrick     }
35146035553Spatrick     for (__parray_size_ = 0; __parray_size_ < rhs.__parray_size_; ++__parray_size_)
35246035553Spatrick         __parray_[__parray_size_] = rhs.__parray_[__parray_size_];
35346035553Spatrick }
35446035553Spatrick 
35546035553Spatrick void
move(ios_base & rhs)35646035553Spatrick ios_base::move(ios_base& rhs)
35746035553Spatrick {
35846035553Spatrick     // *this is uninitialized
35946035553Spatrick     __fmtflags_ = rhs.__fmtflags_;
36046035553Spatrick     __precision_ = rhs.__precision_;
36146035553Spatrick     __width_ = rhs.__width_;
36246035553Spatrick     __rdstate_ = rhs.__rdstate_;
36346035553Spatrick     __exceptions_ = rhs.__exceptions_;
36446035553Spatrick     __rdbuf_ = 0;
36546035553Spatrick     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
36646035553Spatrick     ::new(&__loc_) locale(rhs_loc);
36746035553Spatrick     __fn_ = rhs.__fn_;
36846035553Spatrick     rhs.__fn_ = 0;
36946035553Spatrick     __index_ = rhs.__index_;
37046035553Spatrick     rhs.__index_ = 0;
37146035553Spatrick     __event_size_ = rhs.__event_size_;
37246035553Spatrick     rhs.__event_size_ = 0;
37346035553Spatrick     __event_cap_ = rhs.__event_cap_;
37446035553Spatrick     rhs.__event_cap_ = 0;
37546035553Spatrick     __iarray_ = rhs.__iarray_;
37646035553Spatrick     rhs.__iarray_ = 0;
37746035553Spatrick     __iarray_size_ = rhs.__iarray_size_;
37846035553Spatrick     rhs.__iarray_size_ = 0;
37946035553Spatrick     __iarray_cap_ = rhs.__iarray_cap_;
38046035553Spatrick     rhs.__iarray_cap_ = 0;
38146035553Spatrick     __parray_ = rhs.__parray_;
38246035553Spatrick     rhs.__parray_ = 0;
38346035553Spatrick     __parray_size_ = rhs.__parray_size_;
38446035553Spatrick     rhs.__parray_size_ = 0;
38546035553Spatrick     __parray_cap_ = rhs.__parray_cap_;
38646035553Spatrick     rhs.__parray_cap_ = 0;
38746035553Spatrick }
38846035553Spatrick 
38946035553Spatrick void
swap(ios_base & rhs)39076d0caaeSpatrick ios_base::swap(ios_base& rhs) noexcept
39146035553Spatrick {
39246035553Spatrick     _VSTD::swap(__fmtflags_, rhs.__fmtflags_);
39346035553Spatrick     _VSTD::swap(__precision_, rhs.__precision_);
39446035553Spatrick     _VSTD::swap(__width_, rhs.__width_);
39546035553Spatrick     _VSTD::swap(__rdstate_, rhs.__rdstate_);
39646035553Spatrick     _VSTD::swap(__exceptions_, rhs.__exceptions_);
39746035553Spatrick     locale& lhs_loc = *reinterpret_cast<locale*>(&__loc_);
39846035553Spatrick     locale& rhs_loc = *reinterpret_cast<locale*>(&rhs.__loc_);
39946035553Spatrick     _VSTD::swap(lhs_loc, rhs_loc);
40046035553Spatrick     _VSTD::swap(__fn_, rhs.__fn_);
40146035553Spatrick     _VSTD::swap(__index_, rhs.__index_);
40246035553Spatrick     _VSTD::swap(__event_size_, rhs.__event_size_);
40346035553Spatrick     _VSTD::swap(__event_cap_, rhs.__event_cap_);
40446035553Spatrick     _VSTD::swap(__iarray_, rhs.__iarray_);
40546035553Spatrick     _VSTD::swap(__iarray_size_, rhs.__iarray_size_);
40646035553Spatrick     _VSTD::swap(__iarray_cap_, rhs.__iarray_cap_);
40746035553Spatrick     _VSTD::swap(__parray_, rhs.__parray_);
40846035553Spatrick     _VSTD::swap(__parray_size_, rhs.__parray_size_);
40946035553Spatrick     _VSTD::swap(__parray_cap_, rhs.__parray_cap_);
41046035553Spatrick }
41146035553Spatrick 
41246035553Spatrick void
__set_badbit_and_consider_rethrow()41346035553Spatrick ios_base::__set_badbit_and_consider_rethrow()
41446035553Spatrick {
41546035553Spatrick     __rdstate_ |= badbit;
41646035553Spatrick #ifndef _LIBCPP_NO_EXCEPTIONS
41746035553Spatrick     if (__exceptions_ & badbit)
41846035553Spatrick         throw;
41946035553Spatrick #endif // _LIBCPP_NO_EXCEPTIONS
42046035553Spatrick }
42146035553Spatrick 
42246035553Spatrick void
__set_failbit_and_consider_rethrow()42346035553Spatrick ios_base::__set_failbit_and_consider_rethrow()
42446035553Spatrick {
42546035553Spatrick     __rdstate_ |= failbit;
42646035553Spatrick #ifndef _LIBCPP_NO_EXCEPTIONS
42746035553Spatrick     if (__exceptions_ & failbit)
42846035553Spatrick         throw;
42946035553Spatrick #endif // _LIBCPP_NO_EXCEPTIONS
43046035553Spatrick }
43146035553Spatrick 
43246035553Spatrick bool
sync_with_stdio(bool sync)43346035553Spatrick ios_base::sync_with_stdio(bool sync)
43446035553Spatrick {
43546035553Spatrick     static bool previous_state = true;
43646035553Spatrick     bool r = previous_state;
43746035553Spatrick     previous_state = sync;
43846035553Spatrick     return r;
43946035553Spatrick }
44046035553Spatrick 
44146035553Spatrick _LIBCPP_END_NAMESPACE_STD
442*4bdff4beSrobert 
443*4bdff4beSrobert _LIBCPP_POP_MACROS
444