Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===---------------------------- ios -------------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_IOS
     12 #define _LIBCPP_IOS
     13 
     14 /*
     15     ios synopsis
     16 
     17 #include <iosfwd>
     18 
     19 namespace std
     20 {
     21 
     22 typedef OFF_T streamoff;
     23 typedef SZ_T streamsize;
     24 template <class stateT> class fpos;
     25 
     26 class ios_base
     27 {
     28 public:
     29     class failure;
     30 
     31     typedef T1 fmtflags;
     32     static constexpr fmtflags boolalpha;
     33     static constexpr fmtflags dec;
     34     static constexpr fmtflags fixed;
     35     static constexpr fmtflags hex;
     36     static constexpr fmtflags internal;
     37     static constexpr fmtflags left;
     38     static constexpr fmtflags oct;
     39     static constexpr fmtflags right;
     40     static constexpr fmtflags scientific;
     41     static constexpr fmtflags showbase;
     42     static constexpr fmtflags showpoint;
     43     static constexpr fmtflags showpos;
     44     static constexpr fmtflags skipws;
     45     static constexpr fmtflags unitbuf;
     46     static constexpr fmtflags uppercase;
     47     static constexpr fmtflags adjustfield;
     48     static constexpr fmtflags basefield;
     49     static constexpr fmtflags floatfield;
     50 
     51     typedef T2 iostate;
     52     static constexpr iostate badbit;
     53     static constexpr iostate eofbit;
     54     static constexpr iostate failbit;
     55     static constexpr iostate goodbit;
     56 
     57     typedef T3 openmode;
     58     static constexpr openmode app;
     59     static constexpr openmode ate;
     60     static constexpr openmode binary;
     61     static constexpr openmode in;
     62     static constexpr openmode out;
     63     static constexpr openmode trunc;
     64 
     65     typedef T4 seekdir;
     66     static constexpr seekdir beg;
     67     static constexpr seekdir cur;
     68     static constexpr seekdir end;
     69 
     70     class Init;
     71 
     72     // 27.5.2.2 fmtflags state:
     73     fmtflags flags() const;
     74     fmtflags flags(fmtflags fmtfl);
     75     fmtflags setf(fmtflags fmtfl);
     76     fmtflags setf(fmtflags fmtfl, fmtflags mask);
     77     void unsetf(fmtflags mask);
     78 
     79     streamsize precision() const;
     80     streamsize precision(streamsize prec);
     81     streamsize width() const;
     82     streamsize width(streamsize wide);
     83 
     84     // 27.5.2.3 locales:
     85     locale imbue(const locale& loc);
     86     locale getloc() const;
     87 
     88     // 27.5.2.5 storage:
     89     static int xalloc();
     90     long& iword(int index);
     91     void*& pword(int index);
     92 
     93     // destructor
     94     virtual ~ios_base();
     95 
     96     // 27.5.2.6 callbacks;
     97     enum event { erase_event, imbue_event, copyfmt_event };
     98     typedef void (*event_callback)(event, ios_base&, int index);
     99     void register_callback(event_callback fn, int index);
    100 
    101     ios_base(const ios_base&) = delete;
    102     ios_base& operator=(const ios_base&) = delete;
    103 
    104     static bool sync_with_stdio(bool sync = true);
    105 
    106 protected:
    107     ios_base();
    108 };
    109 
    110 template <class charT, class traits = char_traits<charT> >
    111 class basic_ios
    112     : public ios_base
    113 {
    114 public:
    115     // types:
    116     typedef charT char_type;
    117     typedef typename traits::int_type int_type;
    118     typedef typename traits::pos_type pos_type;
    119     typedef typename traits::off_type off_type;
    120     typedef traits traits_type;
    121 
    122     operator unspecified-bool-type() const;
    123     bool operator!() const;
    124     iostate rdstate() const;
    125     void clear(iostate state = goodbit);
    126     void setstate(iostate state);
    127     bool good() const;
    128     bool eof() const;
    129     bool fail() const;
    130     bool bad() const;
    131 
    132     iostate exceptions() const;
    133     void exceptions(iostate except);
    134 
    135     // 27.5.4.1 Constructor/destructor:
    136     explicit basic_ios(basic_streambuf<charT,traits>* sb);
    137     virtual ~basic_ios();
    138 
    139     // 27.5.4.2 Members:
    140     basic_ostream<charT,traits>* tie() const;
    141     basic_ostream<charT,traits>* tie(basic_ostream<charT,traits>* tiestr);
    142 
    143     basic_streambuf<charT,traits>* rdbuf() const;
    144     basic_streambuf<charT,traits>* rdbuf(basic_streambuf<charT,traits>* sb);
    145 
    146     basic_ios& copyfmt(const basic_ios& rhs);
    147 
    148     char_type fill() const;
    149     char_type fill(char_type ch);
    150 
    151     locale imbue(const locale& loc);
    152 
    153     char narrow(char_type c, char dfault) const;
    154     char_type widen(char c) const;
    155 
    156     basic_ios(const basic_ios& ) = delete;
    157     basic_ios& operator=(const basic_ios&) = delete;
    158 
    159 protected:
    160     basic_ios();
    161     void init(basic_streambuf<charT,traits>* sb);
    162     void move(basic_ios& rhs);
    163     void swap(basic_ios& rhs) noexcept;
    164     void set_rdbuf(basic_streambuf<charT, traits>* sb);
    165 };
    166 
    167 // 27.5.5, manipulators:
    168 ios_base& boolalpha (ios_base& str);
    169 ios_base& noboolalpha(ios_base& str);
    170 ios_base& showbase (ios_base& str);
    171 ios_base& noshowbase (ios_base& str);
    172 ios_base& showpoint (ios_base& str);
    173 ios_base& noshowpoint(ios_base& str);
    174 ios_base& showpos (ios_base& str);
    175 ios_base& noshowpos (ios_base& str);
    176 ios_base& skipws (ios_base& str);
    177 ios_base& noskipws (ios_base& str);
    178 ios_base& uppercase (ios_base& str);
    179 ios_base& nouppercase(ios_base& str);
    180 ios_base& unitbuf (ios_base& str);
    181 ios_base& nounitbuf (ios_base& str);
    182 
    183 // 27.5.5.2 adjustfield:
    184 ios_base& internal (ios_base& str);
    185 ios_base& left (ios_base& str);
    186 ios_base& right (ios_base& str);
    187 
    188 // 27.5.5.3 basefield:
    189 ios_base& dec (ios_base& str);
    190 ios_base& hex (ios_base& str);
    191 ios_base& oct (ios_base& str);
    192 
    193 // 27.5.5.4 floatfield:
    194 ios_base& fixed (ios_base& str);
    195 ios_base& scientific (ios_base& str);
    196 ios_base& hexfloat (ios_base& str);
    197 ios_base& defaultfloat(ios_base& str);
    198 
    199 // 27.5.5.5 error reporting:
    200 enum class io_errc
    201 {
    202     stream = 1
    203 };
    204 
    205 concept_map ErrorCodeEnum<io_errc> { };
    206 error_code make_error_code(io_errc e) noexcept; 
    207 error_condition make_error_condition(io_errc e) noexcept; 
    208 storage-class-specifier const error_category& iostream_category() noexcept;
    209 
    210 }  // std
    211 
    212 */
    213 
    214 #include <__config>
    215 #include <iosfwd>
    216 #include <__locale>
    217 #include <system_error>
    218 
    219 #if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
    220 #include <atomic>     // for __xindex_
    221 #endif
    222 
    223 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    224 #pragma GCC system_header
    225 #endif
    226 
    227 _LIBCPP_BEGIN_NAMESPACE_STD
    228 
    229 typedef ptrdiff_t streamsize;
    230 
    231 class _LIBCPP_TYPE_VIS ios_base
    232 {
    233 public:
    234     class _LIBCPP_TYPE_VIS failure;
    235 
    236     typedef unsigned int fmtflags;
    237     static const fmtflags boolalpha   = 0x0001;
    238     static const fmtflags dec         = 0x0002;
    239     static const fmtflags fixed       = 0x0004;
    240     static const fmtflags hex         = 0x0008;
    241     static const fmtflags internal    = 0x0010;
    242     static const fmtflags left        = 0x0020;
    243     static const fmtflags oct         = 0x0040;
    244     static const fmtflags right       = 0x0080;
    245     static const fmtflags scientific  = 0x0100;
    246     static const fmtflags showbase    = 0x0200;
    247     static const fmtflags showpoint   = 0x0400;
    248     static const fmtflags showpos     = 0x0800;
    249     static const fmtflags skipws      = 0x1000;
    250     static const fmtflags unitbuf     = 0x2000;
    251     static const fmtflags uppercase   = 0x4000;
    252     static const fmtflags adjustfield = left | right | internal;
    253     static const fmtflags basefield   = dec | oct | hex;
    254     static const fmtflags floatfield  = scientific | fixed;
    255 
    256     typedef unsigned int iostate;
    257     typedef iostate      io_state;
    258     static const iostate badbit  = 0x1;
    259     static const iostate eofbit  = 0x2;
    260     static const iostate failbit = 0x4;
    261     static const iostate goodbit = 0x0;
    262 
    263     typedef unsigned int openmode;
    264     typedef openmode     open_mode;
    265     static const openmode app    = 0x01;
    266     static const openmode ate    = 0x02;
    267     static const openmode binary = 0x04;
    268     static const openmode in     = 0x08;
    269     static const openmode out    = 0x10;
    270     static const openmode trunc  = 0x20;
    271 
    272     enum seekdir {beg, cur, end};
    273     typedef seekdir seek_dir;
    274 
    275     typedef _VSTD::streamoff streamoff;
    276     typedef _VSTD::streampos streampos;
    277 
    278     class _LIBCPP_TYPE_VIS Init;
    279 
    280     // 27.5.2.2 fmtflags state:
    281     _LIBCPP_INLINE_VISIBILITY fmtflags flags() const;
    282     _LIBCPP_INLINE_VISIBILITY fmtflags flags(fmtflags __fmtfl);
    283     _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl);
    284     _LIBCPP_INLINE_VISIBILITY fmtflags setf(fmtflags __fmtfl, fmtflags __mask);
    285     _LIBCPP_INLINE_VISIBILITY void unsetf(fmtflags __mask);
    286 
    287     _LIBCPP_INLINE_VISIBILITY streamsize precision() const;
    288     _LIBCPP_INLINE_VISIBILITY streamsize precision(streamsize __prec);
    289     _LIBCPP_INLINE_VISIBILITY streamsize width() const;
    290     _LIBCPP_INLINE_VISIBILITY streamsize width(streamsize __wide);
    291 
    292     // 27.5.2.3 locales:
    293     locale imbue(const locale& __loc);
    294     locale getloc() const;
    295 
    296     // 27.5.2.5 storage:
    297     static int xalloc();
    298     long& iword(int __index);
    299     void*& pword(int __index);
    300 
    301     // destructor
    302     virtual ~ios_base();
    303 
    304     // 27.5.2.6 callbacks;
    305     enum event { erase_event, imbue_event, copyfmt_event };
    306     typedef void (*event_callback)(event, ios_base&, int __index);
    307     void register_callback(event_callback __fn, int __index);
    308 
    309 private:
    310     ios_base(const ios_base&); // = delete;
    311     ios_base& operator=(const ios_base&); // = delete;
    312 
    313 public:
    314     static bool sync_with_stdio(bool __sync = true);
    315 
    316     _LIBCPP_INLINE_VISIBILITY iostate rdstate() const;
    317     void clear(iostate __state = goodbit);
    318     _LIBCPP_INLINE_VISIBILITY void setstate(iostate __state);
    319 
    320     _LIBCPP_INLINE_VISIBILITY bool good() const;
    321     _LIBCPP_INLINE_VISIBILITY bool eof() const;
    322     _LIBCPP_INLINE_VISIBILITY bool fail() const;
    323     _LIBCPP_INLINE_VISIBILITY bool bad() const;
    324 
    325     _LIBCPP_INLINE_VISIBILITY iostate exceptions() const;
    326     _LIBCPP_INLINE_VISIBILITY void exceptions(iostate __iostate);
    327 
    328     void __set_badbit_and_consider_rethrow();
    329     void __set_failbit_and_consider_rethrow();
    330 
    331 protected:
    332     _LIBCPP_INLINE_VISIBILITY
    333     ios_base() {// purposefully does no initialization
    334                }
    335 
    336     void init(void* __sb);
    337     _LIBCPP_ALWAYS_INLINE void* rdbuf() const {return __rdbuf_;}
    338 
    339     _LIBCPP_ALWAYS_INLINE
    340     void rdbuf(void* __sb)
    341     {
    342         __rdbuf_ = __sb;
    343         clear();
    344     }
    345 
    346     void __call_callbacks(event);
    347     void copyfmt(const ios_base&);
    348     void move(ios_base&);
    349     void swap(ios_base&) _NOEXCEPT;
    350 
    351     _LIBCPP_ALWAYS_INLINE
    352     void set_rdbuf(void* __sb)
    353     {
    354         __rdbuf_ = __sb;
    355     }
    356 
    357 private:
    358     // All data members must be scalars
    359     fmtflags        __fmtflags_;
    360     streamsize      __precision_;
    361     streamsize      __width_;
    362     iostate         __rdstate_;
    363     iostate         __exceptions_;
    364     void*           __rdbuf_;
    365     void*           __loc_;
    366     event_callback* __fn_;
    367     int*            __index_;
    368     size_t          __event_size_;
    369     size_t          __event_cap_;
    370 #if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
    371     static atomic<int> __xindex_;
    372 #else
    373     static int      __xindex_;
    374 #endif
    375     long*           __iarray_;
    376     size_t          __iarray_size_;
    377     size_t          __iarray_cap_;
    378     void**          __parray_;
    379     size_t          __parray_size_;
    380     size_t          __parray_cap_;
    381 };
    382 
    383 //enum class io_errc
    384 _LIBCPP_DECLARE_STRONG_ENUM(io_errc)
    385 {
    386     stream = 1
    387 };
    388 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(io_errc)
    389 
    390 template <>
    391 struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc> : public true_type { };
    392 
    393 #ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
    394 template <>
    395 struct _LIBCPP_TYPE_VIS_ONLY is_error_code_enum<io_errc::__lx> : public true_type { };
    396 #endif
    397 
    398 _LIBCPP_FUNC_VIS
    399 const error_category& iostream_category() _NOEXCEPT;
    400 
    401 inline _LIBCPP_INLINE_VISIBILITY
    402 error_code
    403 make_error_code(io_errc __e) _NOEXCEPT
    404 {
    405     return error_code(static_cast<int>(__e), iostream_category());
    406 }
    407 
    408 inline _LIBCPP_INLINE_VISIBILITY
    409 error_condition
    410 make_error_condition(io_errc __e) _NOEXCEPT
    411 {
    412     return error_condition(static_cast<int>(__e), iostream_category());
    413 }
    414 
    415 class _LIBCPP_EXCEPTION_ABI ios_base::failure
    416     : public system_error
    417 {
    418 public:
    419     explicit failure(const string& __msg, const error_code& __ec = io_errc::stream);
    420     explicit failure(const char* __msg, const error_code& __ec = io_errc::stream);
    421     virtual ~failure() throw();
    422 };
    423 
    424 class _LIBCPP_TYPE_VIS ios_base::Init
    425 {
    426 public:
    427     Init();
    428     ~Init();
    429 };
    430 
    431 // fmtflags
    432 
    433 inline _LIBCPP_INLINE_VISIBILITY
    434 ios_base::fmtflags
    435 ios_base::flags() const
    436 {
    437     return __fmtflags_;
    438 }
    439 
    440 inline _LIBCPP_INLINE_VISIBILITY
    441 ios_base::fmtflags
    442 ios_base::flags(fmtflags __fmtfl)
    443 {
    444     fmtflags __r = __fmtflags_;
    445     __fmtflags_ = __fmtfl;
    446     return __r;
    447 }
    448 
    449 inline _LIBCPP_INLINE_VISIBILITY
    450 ios_base::fmtflags
    451 ios_base::setf(fmtflags __fmtfl)
    452 {
    453     fmtflags __r = __fmtflags_;
    454     __fmtflags_ |= __fmtfl;
    455     return __r;
    456 }
    457 
    458 inline _LIBCPP_INLINE_VISIBILITY
    459 void
    460 ios_base::unsetf(fmtflags __mask)
    461 {
    462     __fmtflags_ &= ~__mask;
    463 }
    464 
    465 inline _LIBCPP_INLINE_VISIBILITY
    466 ios_base::fmtflags
    467 ios_base::setf(fmtflags __fmtfl, fmtflags __mask)
    468 {
    469     fmtflags __r = __fmtflags_;
    470     unsetf(__mask);
    471     __fmtflags_ |= __fmtfl & __mask;
    472     return __r;
    473 }
    474 
    475 // precision
    476 
    477 inline _LIBCPP_INLINE_VISIBILITY
    478 streamsize
    479 ios_base::precision() const
    480 {
    481     return __precision_;
    482 }
    483 
    484 inline _LIBCPP_INLINE_VISIBILITY
    485 streamsize
    486 ios_base::precision(streamsize __prec)
    487 {
    488     streamsize __r = __precision_;
    489     __precision_ = __prec;
    490     return __r;
    491 }
    492 
    493 // width
    494 
    495 inline _LIBCPP_INLINE_VISIBILITY
    496 streamsize
    497 ios_base::width() const
    498 {
    499     return __width_;
    500 }
    501 
    502 inline _LIBCPP_INLINE_VISIBILITY
    503 streamsize
    504 ios_base::width(streamsize __wide)
    505 {
    506     streamsize __r = __width_;
    507     __width_ = __wide;
    508     return __r;
    509 }
    510 
    511 // iostate
    512 
    513 inline _LIBCPP_INLINE_VISIBILITY
    514 ios_base::iostate
    515 ios_base::rdstate() const
    516 {
    517     return __rdstate_;
    518 }
    519 
    520 inline _LIBCPP_INLINE_VISIBILITY
    521 void
    522 ios_base::setstate(iostate __state)
    523 {
    524     clear(__rdstate_ | __state);
    525 }
    526 
    527 inline _LIBCPP_INLINE_VISIBILITY
    528 bool
    529 ios_base::good() const
    530 {
    531     return __rdstate_ == 0;
    532 }
    533 
    534 inline _LIBCPP_INLINE_VISIBILITY
    535 bool
    536 ios_base::eof() const
    537 {
    538     return (__rdstate_ & eofbit) != 0;
    539 }
    540 
    541 inline _LIBCPP_INLINE_VISIBILITY
    542 bool
    543 ios_base::fail() const
    544 {
    545     return (__rdstate_ & (failbit | badbit)) != 0;
    546 }
    547 
    548 inline _LIBCPP_INLINE_VISIBILITY
    549 bool
    550 ios_base::bad() const
    551 {
    552     return (__rdstate_ & badbit) != 0;
    553 }
    554 
    555 inline _LIBCPP_INLINE_VISIBILITY
    556 ios_base::iostate
    557 ios_base::exceptions() const
    558 {
    559     return __exceptions_;
    560 }
    561 
    562 inline _LIBCPP_INLINE_VISIBILITY
    563 void
    564 ios_base::exceptions(iostate __iostate)
    565 {
    566     __exceptions_ = __iostate;
    567     clear(__rdstate_);
    568 }
    569 
    570 template <class _CharT, class _Traits>
    571 class _LIBCPP_TYPE_VIS_ONLY basic_ios
    572     : public ios_base
    573 {
    574 public:
    575     // types:
    576     typedef _CharT char_type;
    577     typedef _Traits traits_type;
    578 
    579     typedef typename traits_type::int_type int_type;
    580     typedef typename traits_type::pos_type pos_type;
    581     typedef typename traits_type::off_type off_type;
    582 
    583     _LIBCPP_ALWAYS_INLINE
    584         _LIBCPP_EXPLICIT
    585         operator bool() const {return !fail();}
    586     _LIBCPP_ALWAYS_INLINE bool operator!() const    {return  fail();}
    587     _LIBCPP_ALWAYS_INLINE iostate rdstate() const   {return ios_base::rdstate();}
    588     _LIBCPP_ALWAYS_INLINE void clear(iostate __state = goodbit) {ios_base::clear(__state);}
    589     _LIBCPP_ALWAYS_INLINE void setstate(iostate __state) {ios_base::setstate(__state);}
    590     _LIBCPP_ALWAYS_INLINE bool good() const {return ios_base::good();}
    591     _LIBCPP_ALWAYS_INLINE bool eof() const  {return ios_base::eof();}
    592     _LIBCPP_ALWAYS_INLINE bool fail() const {return ios_base::fail();}
    593     _LIBCPP_ALWAYS_INLINE bool bad() const  {return ios_base::bad();}
    594 
    595     _LIBCPP_ALWAYS_INLINE iostate exceptions() const {return ios_base::exceptions();}
    596     _LIBCPP_ALWAYS_INLINE void exceptions(iostate __iostate) {ios_base::exceptions(__iostate);}
    597 
    598     // 27.5.4.1 Constructor/destructor:
    599     _LIBCPP_INLINE_VISIBILITY
    600     explicit basic_ios(basic_streambuf<char_type,traits_type>* __sb);
    601     virtual ~basic_ios();
    602 
    603     // 27.5.4.2 Members:
    604     _LIBCPP_INLINE_VISIBILITY 
    605     basic_ostream<char_type, traits_type>* tie() const;
    606     _LIBCPP_INLINE_VISIBILITY 
    607     basic_ostream<char_type, traits_type>* tie(basic_ostream<char_type, traits_type>* __tiestr);
    608 
    609     _LIBCPP_INLINE_VISIBILITY 
    610     basic_streambuf<char_type, traits_type>* rdbuf() const;
    611     _LIBCPP_INLINE_VISIBILITY 
    612     basic_streambuf<char_type, traits_type>* rdbuf(basic_streambuf<char_type, traits_type>* __sb);
    613 
    614     basic_ios& copyfmt(const basic_ios& __rhs);
    615 
    616     _LIBCPP_INLINE_VISIBILITY 
    617     char_type fill() const;
    618     _LIBCPP_INLINE_VISIBILITY 
    619     char_type fill(char_type __ch);
    620 
    621     _LIBCPP_INLINE_VISIBILITY 
    622     locale imbue(const locale& __loc);
    623 
    624     _LIBCPP_INLINE_VISIBILITY 
    625     char narrow(char_type __c, char __dfault) const;
    626     _LIBCPP_INLINE_VISIBILITY 
    627     char_type widen(char __c) const;
    628 
    629 protected:
    630     _LIBCPP_ALWAYS_INLINE
    631     basic_ios() {// purposefully does no initialization
    632                 }
    633     _LIBCPP_INLINE_VISIBILITY 
    634     void init(basic_streambuf<char_type, traits_type>* __sb);
    635 
    636     _LIBCPP_INLINE_VISIBILITY 
    637     void move(basic_ios& __rhs);
    638 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    639     _LIBCPP_ALWAYS_INLINE
    640     void move(basic_ios&& __rhs) {move(__rhs);}
    641 #endif
    642     _LIBCPP_INLINE_VISIBILITY 
    643     void swap(basic_ios& __rhs) _NOEXCEPT;
    644     _LIBCPP_INLINE_VISIBILITY 
    645     void set_rdbuf(basic_streambuf<char_type, traits_type>* __sb);
    646 private:
    647     basic_ostream<char_type, traits_type>* __tie_;
    648      mutable int_type __fill_;
    649 };
    650 
    651 template <class _CharT, class _Traits>
    652 inline _LIBCPP_INLINE_VISIBILITY
    653 basic_ios<_CharT, _Traits>::basic_ios(basic_streambuf<char_type,traits_type>* __sb)
    654 {
    655     init(__sb);
    656 }
    657 
    658 template <class _CharT, class _Traits>
    659 basic_ios<_CharT, _Traits>::~basic_ios()
    660 {
    661 }
    662 
    663 template <class _CharT, class _Traits>
    664 inline _LIBCPP_INLINE_VISIBILITY
    665 void
    666 basic_ios<_CharT, _Traits>::init(basic_streambuf<char_type, traits_type>* __sb)
    667 {
    668     ios_base::init(__sb);
    669     __tie_ = 0;
    670     __fill_ = traits_type::eof();
    671 }
    672 
    673 template <class _CharT, class _Traits>
    674 inline _LIBCPP_INLINE_VISIBILITY
    675 basic_ostream<_CharT, _Traits>*
    676 basic_ios<_CharT, _Traits>::tie() const
    677 {
    678     return __tie_;
    679 }
    680 
    681 template <class _CharT, class _Traits>
    682 inline _LIBCPP_INLINE_VISIBILITY
    683 basic_ostream<_CharT, _Traits>*
    684 basic_ios<_CharT, _Traits>::tie(basic_ostream<char_type, traits_type>* __tiestr)
    685 {
    686     basic_ostream<char_type, traits_type>* __r = __tie_;
    687     __tie_ = __tiestr;
    688     return __r;
    689 }
    690 
    691 template <class _CharT, class _Traits>
    692 inline _LIBCPP_INLINE_VISIBILITY
    693 basic_streambuf<_CharT, _Traits>*
    694 basic_ios<_CharT, _Traits>::rdbuf() const
    695 {
    696     return static_cast<basic_streambuf<char_type, traits_type>*>(ios_base::rdbuf());
    697 }
    698 
    699 template <class _CharT, class _Traits>
    700 inline _LIBCPP_INLINE_VISIBILITY
    701 basic_streambuf<_CharT, _Traits>*
    702 basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<char_type, traits_type>* __sb)
    703 {
    704     basic_streambuf<char_type, traits_type>* __r = rdbuf();
    705     ios_base::rdbuf(__sb);
    706     return __r;
    707 }
    708 
    709 template <class _CharT, class _Traits>
    710 inline _LIBCPP_INLINE_VISIBILITY
    711 locale
    712 basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
    713 {
    714     locale __r = getloc();
    715     ios_base::imbue(__loc);
    716     if (rdbuf())
    717         rdbuf()->pubimbue(__loc);
    718     return __r;
    719 }
    720 
    721 template <class _CharT, class _Traits>
    722 inline _LIBCPP_INLINE_VISIBILITY
    723 char
    724 basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const
    725 {
    726     return use_facet<ctype<char_type> >(getloc()).narrow(__c, __dfault);
    727 }
    728 
    729 template <class _CharT, class _Traits>
    730 inline _LIBCPP_INLINE_VISIBILITY
    731 _CharT
    732 basic_ios<_CharT, _Traits>::widen(char __c) const
    733 {
    734     return use_facet<ctype<char_type> >(getloc()).widen(__c);
    735 }
    736 
    737 template <class _CharT, class _Traits>
    738 inline _LIBCPP_INLINE_VISIBILITY
    739 _CharT
    740 basic_ios<_CharT, _Traits>::fill() const
    741 {
    742     if (traits_type::eq_int_type(traits_type::eof(), __fill_))
    743         __fill_ = widen(' ');
    744     return __fill_;
    745 }
    746 
    747 template <class _CharT, class _Traits>
    748 inline _LIBCPP_INLINE_VISIBILITY
    749 _CharT
    750 basic_ios<_CharT, _Traits>::fill(char_type __ch)
    751 {
    752     char_type __r = __fill_;
    753     __fill_ = __ch;
    754     return __r;
    755 }
    756 
    757 template <class _CharT, class _Traits>
    758 basic_ios<_CharT, _Traits>&
    759 basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs)
    760 {
    761     if (this != &__rhs)
    762     {
    763         __call_callbacks(erase_event);
    764         ios_base::copyfmt(__rhs);
    765         __tie_ = __rhs.__tie_;
    766         __fill_ = __rhs.__fill_;
    767         __call_callbacks(copyfmt_event);
    768         exceptions(__rhs.exceptions());
    769     }
    770     return *this;
    771 }
    772 
    773 template <class _CharT, class _Traits>
    774 inline _LIBCPP_INLINE_VISIBILITY
    775 void
    776 basic_ios<_CharT, _Traits>::move(basic_ios& __rhs)
    777 {
    778     ios_base::move(__rhs);
    779     __tie_ = __rhs.__tie_;
    780     __rhs.__tie_ = 0;
    781     __fill_ = __rhs.__fill_;
    782 }
    783 
    784 template <class _CharT, class _Traits>
    785 inline _LIBCPP_INLINE_VISIBILITY
    786 void
    787 basic_ios<_CharT, _Traits>::swap(basic_ios& __rhs) _NOEXCEPT
    788 {
    789     ios_base::swap(__rhs);
    790     _VSTD::swap(__tie_, __rhs.__tie_);
    791     _VSTD::swap(__fill_, __rhs.__fill_);
    792 }
    793 
    794 template <class _CharT, class _Traits>
    795 inline _LIBCPP_INLINE_VISIBILITY
    796 void
    797 basic_ios<_CharT, _Traits>::set_rdbuf(basic_streambuf<char_type, traits_type>* __sb)
    798 {
    799     ios_base::set_rdbuf(__sb);
    800 }
    801 
    802 inline _LIBCPP_INLINE_VISIBILITY
    803 ios_base&
    804 boolalpha(ios_base& __str)
    805 {
    806     __str.setf(ios_base::boolalpha);
    807     return __str;
    808 }
    809 
    810 inline _LIBCPP_INLINE_VISIBILITY
    811 ios_base&
    812 noboolalpha(ios_base& __str)
    813 {
    814     __str.unsetf(ios_base::boolalpha);
    815     return __str;
    816 }
    817 
    818 inline _LIBCPP_INLINE_VISIBILITY
    819 ios_base&
    820 showbase(ios_base& __str)
    821 {
    822     __str.setf(ios_base::showbase);
    823     return __str;
    824 }
    825 
    826 inline _LIBCPP_INLINE_VISIBILITY
    827 ios_base&
    828 noshowbase(ios_base& __str)
    829 {
    830     __str.unsetf(ios_base::showbase);
    831     return __str;
    832 }
    833 
    834 inline _LIBCPP_INLINE_VISIBILITY
    835 ios_base&
    836 showpoint(ios_base& __str)
    837 {
    838     __str.setf(ios_base::showpoint);
    839     return __str;
    840 }
    841 
    842 inline _LIBCPP_INLINE_VISIBILITY
    843 ios_base&
    844 noshowpoint(ios_base& __str)
    845 {
    846     __str.unsetf(ios_base::showpoint);
    847     return __str;
    848 }
    849 
    850 inline _LIBCPP_INLINE_VISIBILITY
    851 ios_base&
    852 showpos(ios_base& __str)
    853 {
    854     __str.setf(ios_base::showpos);
    855     return __str;
    856 }
    857 
    858 inline _LIBCPP_INLINE_VISIBILITY
    859 ios_base&
    860 noshowpos(ios_base& __str)
    861 {
    862     __str.unsetf(ios_base::showpos);
    863     return __str;
    864 }
    865 
    866 inline _LIBCPP_INLINE_VISIBILITY
    867 ios_base&
    868 skipws(ios_base& __str)
    869 {
    870     __str.setf(ios_base::skipws);
    871     return __str;
    872 }
    873 
    874 inline _LIBCPP_INLINE_VISIBILITY
    875 ios_base&
    876 noskipws(ios_base& __str)
    877 {
    878     __str.unsetf(ios_base::skipws);
    879     return __str;
    880 }
    881 
    882 inline _LIBCPP_INLINE_VISIBILITY
    883 ios_base&
    884 uppercase(ios_base& __str)
    885 {
    886     __str.setf(ios_base::uppercase);
    887     return __str;
    888 }
    889 
    890 inline _LIBCPP_INLINE_VISIBILITY
    891 ios_base&
    892 nouppercase(ios_base& __str)
    893 {
    894     __str.unsetf(ios_base::uppercase);
    895     return __str;
    896 }
    897 
    898 inline _LIBCPP_INLINE_VISIBILITY
    899 ios_base&
    900 unitbuf(ios_base& __str)
    901 {
    902     __str.setf(ios_base::unitbuf);
    903     return __str;
    904 }
    905 
    906 inline _LIBCPP_INLINE_VISIBILITY
    907 ios_base&
    908 nounitbuf(ios_base& __str)
    909 {
    910     __str.unsetf(ios_base::unitbuf);
    911     return __str;
    912 }
    913 
    914 inline _LIBCPP_INLINE_VISIBILITY
    915 ios_base&
    916 internal(ios_base& __str)
    917 {
    918     __str.setf(ios_base::internal, ios_base::adjustfield);
    919     return __str;
    920 }
    921 
    922 inline _LIBCPP_INLINE_VISIBILITY
    923 ios_base&
    924 left(ios_base& __str)
    925 {
    926     __str.setf(ios_base::left, ios_base::adjustfield);
    927     return __str;
    928 }
    929 
    930 inline _LIBCPP_INLINE_VISIBILITY
    931 ios_base&
    932 right(ios_base& __str)
    933 {
    934     __str.setf(ios_base::right, ios_base::adjustfield);
    935     return __str;
    936 }
    937 
    938 inline _LIBCPP_INLINE_VISIBILITY
    939 ios_base&
    940 dec(ios_base& __str)
    941 {
    942     __str.setf(ios_base::dec, ios_base::basefield);
    943     return __str;
    944 }
    945 
    946 inline _LIBCPP_INLINE_VISIBILITY
    947 ios_base&
    948 hex(ios_base& __str)
    949 {
    950     __str.setf(ios_base::hex, ios_base::basefield);
    951     return __str;
    952 }
    953 
    954 inline _LIBCPP_INLINE_VISIBILITY
    955 ios_base&
    956 oct(ios_base& __str)
    957 {
    958     __str.setf(ios_base::oct, ios_base::basefield);
    959     return __str;
    960 }
    961 
    962 inline _LIBCPP_INLINE_VISIBILITY
    963 ios_base&
    964 fixed(ios_base& __str)
    965 {
    966     __str.setf(ios_base::fixed, ios_base::floatfield);
    967     return __str;
    968 }
    969 
    970 inline _LIBCPP_INLINE_VISIBILITY
    971 ios_base&
    972 scientific(ios_base& __str)
    973 {
    974     __str.setf(ios_base::scientific, ios_base::floatfield);
    975     return __str;
    976 }
    977 
    978 inline _LIBCPP_INLINE_VISIBILITY
    979 ios_base&
    980 hexfloat(ios_base& __str)
    981 {
    982     __str.setf(ios_base::fixed | ios_base::scientific, ios_base::floatfield);
    983     return __str;
    984 }
    985 
    986 inline _LIBCPP_INLINE_VISIBILITY
    987 ios_base&
    988 defaultfloat(ios_base& __str)
    989 {
    990     __str.unsetf(ios_base::floatfield);
    991     return __str;
    992 }
    993 
    994 template <class _CharT, class _Traits>
    995 class __save_flags
    996 {
    997     typedef basic_ios<_CharT, _Traits> __stream_type;
    998     typedef typename __stream_type::fmtflags fmtflags;
    999 
   1000     __stream_type& __stream_;
   1001     fmtflags       __fmtflags_;
   1002     _CharT         __fill_;
   1003 
   1004     __save_flags(const __save_flags&);
   1005     __save_flags& operator=(const __save_flags&);
   1006 public:
   1007     _LIBCPP_INLINE_VISIBILITY
   1008     explicit __save_flags(__stream_type& __stream)
   1009         : __stream_(__stream),
   1010           __fmtflags_(__stream.flags()),
   1011           __fill_(__stream.fill())
   1012         {}
   1013     _LIBCPP_INLINE_VISIBILITY
   1014     ~__save_flags()
   1015     {
   1016         __stream_.flags(__fmtflags_);
   1017         __stream_.fill(__fill_);
   1018     }
   1019 };
   1020 
   1021 _LIBCPP_END_NAMESPACE_STD
   1022 
   1023 #endif  // _LIBCPP_IOS
   1024