3678f64ad3
almost all recent changes to libc++ and libcxxrt. MFC r256642: Since C++ typeinfo objects are currently not guaranteed to be merged at runtime by the dynamic linker, check for their equality in libcxxrt by not only comparing the typeinfo's name pointers, but also comparing the full names, if necessary. (This is similar to what GNU libstdc++ does in its default configuration.) The 'deep' check can be turned off again by defining LIBCXXRT_MERGED_TYPEINFO, and recompiling libcxxrt. Reviewed by: theraven MFC r270522 (by rdivacky): The standard we compile libc++ with is called c++11 not c++0x. MFC r273066 (by bapt): Import patch from libc++ r197313 which allows using libc++ headers with gcc Differential Revision: https://reviews.freebsd.org/D942 Reviewed by: imp MFC r273381 (by bapt): Add support for __cxa_throw_bad_array_new_length in libcxxrt It is required for use with newer g++49 Differential Revision: https://reviews.freebsd.org/D982 Reviewed by: theraven Approved by: theraven MFC r273382 (by bapt): Fix build by marking the new functions as weak This is a temporary fix MFC r273407 (by bapt): When using an external gcc 4.8+ and not building libstdc++ then create in the objectdir a fake libstdc++.so and libstdc++.a which is a symlink on libc++ that allow g++ to satisfy its links dependencies in the least hackish way. Please note that this hacky libstds++ never get installed on the final system Reviewed by: imp MFC r273434 (by bapt): Do not define bad_array_new_length::bad_array_new_length in libc++ anymore when used in combinaison with libcxxrt since it is now defined there already. This fixes building world MFC r276417: Import libcxxrt master 00bc29eb6513624824a6d7db2ebc768a4216a604. Interesting fixes: 76584a0 Reorganize code to use only 32bit atomic ops for 32bit platforms 30d2ae5 Implement __cxa_throw_bad_array_new_length Reviewed by: bapt Differential Revision: https://reviews.freebsd.org/D1390 MFC r277217: Import libc++ trunk r224926. This fixes a number of bugs, completes C++14 support[1], adds more C++1z features[2], and fixes the following LWG issues[3]: 1450: Contradiction in regex_constants 2003: String exception inconsistency in erase. 2075: Progress guarantees, lock-free property, and scheduling assumptions 2104: unique_lock move-assignment should not be noexcept 2112: User-defined classes that cannot be derived from 2132: std::function ambiguity 2135: Unclear requirement for exceptions thrown in condition_variable::wait() 2142: packaged_task::operator() synchronization too broad? 2182: Container::[const_]reference types are misleadingly specified 2186: Incomplete action on async/launch::deferred 2188: Reverse iterator does not fully support targets that overload operator& 2193: Default constructors for standard library containers are explicit 2205: Problematic postconditions of regex_match and regex_search 2213: Return value of std::regex_replace 2240: Probable misuse of term "function scope" in [thread.condition] 2252: Strong guarantee on vector::push_back() still broken with C++11? 2257: Simplify container requirements with the new algorithms 2258: a.erase(q1, q2) unable to directly return q2 2263: Comparing iterators and allocator pointers with different const-character 2268: Setting a default argument in the declaration of a member function assign of std::basic_string 2271: regex_traits::lookup_classname specification unclear 2272: quoted should use char_traits::eq for character comparison 2278: User-defined literals for Standard Library types 2280: begin / end for arrays should be constexpr and noexcept 2285: make_reverse_iterator 2288: Inconsistent requirements for shared mutexes 2291: std::hash is vulnerable to collision DoS attack 2293: Wrong facet used by num_put::do_put 2299: Effects of inaccessible key_compare::is_transparent type are not clear 2301: Why is std::tie not constexpr? 2304: Complexity of count in unordered associative containers 2306: match_results::reference should be value_type&, not const value_type& 2308: Clarify container destructor requirements w.r.t. std::array 2313: tuple_size should always derive from integral_constant<size_t, N> 2314: apply() should return decltype(auto) and use decay_t before tuple_size 2315: weak_ptr should be movable 2316: weak_ptr::lock() should be atomic 2317: The type property queries should be UnaryTypeTraits returning size_t 2320: select_on_container_copy_construction() takes allocators, not containers 2322: Associative(initializer_list, stuff) constructors are underspecified 2323: vector::resize(n, t)'s specification should be simplified 2324: Insert iterator constructors should use addressof() 2329: regex_match()/regex_search() with match_results should forbid temporary strings 2330: regex("meow", regex::icase) is technically forbidden but should be permitted 2332: regex_iterator/regex_token_iterator should forbid temporary regexes 2339: Wording issue in nth_element 2341: Inconsistency between basic_ostream::seekp(pos) and basic_ostream::seekp(off, dir) 2344: quoted()'s interaction with padding is unclear 2346: integral_constant's member functions should be marked noexcept 2350: min, max, and minmax should be constexpr 2356: Stability of erasure in unordered associative containers 2357: Remaining "Assignable" requirement 2359: How does regex_constants::nosubs affect basic_regex::mark_count()? 2360: reverse_iterator::operator*() is unimplementable [1] http://libcxx.llvm.org/cxx1y_status.html [2] http://libcxx.llvm.org/cxx1z_status.html [3] http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html Exp-run: antoine MFC r277944: Partially revert r273382, to reduce diffs against upstream. This was a temporary fix to solve a conflict with an older version of libc++, and it is no longer relevant. MFC r278010: Revert r256642, not only to reduce diffs against upstream libcxxrt, but also because it is the wrong approach: comparing typeinfo names deeply causes trouble if two loaded DSOs use independent types of the same name. In addition, this particular change was never merged to FreeBSD 10.x and 9.x, so let's get rid of it before it ends up in an 11.x release. Discussed with: theraven, joerg@netbsd MFC r278016: Import libcxxrt master 1cb607e89f6135bbc10f3d3b6fba1f983e258dcc. Interesting fixes: 1cb607e Correct gcc version check for __cxa_begin_catch() declaration with or without throw()
1024 lines
24 KiB
C++
1024 lines
24 KiB
C++
// -*- C++ -*-
|
|
//===---------------------------- ios -------------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_IOS
|
|
#define _LIBCPP_IOS
|
|
|
|
/*
|
|
ios synopsis
|
|
|
|
#include <iosfwd>
|
|
|
|
namespace std
|
|
{
|
|
|
|
typedef OFF_T streamoff;
|
|
typedef SZ_T streamsize;
|
|
template <class stateT> class fpos;
|
|
|
|
class ios_base
|
|
{
|
|
public:
|
|
class failure;
|
|
|
|
typedef T1 fmtflags;
|
|
static constexpr fmtflags boolalpha;
|
|
static constexpr fmtflags dec;
|
|
static constexpr fmtflags fixed;
|
|
static constexpr fmtflags hex;
|
|
static constexpr fmtflags internal;
|
|
static constexpr fmtflags left;
|
|
static constexpr fmtflags oct;
|
|
static constexpr fmtflags right;
|
|
static constexpr fmtflags scientific;
|
|
static constexpr fmtflags showbase;
|
|
static constexpr fmtflags showpoint;
|
|
static constexpr fmtflags showpos;
|
|
static constexpr fmtflags skipws;
|
|
static constexpr fmtflags unitbuf;
|
|
static constexpr fmtflags uppercase;
|
|
static constexpr fmtflags adjustfield;
|
|
static constexpr fmtflags basefield;
|
|
static constexpr fmtflags floatfield;
|
|
|
|
typedef T2 iostate;
|
|
static constexpr iostate badbit;
|
|
static constexpr iostate eofbit;
|
|
static constexpr iostate failbit;
|
|
static constexpr iostate goodbit;
|
|
|
|
typedef T3 openmode;
|
|
static constexpr openmode app;
|
|
static constexpr openmode ate;
|
|
static constexpr openmode binary;
|
|
static constexpr openmode in;
|
|
static constexpr openmode out;
|
|
static constexpr openmode trunc;
|
|
|
|
typedef T4 seekdir;
|
|
static constexpr seekdir beg;
|
|
static constexpr seekdir cur;
|
|
static constexpr seekdir end;
|
|
|
|
class Init;
|
|
|
|
// 27.5.2.2 fmtflags state:
|
|
fmtflags flags() const;
|
|
fmtflags flags(fmtflags fmtfl);
|
|
fmtflags setf(fmtflags fmtfl);
|
|
fmtflags setf(fmtflags fmtfl, fmtflags mask);
|
|
void unsetf(fmtflags mask);
|
|
|
|
streamsize precision() const;
|
|
streamsize precision(streamsize prec);
|
|
streamsize width() const;
|
|
streamsize width(streamsize wide);
|
|
|
|
// 27.5.2.3 locales:
|
|
locale imbue(const locale& loc);
|
|
locale getloc() const;
|
|
|
|
// 27.5.2.5 storage:
|
|
static int xalloc();
|
|
long& iword(int index);
|
|
void*& pword(int index);
|
|
|
|
// destructor
|
|
virtual ~ios_base();
|
|
|
|
// 27.5.2.6 callbacks;
|
|
enum event { erase_event, imbue_event, copyfmt_event };
|
|
typedef void (*event_callback)(event, ios_base&, int index);
|
|
void register_callback(event_callback fn, int index);
|
|
|
|
ios_base(const ios_base&) = delete;
|
|
ios_base& operator=(const ios_base&) = delete;
|
|
|
|
static bool sync_with_stdio(bool sync = true);
|
|
|
|
protected:
|
|
ios_base();
|
|
};
|
|
|
|
template <class charT, class traits = char_traits<charT> >
|
|
class basic_ios
|
|
: public ios_base
|
|
{
|
|
public:
|
|
// types:
|
|
typedef charT char_type;
|
|
typedef typename traits::int_type int_type;
|
|
typedef typename traits::pos_type pos_type;
|
|
typedef typename traits::off_type off_type;
|
|
typedef traits traits_type;
|
|
|
|
operator unspecified-bool-type() const;
|
|
bool operator!() const;
|
|
iostate rdstate() const;
|
|
void clear(iostate state = goodbit);
|
|
void setstate(iostate state);
|
|
bool good() const;
|
|
bool eof() const;
|
|
bool fail() const;
|
|
bool bad() const;
|
|
|
|
iostate exceptions() const;
|
|
void exceptions(iostate except);
|
|
|
|
// 27.5.4.1 Constructor/destructor:
|
|
explicit basic_ios(basic_streambuf<charT,traits>* sb);
|
|
virtual ~basic_ios();
|
|
|
|
// 27.5.4.2 Members:
|
|
basic_ostream<charT,traits>* tie() const;
|
|
basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr);
|
|
|
|
basic_streambuf<charT,traits>* rdbuf() const;
|
|
basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);
|
|
|
|
basic_ios& copyfmt(const basic_ios& rhs);
|
|
|
|
char_type fill() const;
|
|
char_type fill(char_type ch);
|
|
|
|
locale imbue(const locale& loc);
|
|
|
|
char narrow(char_type c, char dfault) const;
|
|
char_type widen(char c) const;
|
|
|
|
basic_ios(const basic_ios& ) = delete;
|
|
basic_ios& operator=(const basic_ios&) = delete;
|
|
|
|
protected:
|
|
basic_ios();
|
|
void init(basic_streambuf<charT,traits>* sb);
|
|
void move(basic_ios& rhs);
|
|
void swap(basic_ios& rhs) noexcept;
|
|
void set_rdbuf(basic_streambuf<charT, traits>* sb);
|
|
};
|
|
|
|
// 27.5.5, manipulators:
|
|
ios_base& boolalpha (ios_base& str);
|
|
ios_base& noboolalpha(ios_base& str);
|
|
ios_base& showbase (ios_base& str);
|
|
ios_base& noshowbase (ios_base& str);
|
|
ios_base& showpoint (ios_base& str);
|
|
ios_base& noshowpoint(ios_base& str);
|
|
ios_base& showpos (ios_base& str);
|
|
ios_base& noshowpos (ios_base& str);
|
|
ios_base& skipws (ios_base& str);
|
|
ios_base& noskipws (ios_base& str);
|
|
ios_base& uppercase (ios_base& str);
|
|
ios_base& nouppercase(ios_base& str);
|
|
ios_base& unitbuf (ios_base& str);
|
|
ios_base& nounitbuf (ios_base& str);
|
|
|
|
// 27.5.5.2 adjustfield:
|
|
ios_base& internal (ios_base& str);
|
|
ios_base& left (ios_base& str);
|
|
ios_base& right (ios_base& str);
|
|
|
|
// 27.5.5.3 basefield:
|
|
ios_base& dec (ios_base& str);
|
|
ios_base& hex (ios_base& str);
|
|
ios_base& oct (ios_base& str);
|
|
|
|
// 27.5.5.4 floatfield:
|
|
ios_base& fixed (ios_base& str);
|
|
ios_base& scientific (ios_base& str);
|
|
ios_base& hexfloat (ios_base& str);
|
|
ios_base& defaultfloat(ios_base& str);
|
|
|
|
// 27.5.5.5 error reporting:
|
|
enum class io_errc
|
|
{
|
|
stream = 1
|
|
};
|
|
|
|
concept_map ErrorCodeEnum<io_errc> { };
|
|
error_code make_error_code(io_errc e) noexcept;
|
|
error_condition make_error_condition(io_errc e) noexcept;
|
|
storage-class-specifier const error_category& iostream_category() noexcept;
|
|
|
|
} // std
|
|
|
|
*/
|
|
|
|
#include <__config>
|
|
#include <iosfwd>
|
|
#include <__locale>
|
|
#include <system_error>
|
|
|
|
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
|
#include <atomic> // for __xindex_
|
|
#endif
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
typedef ptrdiff_t streamsize;
|
|
|
|
class _LIBCPP_TYPE_VIS ios_base
|
|
{
|
|
public:
|
|
class _LIBCPP_TYPE_VIS failure;
|
|
|
|
typedef unsigned int fmtflags;
|
|
static const fmtflags boolalpha = 0x0001;
|
|
static const fmtflags dec = 0x0002;
|
|
static const fmtflags fixed = 0x0004;
|
|
static const fmtflags hex = 0x0008;
|
|
static const fmtflags internal = 0x0010;
|
|
static const fmtflags left = 0x0020;
|
|
static const fmtflags oct = 0x0040;
|
|
static const fmtflags right = 0x0080;
|
|
static const fmtflags scientific = 0x0100;
|
|
static const fmtflags showbase = 0x0200;
|
|
static const fmtflags showpoint = 0x0400;
|
|
static const fmtflags showpos = 0x0800;
|
|
static const fmtflags skipws = 0x1000;
|
|
static const fmtflags unitbuf = 0x2000;
|
|
static const fmtflags uppercase = 0x4000;
|
|
static const fmtflags adjustfield = left | right | internal;
|
|
static const fmtflags basefield = dec | oct | hex;
|
|
static const fmtflags floatfield = scientific | fixed;
|
|
|
|
typedef unsigned int iostate;
|
|
typedef iostate io_state;
|
|
static const iostate badbit = 0x1;
|
|
static const iostate eofbit = 0x2;
|
|
static const iostate failbit = 0x4;
|
|
static const iostate goodbit = 0x0;
|
|
|
|
typedef unsigned int openmode;
|
|
typedef openmode open_mode;
|
|
static const openmode app = 0x01;
|
|
static const openmode ate = 0x02;
|
|
static const openmode binary = 0x04;
|
|
static const openmode in = 0x08;
|
|
static const openmode out = 0x10;
|
|
static const openmode trunc = 0x20;
|
|
|
|
enum seekdir {beg, cur, end};
|
|
typedef seekdir seek_dir;
|
|
|
|
typedef _VSTD::streamoff streamoff;
|
|
typedef _VSTD::streampos streampos;
|
|
|
|
class _LIBCPP_TYPE_VIS Init;
|
|
|
|
// 27.5.2.2 fmtflags state:
|
|
_LIBCPP_INLINE_VISIBILITY fmtflags flags() const;
|
|
_LIBCPP_INLINE_VISIBILITY fmtflags flags(fmtflags __fmtfl);
|
|
_LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl);
|
|
_LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl, fmtflags __mask);
|
|
_LIBCPP_INLINE_VISIBILITY void unsetf(fmtflags __mask);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY streamsize precision() const;
|
|
_LIBCPP_INLINE_VISIBILITY streamsize precision(streamsize __prec);
|
|
_LIBCPP_INLINE_VISIBILITY streamsize width() const;
|
|
_LIBCPP_INLINE_VISIBILITY streamsize width(streamsize __wide);
|
|
|
|
// 27.5.2.3 locales:
|
|
locale imbue(const locale& __loc);
|
|
locale getloc() const;
|
|
|
|
// 27.5.2.5 storage:
|
|
static int xalloc();
|
|
long& iword(int __index);
|
|
void*& pword(int __index);
|
|
|
|
// destructor
|
|
virtual ~ios_base();
|
|
|
|
// 27.5.2.6 callbacks;
|
|
enum event { erase_event, imbue_event, copyfmt_event };
|
|
typedef void (*event_callback)(event, ios_base&, int __index);
|
|
void register_callback(event_callback __fn, int __index);
|
|
|
|
private:
|
|
ios_base(const ios_base&); // = delete;
|
|
ios_base& operator=(const ios_base&); // = delete;
|
|
|
|
public:
|
|
static bool sync_with_stdio(bool __sync = true);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY iostate rdstate() const;
|
|
void clear(iostate __state = goodbit);
|
|
_LIBCPP_INLINE_VISIBILITY void setstate(iostate __state);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY bool good() const;
|
|
_LIBCPP_INLINE_VISIBILITY bool eof() const;
|
|
_LIBCPP_INLINE_VISIBILITY bool fail() const;
|
|
_LIBCPP_INLINE_VISIBILITY bool bad() const;
|
|
|
|
_LIBCPP_INLINE_VISIBILITY iostate exceptions() const;
|
|
_LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate);
|
|
|
|
void __set_badbit_and_consider_rethrow();
|
|
void __set_failbit_and_consider_rethrow();
|
|
|
|
protected:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
ios_base() {// purposefully does no initialization
|
|
}
|
|
|
|
void init(void* __sb);
|
|
_LIBCPP_ALWAYS_INLINE void* rdbuf() const {return __rdbuf_;}
|
|
|
|
_LIBCPP_ALWAYS_INLINE
|
|
void rdbuf(void* __sb)
|
|
{
|
|
__rdbuf_ = __sb;
|
|
clear();
|
|
}
|
|
|
|
void __call_callbacks(event);
|
|
void copyfmt(const ios_base&);
|
|
void move(ios_base&);
|
|
void swap(ios_base&) _NOEXCEPT;
|
|
|
|
_LIBCPP_ALWAYS_INLINE
|
|
void set_rdbuf(void* __sb)
|
|
{
|
|
__rdbuf_ = __sb;
|
|
}
|
|
|
|
private:
|
|
// All data members must be scalars
|
|
fmtflags __fmtflags_;
|
|
streamsize __precision_;
|
|
streamsize __width_;
|
|
iostate __rdstate_;
|
|
iostate __exceptions_;
|
|
void* __rdbuf_;
|
|
void* __loc_;
|
|
event_callback* __fn_;
|
|
int* __index_;
|
|
size_t __event_size_;
|
|
size_t __event_cap_;
|
|
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
|
static atomic<int> __xindex_;
|
|
#else
|
|
static int __xindex_;
|
|
#endif
|
|
long* __iarray_;
|
|
size_t __iarray_size_;
|
|
size_t __iarray_cap_;
|
|
void** __parray_;
|
|
size_t __parray_size_;
|
|
size_t __parray_cap_;
|
|
};
|
|
|
|
//enum class io_errc
|
|
_LIBCPP_DECLARE_STRONG_ENUM(io_errc)
|
|
{
|
|
stream = 1
|
|
};
|
|
_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)
|
|
|
|
template <>
|
|
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc> : public true_type { };
|
|
|
|
#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
|
|
template <>
|
|
struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc::__lx> : public true_type { };
|
|
#endif
|
|
|
|
_LIBCPP_FUNC_VIS
|
|
const error_category& iostream_category() _NOEXCEPT;
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
error_code
|
|
make_error_code(io_errc __e) _NOEXCEPT
|
|
{
|
|
return error_code(static_cast<int>(__e), iostream_category());
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
error_condition
|
|
make_error_condition(io_errc __e) _NOEXCEPT
|
|
{
|
|
return error_condition(static_cast<int>(__e), iostream_category());
|
|
}
|
|
|
|
class _LIBCPP_EXCEPTION_ABI ios_base::failure
|
|
: public system_error
|
|
{
|
|
public:
|
|
explicit failure(const string& __msg, const error_code& __ec = io_errc::stream);
|
|
explicit failure(const char* __msg, const error_code& __ec = io_errc::stream);
|
|
virtual ~failure() throw();
|
|
};
|
|
|
|
class _LIBCPP_TYPE_VIS ios_base::Init
|
|
{
|
|
public:
|
|
Init();
|
|
~Init();
|
|
};
|
|
|
|
// fmtflags
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::fmtflags
|
|
ios_base::flags() const
|
|
{
|
|
return __fmtflags_;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::fmtflags
|
|
ios_base::flags(fmtflags __fmtfl)
|
|
{
|
|
fmtflags __r = __fmtflags_;
|
|
__fmtflags_ = __fmtfl;
|
|
return __r;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::fmtflags
|
|
ios_base::setf(fmtflags __fmtfl)
|
|
{
|
|
fmtflags __r = __fmtflags_;
|
|
__fmtflags_ |= __fmtfl;
|
|
return __r;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
ios_base::unsetf(fmtflags __mask)
|
|
{
|
|
__fmtflags_ &= ~__mask;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::fmtflags
|
|
ios_base::setf(fmtflags __fmtfl, fmtflags __mask)
|
|
{
|
|
fmtflags __r = __fmtflags_;
|
|
unsetf(__mask);
|
|
__fmtflags_ |= __fmtfl & __mask;
|
|
return __r;
|
|
}
|
|
|
|
// precision
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
streamsize
|
|
ios_base::precision() const
|
|
{
|
|
return __precision_;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
streamsize
|
|
ios_base::precision(streamsize __prec)
|
|
{
|
|
streamsize __r = __precision_;
|
|
__precision_ = __prec;
|
|
return __r;
|
|
}
|
|
|
|
// width
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
streamsize
|
|
ios_base::width() const
|
|
{
|
|
return __width_;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
streamsize
|
|
ios_base::width(streamsize __wide)
|
|
{
|
|
streamsize __r = __width_;
|
|
__width_ = __wide;
|
|
return __r;
|
|
}
|
|
|
|
// iostate
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::iostate
|
|
ios_base::rdstate() const
|
|
{
|
|
return __rdstate_;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
ios_base::setstate(iostate __state)
|
|
{
|
|
clear(__rdstate_ | __state);
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
bool
|
|
ios_base::good() const
|
|
{
|
|
return __rdstate_ == 0;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
bool
|
|
ios_base::eof() const
|
|
{
|
|
return (__rdstate_ & eofbit) != 0;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
bool
|
|
ios_base::fail() const
|
|
{
|
|
return (__rdstate_ & (failbit | badbit)) != 0;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
bool
|
|
ios_base::bad() const
|
|
{
|
|
return (__rdstate_ & badbit) != 0;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base::iostate
|
|
ios_base::exceptions() const
|
|
{
|
|
return __exceptions_;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
ios_base::exceptions(iostate __iostate)
|
|
{
|
|
__exceptions_ = __iostate;
|
|
clear(__rdstate_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
class _LIBCPP_TYPE_VIS_ONLY basic_ios
|
|
: public ios_base
|
|
{
|
|
public:
|
|
// types:
|
|
typedef _CharT char_type;
|
|
typedef _Traits traits_type;
|
|
|
|
typedef typename traits_type::int_type int_type;
|
|
typedef typename traits_type::pos_type pos_type;
|
|
typedef typename traits_type::off_type off_type;
|
|
|
|
_LIBCPP_ALWAYS_INLINE
|
|
_LIBCPP_EXPLICIT
|
|
operator bool() const {return !fail();}
|
|
_LIBCPP_ALWAYS_INLINE bool operator!() const {return fail();}
|
|
_LIBCPP_ALWAYS_INLINE iostate rdstate() const {return ios_base::rdstate();}
|
|
_LIBCPP_ALWAYS_INLINE void clear(iostate __state = goodbit) {ios_base::clear(__state);}
|
|
_LIBCPP_ALWAYS_INLINE void setstate(iostate __state) {ios_base::setstate(__state);}
|
|
_LIBCPP_ALWAYS_INLINE bool good() const {return ios_base::good();}
|
|
_LIBCPP_ALWAYS_INLINE bool eof() const {return ios_base::eof();}
|
|
_LIBCPP_ALWAYS_INLINE bool fail() const {return ios_base::fail();}
|
|
_LIBCPP_ALWAYS_INLINE bool bad() const {return ios_base::bad();}
|
|
|
|
_LIBCPP_ALWAYS_INLINE iostate exceptions() const {return ios_base::exceptions();}
|
|
_LIBCPP_ALWAYS_INLINE void exceptions(iostate __iostate) {ios_base::exceptions(__iostate);}
|
|
|
|
// 27.5.4.1 Constructor/destructor:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
explicit basic_ios(basic_streambuf<char_type,traits_type>* __sb);
|
|
virtual ~basic_ios();
|
|
|
|
// 27.5.4.2 Members:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
basic_ostream<char_type, traits_type>* tie() const;
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
basic_streambuf<char_type, traits_type>* rdbuf() const;
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb);
|
|
|
|
basic_ios& copyfmt(const basic_ios& __rhs);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
char_type fill() const;
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
char_type fill(char_type __ch);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
locale imbue(const locale& __loc);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
char narrow(char_type __c, char __dfault) const;
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
char_type widen(char __c) const;
|
|
|
|
protected:
|
|
_LIBCPP_ALWAYS_INLINE
|
|
basic_ios() {// purposefully does no initialization
|
|
}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void init(basic_streambuf<char_type, traits_type>* __sb);
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void move(basic_ios& __rhs);
|
|
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
|
|
_LIBCPP_ALWAYS_INLINE
|
|
void move(basic_ios&& __rhs) {move(__rhs);}
|
|
#endif
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void swap(basic_ios& __rhs) _NOEXCEPT;
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb);
|
|
private:
|
|
basic_ostream<char_type, traits_type>* __tie_;
|
|
mutable int_type __fill_;
|
|
};
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type,traits_type>* __sb)
|
|
{
|
|
init(__sb);
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
basic_ios<_CharT, _Traits>::~basic_ios()
|
|
{
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb)
|
|
{
|
|
ios_base::init(__sb);
|
|
__tie_ = 0;
|
|
__fill_ = traits_type::eof();
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_ostream<_CharT, _Traits>*
|
|
basic_ios<_CharT, _Traits>::tie() const
|
|
{
|
|
return __tie_;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_ostream<_CharT, _Traits>*
|
|
basic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr)
|
|
{
|
|
basic_ostream<char_type, traits_type>* __r = __tie_;
|
|
__tie_ = __tiestr;
|
|
return __r;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_streambuf<_CharT, _Traits>*
|
|
basic_ios<_CharT, _Traits>::rdbuf() const
|
|
{
|
|
return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf());
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
basic_streambuf<_CharT, _Traits>*
|
|
basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb)
|
|
{
|
|
basic_streambuf<char_type, traits_type>* __r = rdbuf();
|
|
ios_base::rdbuf(__sb);
|
|
return __r;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
locale
|
|
basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
|
|
{
|
|
locale __r = getloc();
|
|
ios_base::imbue(__loc);
|
|
if (rdbuf())
|
|
rdbuf()->pubimbue(__loc);
|
|
return __r;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
char
|
|
basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const
|
|
{
|
|
return use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault);
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_CharT
|
|
basic_ios<_CharT, _Traits>::widen(char __c) const
|
|
{
|
|
return use_facet<ctype<char_type> >(getloc()).widen(__c);
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_CharT
|
|
basic_ios<_CharT, _Traits>::fill() const
|
|
{
|
|
if (traits_type::eq_int_type(traits_type::eof(), __fill_))
|
|
__fill_ = widen(' ');
|
|
return __fill_;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
_CharT
|
|
basic_ios<_CharT, _Traits>::fill(char_type __ch)
|
|
{
|
|
char_type __r = __fill_;
|
|
__fill_ = __ch;
|
|
return __r;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
basic_ios<_CharT, _Traits>&
|
|
basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
|
|
{
|
|
if (this != &__rhs)
|
|
{
|
|
__call_callbacks(erase_event);
|
|
ios_base::copyfmt(__rhs);
|
|
__tie_ = __rhs.__tie_;
|
|
__fill_ = __rhs.__fill_;
|
|
__call_callbacks(copyfmt_event);
|
|
exceptions(__rhs.exceptions());
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
basic_ios<_CharT, _Traits>::move(basic_ios& __rhs)
|
|
{
|
|
ios_base::move(__rhs);
|
|
__tie_ = __rhs.__tie_;
|
|
__rhs.__tie_ = 0;
|
|
__fill_ = __rhs.__fill_;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
basic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) _NOEXCEPT
|
|
{
|
|
ios_base::swap(__rhs);
|
|
_VSTD::swap(__tie_, __rhs.__tie_);
|
|
_VSTD::swap(__fill_, __rhs.__fill_);
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
void
|
|
basic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb)
|
|
{
|
|
ios_base::set_rdbuf(__sb);
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
boolalpha(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::boolalpha);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
noboolalpha(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::boolalpha);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
showbase(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::showbase);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
noshowbase(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::showbase);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
showpoint(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::showpoint);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
noshowpoint(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::showpoint);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
showpos(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::showpos);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
noshowpos(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::showpos);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
skipws(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::skipws);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
noskipws(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::skipws);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
uppercase(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::uppercase);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
nouppercase(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::uppercase);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
unitbuf(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::unitbuf);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
nounitbuf(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::unitbuf);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
internal(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::internal, ios_base::adjustfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
left(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::left, ios_base::adjustfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
right(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::right, ios_base::adjustfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
dec(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::dec, ios_base::basefield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
hex(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::hex, ios_base::basefield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
oct(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::oct, ios_base::basefield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
fixed(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::fixed, ios_base::floatfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
scientific(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::scientific, ios_base::floatfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
hexfloat(ios_base& __str)
|
|
{
|
|
__str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
|
|
return __str;
|
|
}
|
|
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
ios_base&
|
|
defaultfloat(ios_base& __str)
|
|
{
|
|
__str.unsetf(ios_base::floatfield);
|
|
return __str;
|
|
}
|
|
|
|
template <class _CharT, class _Traits>
|
|
class __save_flags
|
|
{
|
|
typedef basic_ios<_CharT, _Traits> __stream_type;
|
|
typedef typename __stream_type::fmtflags fmtflags;
|
|
|
|
__stream_type& __stream_;
|
|
fmtflags __fmtflags_;
|
|
_CharT __fill_;
|
|
|
|
__save_flags(const __save_flags&);
|
|
__save_flags& operator=(const __save_flags&);
|
|
public:
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
explicit __save_flags(__stream_type& __stream)
|
|
: __stream_(__stream),
|
|
__fmtflags_(__stream.flags()),
|
|
__fill_(__stream.fill())
|
|
{}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
~__save_flags()
|
|
{
|
|
__stream_.flags(__fmtflags_);
|
|
__stream_.fill(__fill_);
|
|
}
|
|
};
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP_IOS
|