111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Iostreams base classes -*- C++ -*- 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 1997-2014 Free Software Foundation, Inc. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library. This library is free 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option) 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version. 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful, 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details. 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation. 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>. 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file bits/basic_ios.h 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is an internal header file, included by other library headers. 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Do not attempt to use it directly. @headername{ios} 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _BASIC_IOS_H 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _BASIC_IOS_H 1 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/localefwd.h> 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_classes.h> 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/locale_facets.h> 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/streambuf_iterator.h> 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default) 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _Facet> 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert inline const _Facet& 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __check_facet(const _Facet* __f) 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!__f) 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __throw_bad_cast(); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return *__f; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Template class basic_ios, virtual base class for all 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * stream classes. 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @ingroup io 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @tparam _CharT Type of character stream. 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @tparam _Traits Traits for character type, defaults to 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * char_traits<_CharT>. 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Most of the member functions called dispatched on stream objects 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * (e.g., @c std::cout.foo(bar);) are consolidated in this class. 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template<typename _CharT, typename _Traits> 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert class basic_ios : public ios_base 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * These are standard types. They permit a standardized way of 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * referring to names of (or names dependent on) the template 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * parameters, which are specific to the implementation. 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _CharT char_type; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Traits::int_type int_type; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Traits::pos_type pos_type; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef typename _Traits::off_type off_type; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef _Traits traits_type; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * These are non-standard types. 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef ctype<_CharT> __ctype_type; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __num_put_type; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __num_get_type; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Data members: 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ostream<_CharT, _Traits>* _M_tie; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mutable char_type _M_fill; 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mutable bool _M_fill_init; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_streambuf<_CharT, _Traits>* _M_streambuf; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Cached use_facet<ctype>, which is based on the current locale info. 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const __ctype_type* _M_ctype; 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // For ostream. 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const __num_put_type* _M_num_put; 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // For istream. 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const __num_get_type* _M_num_get; 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public: 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@{ 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief The quick-and-easy status check. 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This allows you to write constructs such as 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * <code>if (!a_stream) ...</code> and <code>while (a_stream) ...</code> 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator void*() const 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->fail() ? 0 : const_cast<basic_ios*>(this); } 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert operator!() const 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->fail(); } 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Returns the error state of the stream buffer. 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return A bit pattern (well, isn't everything?) 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * See std::ios_base::iostate for the possible bit values. Most 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * users will call one of the interpreting wrappers, e.g., good(). 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iostate 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert rdstate() const 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_streambuf_state; } 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief [Re]sets the error state. 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __state The new state flag(s) to set. 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * See std::ios_base::iostate for the possible bit values. Most 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * users will not need to pass an argument. 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert clear(iostate __state = goodbit); 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Sets additional flags in the error state. 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __state The additional state flag(s) to set. 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * See std::ios_base::iostate for the possible bit values. 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert setstate(iostate __state) 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { this->clear(this->rdstate() | __state); } 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Flip the internal state on for the proper state bits, then re 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // throws the propagated exception if bit also set in 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // exceptions(). 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_setstate(iostate __state) 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 27.6.1.2.1 Common requirements. 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Turn this on without causing an ios::failure to be thrown. 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_streambuf_state |= __state; 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (this->exceptions() & __state) 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __throw_exception_again; 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Fast error checking. 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return True if no error flags are set. 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A wrapper around rdstate. 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert good() const 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return this->rdstate() == 0; } 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Fast error checking. 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return True if the eofbit is set. 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Note that other iostate flags may also be set. 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert eof() const 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return (this->rdstate() & eofbit) != 0; } 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Fast error checking. 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return True if either the badbit or the failbit is set. 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Checking the badbit in fail() is historical practice. 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Note that other iostate flags may also be set. 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fail() const 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return (this->rdstate() & (badbit | failbit)) != 0; } 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Fast error checking. 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return True if the badbit is set. 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Note that other iostate flags may also be set. 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bool 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert bad() const 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return (this->rdstate() & badbit) != 0; } 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Throwing exceptions on errors. 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The current exceptions mask. 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This changes nothing in the stream. See the one-argument version 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * of exceptions(iostate) for the meaning of the return value. 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert iostate 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert exceptions() const 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_exception; } 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Throwing exceptions on errors. 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __except The new exceptions mask. 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * By default, error flags are set silently. You can set an 22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * exceptions mask for each stream; if a bit in the mask becomes set 22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in the error flags, then an exception of type 22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::ios_base::failure is thrown. 22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * If the error flag is already set when the exceptions mask is 22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * added, the exception is immediately thrown. Try running the 23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * following under GCC 3.1 or later: 23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @code 23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * #include <iostream> 23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * #include <fstream> 23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * #include <exception> 23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * int main() 23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * { 23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::set_terminate (__gnu_cxx::__verbose_terminate_handler); 23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::ifstream f ("/etc/motd"); 24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::cerr << "Setting badbit\n"; 24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * f.setstate (std::ios_base::badbit); 24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::cerr << "Setting exception mask\n"; 24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * f.exceptions (std::ios_base::badbit); 24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * } 24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @endcode 24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert exceptions(iostate __except) 25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_exception = __except; 25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert this->clear(_M_streambuf_state); 25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Constructor/destructor: 25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Constructor performs initialization. 26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The parameter is passed by derived streams. 26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit 26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ios(basic_streambuf<_CharT, _Traits>* __sb) 26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : ios_base(), _M_tie(0), _M_fill(), _M_fill_init(false), _M_streambuf(0), 26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_ctype(0), _M_num_put(0), _M_num_get(0) 26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { this->init(__sb); } 26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Empty. 27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The destructor does nothing. More specifically, it does not 27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * destroy the streambuf held by rdbuf(). 27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert virtual 27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~basic_ios() { } 27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Members: 27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Fetches the current @e tied stream. 28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return A pointer to the tied stream, or NULL if the stream is 28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * not tied. 28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * A stream may be @e tied (or synchronized) to a second output 28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * stream. When this stream performs any I/O, the tied stream is 28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * first flushed. For example, @c std::cin is tied to @c std::cout. 28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ostream<_CharT, _Traits>* 28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert tie() const 29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_tie; } 29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Ties this stream to an output stream. 29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __tiestr The output stream. 29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The previously tied output stream, or NULL if the stream 29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * was not tied. 29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This sets up a new tie; see tie() for more. 29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ostream<_CharT, _Traits>* 30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert tie(basic_ostream<_CharT, _Traits>* __tiestr) 30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ostream<_CharT, _Traits>* __old = _M_tie; 30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_tie = __tiestr; 30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __old; 30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Accessing the underlying buffer. 31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The current stream buffer. 31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This does not change the state of the stream. 31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_streambuf<_CharT, _Traits>* 31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert rdbuf() const 31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return _M_streambuf; } 31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Changing the underlying buffer. 32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __sb The new stream buffer. 32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The previous stream buffer. 32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Associates a new buffer with the current stream, and clears the 32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * error state. 32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Due to historical accidents which the LWG refuses to correct, the 32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * I/O library suffers from a design error: this function is hidden 32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * in derived classes by overrides of the zero-argument @c rdbuf(), 32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * which is non-virtual for hysterical raisins. As a result, you 33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * must use explicit qualifications to access this function via any 33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * derived class. For example: 33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @code 33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::fstream foo; // or some other derived type 33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::streambuf* p = .....; 33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * foo.ios::rdbuf(p); // ios == basic_ios<char> 33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @endcode 33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_streambuf<_CharT, _Traits>* 34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert rdbuf(basic_streambuf<_CharT, _Traits>* __sb); 34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Copies fields of __rhs into this. 34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __rhs The source values for the copies. 34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return Reference to this object. 34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * All fields of __rhs are copied into this object except that rdbuf() 34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * and rdstate() remain unchanged. All values in the pword and iword 35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * arrays are copied. Before copying, each callback is invoked with 35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * erase_event. After copying, each (new) callback is invoked with 35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * copyfmt_event. The final step is to copy exceptions(). 35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ios& 35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert copyfmt(const basic_ios& __rhs); 35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Retrieves the @a empty character. 35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The current fill character. 36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * It defaults to a space (' ') in the current locale. 36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type 36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fill() const 36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (!_M_fill_init) 36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_fill = this->widen(' '); 36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_fill_init = true; 37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return _M_fill; 37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Sets a new @a empty character. 37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __ch The new character. 37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The previous fill character. 37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The fill character is used to fill out space when P+ characters 38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * have been requested (e.g., via setw), Q characters are actually 38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * used, and Q<P. It defaults to a space (' ') in the current locale. 38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type 38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert fill(char_type __ch) 38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type __old = this->fill(); 38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_fill = __ch; 38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return __old; 38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // Locales: 39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Moves to a new locale. 39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __loc The new locale. 39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The previous locale. 39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Calls @c ios_base::imbue(loc), and if a stream buffer is associated 39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * with this stream, calls that buffer's @c pubimbue(loc). 39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Additional l10n notes are at 40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html 40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale 40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert imbue(const locale& __loc); 40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Squeezes characters. 40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The character to narrow. 40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __dfault The character to narrow. 41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The narrowed character. 41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Maps a character of @c char_type to a character of @c char, 41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * if possible. 41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns the result of 41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @code 41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::use_facet<ctype<char_type> >(getloc()).narrow(c,dfault) 41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @endcode 41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Additional l10n notes are at 42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html 42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char 42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert narrow(char_type __c, char __dfault) const 42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return __check_facet(_M_ctype).narrow(__c, __dfault); } 42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Widens characters. 42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @param __c The character to widen. 43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @return The widened character. 43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Maps a character of @c char to a character of @c char_type. 43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Returns the result of 43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @code 43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * std::use_facet<ctype<char_type> >(getloc()).widen(c) 43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @endcode 43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Additional l10n notes are at 44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * http://gcc.gnu.org/onlinedocs/libstdc++/manual/localization.html 44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char_type 44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert widen(char __c) const 44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { return __check_facet(_M_ctype).widen(__c); } 44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert protected: 44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert // 27.4.5.1 basic_ios constructors 44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief Empty. 45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * The default constructor does nothing and is not normally 45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * accessible to users. 45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert basic_ios() 45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : ios_base(), _M_tie(0), _M_fill(char_type()), _M_fill_init(false), 45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_streambuf(0), _M_ctype(0), _M_num_put(0), _M_num_get(0) 45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { } 45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert /** 46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * @brief All setup is performed here. 46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * 46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * This is called from the public constructor. It is not virtual and 46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * cannot be redefined. 46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert init(basic_streambuf<_CharT, _Traits>* __sb); 46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void 46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _M_cache_locale(const locale& __loc); 47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert }; 47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION 47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace 47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/basic_ios.tcc> 47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _BASIC_IOS_H */ 478