Home | History | Annotate | Download | only in bits
      1 // Iostreams base classes -*- C++ -*-
      2 
      3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
      4 // 2006, 2007, 2008, 2009
      5 // Free Software Foundation, Inc.
      6 //
      7 // This file is part of the GNU ISO C++ Library.  This library is free
      8 // software; you can redistribute it and/or modify it under the
      9 // terms of the GNU General Public License as published by the
     10 // Free Software Foundation; either version 3, or (at your option)
     11 // any later version.
     12 
     13 // This library is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // Under Section 7 of GPL version 3, you are granted additional
     19 // permissions described in the GCC Runtime Library Exception, version
     20 // 3.1, as published by the Free Software Foundation.
     21 
     22 // You should have received a copy of the GNU General Public License and
     23 // a copy of the GCC Runtime Library Exception along with this program;
     24 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     25 // <http://www.gnu.org/licenses/>.
     26 
     27 /** @file basic_ios.h
     28  *  This is an internal header file, included by other library headers.
     29  *  You should not attempt to use it directly.
     30  */
     31 
     32 #ifndef _BASIC_IOS_H
     33 #define _BASIC_IOS_H 1
     34 
     35 #pragma GCC system_header
     36 
     37 #include <bits/localefwd.h>
     38 #include <bits/locale_classes.h>
     39 #include <bits/locale_facets.h>
     40 #include <bits/streambuf_iterator.h>
     41 
     42 _GLIBCXX_BEGIN_NAMESPACE(std)
     43 
     44   template<typename _Facet>
     45     inline const _Facet&
     46     __check_facet(const _Facet* __f)
     47     {
     48       if (!__f)
     49 	__throw_bad_cast();
     50       return *__f;
     51     }
     52 
     53   // 27.4.5  Template class basic_ios
     54   /**
     55    *  @brief  Virtual base class for all stream classes.
     56    *  @ingroup io
     57    *
     58    *  Most of the member functions called dispatched on stream objects
     59    *  (e.g., @c std::cout.foo(bar);) are consolidated in this class.
     60   */
     61   template<typename _CharT, typename _Traits>
     62     class basic_ios : public ios_base
     63     {
     64     public:
     65       //@{
     66       /**
     67        *  These are standard types.  They permit a standardized way of
     68        *  referring to names of (or names dependant on) the template
     69        *  parameters, which are specific to the implementation.
     70       */
     71       typedef _CharT                                 char_type;
     72       typedef typename _Traits::int_type             int_type;
     73       typedef typename _Traits::pos_type             pos_type;
     74       typedef typename _Traits::off_type             off_type;
     75       typedef _Traits                                traits_type;
     76       //@}
     77 
     78       //@{
     79       /**
     80        *  These are non-standard types.
     81       */
     82       typedef ctype<_CharT>                          __ctype_type;
     83       typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
     84 						     __num_put_type;
     85       typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> >
     86 						     __num_get_type;
     87       //@}
     88 
     89       // Data members:
     90     protected:
     91       basic_ostream<_CharT, _Traits>*                _M_tie;
     92       mutable char_type                              _M_fill;
     93       mutable bool                                   _M_fill_init;
     94       basic_streambuf<_CharT, _Traits>*              _M_streambuf;
     95 
     96       // Cached use_facet<ctype>, which is based on the current locale info.
     97       const __ctype_type*                            _M_ctype;
     98       // For ostream.
     99       const __num_put_type*                          _M_num_put;
    100       // For istream.
    101       const __num_get_type*                          _M_num_get;
    102 
    103     public:
    104       //@{
    105       /**
    106        *  @brief  The quick-and-easy status check.
    107        *
    108        *  This allows you to write constructs such as
    109        *  "if (!a_stream) ..." and "while (a_stream) ..."
    110       */
    111       operator void*() const
    112       { return this->fail() ? 0 : const_cast<basic_ios*>(this); }
    113 
    114       bool
    115       operator!() const
    116       { return this->fail(); }
    117       //@}
    118 
    119       /**
    120        *  @brief  Returns the error state of the stream buffer.
    121        *  @return  A bit pattern (well, isn't everything?)
    122        *
    123        *  See std::ios_base::iostate for the possible bit values.  Most
    124        *  users will call one of the interpreting wrappers, e.g., good().
    125       */
    126       iostate
    127       rdstate() const
    128       { return _M_streambuf_state; }
    129 
    130       /**
    131        *  @brief  [Re]sets the error state.
    132        *  @param  state  The new state flag(s) to set.
    133        *
    134        *  See std::ios_base::iostate for the possible bit values.  Most
    135        *  users will not need to pass an argument.
    136       */
    137       void
    138       clear(iostate __state = goodbit);
    139 
    140       /**
    141        *  @brief  Sets additional flags in the error state.
    142        *  @param  state  The additional state flag(s) to set.
    143        *
    144        *  See std::ios_base::iostate for the possible bit values.
    145       */
    146       void
    147       setstate(iostate __state)
    148       { this->clear(this->rdstate() | __state); }
    149 
    150       // Flip the internal state on for the proper state bits, then re
    151       // throws the propagated exception if bit also set in
    152       // exceptions().
    153       void
    154       _M_setstate(iostate __state)
    155       {
    156 	// 27.6.1.2.1 Common requirements.
    157 	// Turn this on without causing an ios::failure to be thrown.
    158 	_M_streambuf_state |= __state;
    159 	if (this->exceptions() & __state)
    160 	  __throw_exception_again;
    161       }
    162 
    163       /**
    164        *  @brief  Fast error checking.
    165        *  @return  True if no error flags are set.
    166        *
    167        *  A wrapper around rdstate.
    168       */
    169       bool
    170       good() const
    171       { return this->rdstate() == 0; }
    172 
    173       /**
    174        *  @brief  Fast error checking.
    175        *  @return  True if the eofbit is set.
    176        *
    177        *  Note that other iostate flags may also be set.
    178       */
    179       bool
    180       eof() const
    181       { return (this->rdstate() & eofbit) != 0; }
    182 
    183       /**
    184        *  @brief  Fast error checking.
    185        *  @return  True if either the badbit or the failbit is set.
    186        *
    187        *  Checking the badbit in fail() is historical practice.
    188        *  Note that other iostate flags may also be set.
    189       */
    190       bool
    191       fail() const
    192       { return (this->rdstate() & (badbit | failbit)) != 0; }
    193 
    194       /**
    195        *  @brief  Fast error checking.
    196        *  @return  True if the badbit is set.
    197        *
    198        *  Note that other iostate flags may also be set.
    199       */
    200       bool
    201       bad() const
    202       { return (this->rdstate() & badbit) != 0; }
    203 
    204       /**
    205        *  @brief  Throwing exceptions on errors.
    206        *  @return  The current exceptions mask.
    207        *
    208        *  This changes nothing in the stream.  See the one-argument version
    209        *  of exceptions(iostate) for the meaning of the return value.
    210       */
    211       iostate
    212       exceptions() const
    213       { return _M_exception; }
    214 
    215       /**
    216        *  @brief  Throwing exceptions on errors.
    217        *  @param  except  The new exceptions mask.
    218        *
    219        *  By default, error flags are set silently.  You can set an
    220        *  exceptions mask for each stream; if a bit in the mask becomes set
    221        *  in the error flags, then an exception of type
    222        *  std::ios_base::failure is thrown.
    223        *
    224        *  If the error flag is already set when the exceptions mask is
    225        *  added, the exception is immediately thrown.  Try running the
    226        *  following under GCC 3.1 or later:
    227        *  @code
    228        *  #include <iostream>
    229        *  #include <fstream>
    230        *  #include <exception>
    231        *
    232        *  int main()
    233        *  {
    234        *      std::set_terminate (__gnu_cxx::__verbose_terminate_handler);
    235        *
    236        *      std::ifstream f ("/etc/motd");
    237        *
    238        *      std::cerr << "Setting badbit\n";
    239        *      f.setstate (std::ios_base::badbit);
    240        *
    241        *      std::cerr << "Setting exception mask\n";
    242        *      f.exceptions (std::ios_base::badbit);
    243        *  }
    244        *  @endcode
    245       */
    246       void
    247       exceptions(iostate __except)
    248       {
    249         _M_exception = __except;
    250         this->clear(_M_streambuf_state);
    251       }
    252 
    253       // Constructor/destructor:
    254       /**
    255        *  @brief  Constructor performs initialization.
    256        *
    257        *  The parameter is passed by derived streams.
    258       */
    259       explicit
    260       basic_ios(basic_streambuf<_CharT, _Traits>* __sb)
    261       : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0),
    262 	_M_ctype(0), _M_num_put(0), _M_num_get(0)
    263       { this->init(__sb); }
    264 
    265       /**
    266        *  @brief  Empty.
    267        *
    268        *  The destructor does nothing.  More specifically, it does not
    269        *  destroy the streambuf held by rdbuf().
    270       */
    271       virtual
    272       ~basic_ios() { }
    273 
    274       // Members:
    275       /**
    276        *  @brief  Fetches the current @e tied stream.
    277        *  @return  A pointer to the tied stream, or NULL if the stream is
    278        *           not tied.
    279        *
    280        *  A stream may be @e tied (or synchronized) to a second output
    281        *  stream.  When this stream performs any I/O, the tied stream is
    282        *  first flushed.  For example, @c std::cin is tied to @c std::cout.
    283       */
    284       basic_ostream<_CharT, _Traits>*
    285       tie() const
    286       { return _M_tie; }
    287 
    288       /**
    289        *  @brief  Ties this stream to an output stream.
    290        *  @param  tiestr  The output stream.
    291        *  @return  The previously tied output stream, or NULL if the stream
    292        *           was not tied.
    293        *
    294        *  This sets up a new tie; see tie() for more.
    295       */
    296       basic_ostream<_CharT, _Traits>*
    297       tie(basic_ostream<_CharT, _Traits>* __tiestr)
    298       {
    299         basic_ostream<_CharT, _Traits>* __old = _M_tie;
    300         _M_tie = __tiestr;
    301         return __old;
    302       }
    303 
    304       /**
    305        *  @brief  Accessing the underlying buffer.
    306        *  @return  The current stream buffer.
    307        *
    308        *  This does not change the state of the stream.
    309       */
    310       basic_streambuf<_CharT, _Traits>*
    311       rdbuf() const
    312       { return _M_streambuf; }
    313 
    314       /**
    315        *  @brief  Changing the underlying buffer.
    316        *  @param  sb  The new stream buffer.
    317        *  @return  The previous stream buffer.
    318        *
    319        *  Associates a new buffer with the current stream, and clears the
    320        *  error state.
    321        *
    322        *  Due to historical accidents which the LWG refuses to correct, the
    323        *  I/O library suffers from a design error:  this function is hidden
    324        *  in derived classes by overrides of the zero-argument @c rdbuf(),
    325        *  which is non-virtual for hysterical raisins.  As a result, you
    326        *  must use explicit qualifications to access this function via any
    327        *  derived class.  For example:
    328        *
    329        *  @code
    330        *  std::fstream     foo;         // or some other derived type
    331        *  std::streambuf*  p = .....;
    332        *
    333        *  foo.ios::rdbuf(p);            // ios == basic_ios<char>
    334        *  @endcode
    335       */
    336       basic_streambuf<_CharT, _Traits>*
    337       rdbuf(basic_streambuf<_CharT, _Traits>* __sb);
    338 
    339       /**
    340        *  @brief  Copies fields of __rhs into this.
    341        *  @param  __rhs  The source values for the copies.
    342        *  @return  Reference to this object.
    343        *
    344        *  All fields of __rhs are copied into this object except that rdbuf()
    345        *  and rdstate() remain unchanged.  All values in the pword and iword
    346        *  arrays are copied.  Before copying, each callback is invoked with
    347        *  erase_event.  After copying, each (new) callback is invoked with
    348        *  copyfmt_event.  The final step is to copy exceptions().
    349       */
    350       basic_ios&
    351       copyfmt(const basic_ios& __rhs);
    352 
    353       /**
    354        *  @brief  Retrieves the "empty" character.
    355        *  @return  The current fill character.
    356        *
    357        *  It defaults to a space (' ') in the current locale.
    358       */
    359       char_type
    360       fill() const
    361       {
    362 	if (!_M_fill_init)
    363 	  {
    364 	    _M_fill = this->widen(' ');
    365 	    _M_fill_init = true;
    366 	  }
    367 	return _M_fill;
    368       }
    369 
    370       /**
    371        *  @brief  Sets a new "empty" character.
    372        *  @param  ch  The new character.
    373        *  @return  The previous fill character.
    374        *
    375        *  The fill character is used to fill out space when P+ characters
    376        *  have been requested (e.g., via setw), Q characters are actually
    377        *  used, and Q<P.  It defaults to a space (' ') in the current locale.
    378       */
    379       char_type
    380       fill(char_type __ch)
    381       {
    382 	char_type __old = this->fill();
    383 	_M_fill = __ch;
    384 	return __old;
    385       }
    386 
    387       // Locales:
    388       /**
    389        *  @brief  Moves to a new locale.
    390        *  @param  loc  The new locale.
    391        *  @return  The previous locale.
    392        *
    393        *  Calls @c ios_base::imbue(loc), and if a stream buffer is associated
    394        *  with this stream, calls that buffer's @c pubimbue(loc).
    395        *
    396        *  Additional l10n notes are at
    397        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
    398       */
    399       locale
    400       imbue(const locale& __loc);
    401 
    402       /**
    403        *  @brief  Squeezes characters.
    404        *  @param  c  The character to narrow.
    405        *  @param  dfault  The character to narrow.
    406        *  @return  The narrowed character.
    407        *
    408        *  Maps a character of @c char_type to a character of @c char,
    409        *  if possible.
    410        *
    411        *  Returns the result of
    412        *  @code
    413        *    std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault)
    414        *  @endcode
    415        *
    416        *  Additional l10n notes are at
    417        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
    418       */
    419       char
    420       narrow(char_type __c, char __dfault) const
    421       { return __check_facet(_M_ctype).narrow(__c, __dfault); }
    422 
    423       /**
    424        *  @brief  Widens characters.
    425        *  @param  c  The character to widen.
    426        *  @return  The widened character.
    427        *
    428        *  Maps a character of @c char to a character of @c char_type.
    429        *
    430        *  Returns the result of
    431        *  @code
    432        *    std::use_facet<ctype<char_type> >(getloc()).widen(c)
    433        *  @endcode
    434        *
    435        *  Additional l10n notes are at
    436        *  http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html
    437       */
    438       char_type
    439       widen(char __c) const
    440       { return __check_facet(_M_ctype).widen(__c); }
    441 
    442     protected:
    443       // 27.4.5.1  basic_ios constructors
    444       /**
    445        *  @brief  Empty.
    446        *
    447        *  The default constructor does nothing and is not normally
    448        *  accessible to users.
    449       */
    450       basic_ios()
    451       : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false),
    452 	_M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0)
    453       { }
    454 
    455       /**
    456        *  @brief  All setup is performed here.
    457        *
    458        *  This is called from the public constructor.  It is not virtual and
    459        *  cannot be redefined.
    460       */
    461       void
    462       init(basic_streambuf<_CharT, _Traits>* __sb);
    463 
    464       void
    465       _M_cache_locale(const locale& __loc);
    466     };
    467 
    468 _GLIBCXX_END_NAMESPACE
    469 
    470 #ifndef _GLIBCXX_EXPORT_TEMPLATE
    471 #include <bits/basic_ios.tcc>
    472 #endif
    473 
    474 #endif /* _BASIC_IOS_H */
    475