xref: /netbsd-src/external/gpl3/gcc/dist/libstdc++-v3/include/std/fstream (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg// File based streams -*- C++ -*-
24fee23f9Smrg
3*b1e83836Smrg// Copyright (C) 1997-2022 Free Software Foundation, Inc.
44fee23f9Smrg//
54fee23f9Smrg// This file is part of the GNU ISO C++ Library.  This library is free
64fee23f9Smrg// software; you can redistribute it and/or modify it under the
74fee23f9Smrg// terms of the GNU General Public License as published by the
84fee23f9Smrg// Free Software Foundation; either version 3, or (at your option)
94fee23f9Smrg// any later version.
104fee23f9Smrg
114fee23f9Smrg// This library is distributed in the hope that it will be useful,
124fee23f9Smrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
134fee23f9Smrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
144fee23f9Smrg// GNU General Public License for more details.
154fee23f9Smrg
164fee23f9Smrg// Under Section 7 of GPL version 3, you are granted additional
174fee23f9Smrg// permissions described in the GCC Runtime Library Exception, version
184fee23f9Smrg// 3.1, as published by the Free Software Foundation.
194fee23f9Smrg
204fee23f9Smrg// You should have received a copy of the GNU General Public License and
214fee23f9Smrg// a copy of the GCC Runtime Library Exception along with this program;
224fee23f9Smrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
234fee23f9Smrg// <http://www.gnu.org/licenses/>.
244fee23f9Smrg
2548fb7bfaSmrg/** @file include/fstream
264fee23f9Smrg *  This is a Standard C++ Library header.
274fee23f9Smrg */
284fee23f9Smrg
294fee23f9Smrg//
304fee23f9Smrg// ISO C++ 14882: 27.8  File-based streams
314fee23f9Smrg//
324fee23f9Smrg
334fee23f9Smrg#ifndef _GLIBCXX_FSTREAM
344fee23f9Smrg#define _GLIBCXX_FSTREAM 1
354fee23f9Smrg
364fee23f9Smrg#pragma GCC system_header
374fee23f9Smrg
384fee23f9Smrg#include <istream>
394fee23f9Smrg#include <ostream>
404fee23f9Smrg#include <bits/codecvt.h>
414fee23f9Smrg#include <cstdio>             // For BUFSIZ
424fee23f9Smrg#include <bits/basic_file.h>  // For __basic_file, __c_lock
4348fb7bfaSmrg#if __cplusplus >= 201103L
444fee23f9Smrg#include <string>             // For std::string overloads.
454fee23f9Smrg#endif
464fee23f9Smrg
47*b1e83836Smrg// This can be overridden by the target's os_defines.h
48*b1e83836Smrg#ifndef _GLIBCXX_BUFSIZ
49*b1e83836Smrg# define _GLIBCXX_BUFSIZ BUFSIZ
50*b1e83836Smrg#endif
51*b1e83836Smrg
5248fb7bfaSmrgnamespace std _GLIBCXX_VISIBILITY(default)
5348fb7bfaSmrg{
5448fb7bfaSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
554fee23f9Smrg
56a3e9eb18Smrg#if __cplusplus >= 201703L
57a3e9eb18Smrg  // Enable if _Path is a filesystem::path or experimental::filesystem::path
58a3e9eb18Smrg  template<typename _Path, typename _Result = _Path, typename _Path2
59a3e9eb18Smrg	   = decltype(std::declval<_Path&>().make_preferred().filename())>
60a3e9eb18Smrg    using _If_fs_path = enable_if_t<is_same_v<_Path, _Path2>, _Result>;
61a3e9eb18Smrg#endif // C++17
62a3e9eb18Smrg
63a3e9eb18Smrg
644fee23f9Smrg  // [27.8.1.1] template class basic_filebuf
654fee23f9Smrg  /**
664fee23f9Smrg   *  @brief  The actual work of input and output (for files).
674fee23f9Smrg   *  @ingroup io
684fee23f9Smrg   *
6948fb7bfaSmrg   *  @tparam _CharT  Type of character stream.
7048fb7bfaSmrg   *  @tparam _Traits  Traits for character type, defaults to
7148fb7bfaSmrg   *                   char_traits<_CharT>.
7248fb7bfaSmrg   *
734fee23f9Smrg   *  This class associates both its input and output sequence with an
744fee23f9Smrg   *  external disk file, and maintains a joint file position for both
754fee23f9Smrg   *  sequences.  Many of its semantics are described in terms of similar
764fee23f9Smrg   *  behavior in the Standard C Library's @c FILE streams.
7748fb7bfaSmrg   *
7848fb7bfaSmrg   *  Requirements on traits_type, specific to this class:
7948fb7bfaSmrg   *  - traits_type::pos_type must be fpos<traits_type::state_type>
8048fb7bfaSmrg   *  - traits_type::off_type must be streamoff
8148fb7bfaSmrg   *  - traits_type::state_type must be Assignable and DefaultConstructible,
8248fb7bfaSmrg   *  - traits_type::state_type() must be the initial state for codecvt.
834fee23f9Smrg   */
844fee23f9Smrg  template<typename _CharT, typename _Traits>
854fee23f9Smrg    class basic_filebuf : public basic_streambuf<_CharT, _Traits>
864fee23f9Smrg    {
874d5abbe8Smrg#if __cplusplus >= 201103L
884d5abbe8Smrg      template<typename _Tp>
894d5abbe8Smrg	using __chk_state = __and_<is_copy_assignable<_Tp>,
904d5abbe8Smrg				   is_copy_constructible<_Tp>,
914d5abbe8Smrg				   is_default_constructible<_Tp>>;
924d5abbe8Smrg
934d5abbe8Smrg      static_assert(__chk_state<typename _Traits::state_type>::value,
944d5abbe8Smrg		    "state_type must be CopyAssignable, CopyConstructible"
954d5abbe8Smrg		    " and DefaultConstructible");
964d5abbe8Smrg
974d5abbe8Smrg      static_assert(is_same<typename _Traits::pos_type,
984d5abbe8Smrg			    fpos<typename _Traits::state_type>>::value,
994d5abbe8Smrg		    "pos_type must be fpos<state_type>");
1004d5abbe8Smrg#endif
1014fee23f9Smrg    public:
1024fee23f9Smrg      // Types:
1034fee23f9Smrg      typedef _CharT                     	        char_type;
1044fee23f9Smrg      typedef _Traits                    	        traits_type;
1054fee23f9Smrg      typedef typename traits_type::int_type 		int_type;
1064fee23f9Smrg      typedef typename traits_type::pos_type 		pos_type;
1074fee23f9Smrg      typedef typename traits_type::off_type 		off_type;
1084fee23f9Smrg
1094fee23f9Smrg      typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;
1104fee23f9Smrg      typedef basic_filebuf<char_type, traits_type>     __filebuf_type;
1114fee23f9Smrg      typedef __basic_file<char>		        __file_type;
1124fee23f9Smrg      typedef typename traits_type::state_type          __state_type;
1134fee23f9Smrg      typedef codecvt<char_type, char, __state_type>    __codecvt_type;
1144fee23f9Smrg
1154fee23f9Smrg      friend class ios_base; // For sync_with_stdio.
1164fee23f9Smrg
1174fee23f9Smrg    protected:
1184fee23f9Smrg      // Data Members:
1194fee23f9Smrg      // MT lock inherited from libio or other low-level io library.
1204fee23f9Smrg      __c_lock          	_M_lock;
1214fee23f9Smrg
1224fee23f9Smrg      // External buffer.
1234fee23f9Smrg      __file_type 		_M_file;
1244fee23f9Smrg
1254fee23f9Smrg      /// Place to stash in || out || in | out settings for current filebuf.
1264fee23f9Smrg      ios_base::openmode 	_M_mode;
1274fee23f9Smrg
1284fee23f9Smrg      // Beginning state type for codecvt.
1294fee23f9Smrg      __state_type 		_M_state_beg;
1304fee23f9Smrg
1314fee23f9Smrg      // During output, the state that corresponds to pptr(),
1324fee23f9Smrg      // during input, the state that corresponds to egptr() and
1334fee23f9Smrg      // _M_ext_next.
1344fee23f9Smrg      __state_type		_M_state_cur;
1354fee23f9Smrg
1364fee23f9Smrg      // Not used for output. During input, the state that corresponds
1374fee23f9Smrg      // to eback() and _M_ext_buf.
1384fee23f9Smrg      __state_type		_M_state_last;
1394fee23f9Smrg
1404fee23f9Smrg      /// Pointer to the beginning of internal buffer.
1414fee23f9Smrg      char_type*		_M_buf;
1424fee23f9Smrg
1434fee23f9Smrg      /**
1444fee23f9Smrg       *  Actual size of internal buffer. This number is equal to the size
1454fee23f9Smrg       *  of the put area + 1 position, reserved for the overflow char of
1464fee23f9Smrg       *  a full area.
1474fee23f9Smrg       */
1484fee23f9Smrg      size_t			_M_buf_size;
1494fee23f9Smrg
1504fee23f9Smrg      // Set iff _M_buf is allocated memory from _M_allocate_internal_buffer.
1514fee23f9Smrg      bool			_M_buf_allocated;
1524fee23f9Smrg
1534fee23f9Smrg      /**
1544fee23f9Smrg       *  _M_reading == false && _M_writing == false for @b uncommitted mode;
1554fee23f9Smrg       *  _M_reading == true for @b read mode;
1564fee23f9Smrg       *  _M_writing == true for @b write mode;
1574fee23f9Smrg       *
1584fee23f9Smrg       *  NB: _M_reading == true && _M_writing == true is unused.
1594fee23f9Smrg       */
1604fee23f9Smrg      bool                      _M_reading;
1614fee23f9Smrg      bool                      _M_writing;
1624fee23f9Smrg
163a448f87cSmrg      ///@{
1644fee23f9Smrg      /**
1654fee23f9Smrg       *  Necessary bits for putback buffer management.
1664fee23f9Smrg       *
1674fee23f9Smrg       *  @note pbacks of over one character are not currently supported.
1684fee23f9Smrg       */
1694fee23f9Smrg      char_type			_M_pback;
1704fee23f9Smrg      char_type*		_M_pback_cur_save;
1714fee23f9Smrg      char_type*		_M_pback_end_save;
1724fee23f9Smrg      bool			_M_pback_init;
173a448f87cSmrg      ///@}
1744fee23f9Smrg
1754fee23f9Smrg      // Cached codecvt facet.
1764fee23f9Smrg      const __codecvt_type* 	_M_codecvt;
1774fee23f9Smrg
1784fee23f9Smrg      /**
1794fee23f9Smrg       *  Buffer for external characters. Used for input when
1804fee23f9Smrg       *  codecvt::always_noconv() == false. When valid, this corresponds
1814fee23f9Smrg       *  to eback().
1824fee23f9Smrg       */
1834fee23f9Smrg      char*			_M_ext_buf;
1844fee23f9Smrg
1854fee23f9Smrg      /**
1864fee23f9Smrg       *  Size of buffer held by _M_ext_buf.
1874fee23f9Smrg       */
1884fee23f9Smrg      streamsize		_M_ext_buf_size;
1894fee23f9Smrg
1904fee23f9Smrg      /**
1914fee23f9Smrg       *  Pointers into the buffer held by _M_ext_buf that delimit a
1924fee23f9Smrg       *  subsequence of bytes that have been read but not yet converted.
1934fee23f9Smrg       *  When valid, _M_ext_next corresponds to egptr().
1944fee23f9Smrg       */
1954fee23f9Smrg      const char*		_M_ext_next;
1964fee23f9Smrg      char*			_M_ext_end;
1974fee23f9Smrg
1984fee23f9Smrg      /**
1994fee23f9Smrg       *  Initializes pback buffers, and moves normal buffers to safety.
2004fee23f9Smrg       *  Assumptions:
2014fee23f9Smrg       *  _M_in_cur has already been moved back
2024fee23f9Smrg       */
2034fee23f9Smrg      void
2044fee23f9Smrg      _M_create_pback()
2054fee23f9Smrg      {
2064fee23f9Smrg	if (!_M_pback_init)
2074fee23f9Smrg	  {
2084fee23f9Smrg	    _M_pback_cur_save = this->gptr();
2094fee23f9Smrg	    _M_pback_end_save = this->egptr();
2104fee23f9Smrg	    this->setg(&_M_pback, &_M_pback, &_M_pback + 1);
2114fee23f9Smrg	    _M_pback_init = true;
2124fee23f9Smrg	  }
2134fee23f9Smrg      }
2144fee23f9Smrg
2154fee23f9Smrg      /**
2164fee23f9Smrg       *  Deactivates pback buffer contents, and restores normal buffer.
2174fee23f9Smrg       *  Assumptions:
2184fee23f9Smrg       *  The pback buffer has only moved forward.
2194fee23f9Smrg       */
2204fee23f9Smrg      void
2214fee23f9Smrg      _M_destroy_pback() throw()
2224fee23f9Smrg      {
2234fee23f9Smrg	if (_M_pback_init)
2244fee23f9Smrg	  {
2254fee23f9Smrg	    // Length _M_in_cur moved in the pback buffer.
2264fee23f9Smrg	    _M_pback_cur_save += this->gptr() != this->eback();
2274fee23f9Smrg	    this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save);
2284fee23f9Smrg	    _M_pback_init = false;
2294fee23f9Smrg	  }
2304fee23f9Smrg      }
2314fee23f9Smrg
2324fee23f9Smrg    public:
2334fee23f9Smrg      // Constructors/destructor:
2344fee23f9Smrg      /**
2354fee23f9Smrg       *  @brief  Does not open any files.
2364fee23f9Smrg       *
2374fee23f9Smrg       *  The default constructor initializes the parent class using its
2384fee23f9Smrg       *  own default ctor.
2394fee23f9Smrg       */
2404fee23f9Smrg      basic_filebuf();
2414fee23f9Smrg
2424d5abbe8Smrg#if __cplusplus >= 201103L
2434d5abbe8Smrg      basic_filebuf(const basic_filebuf&) = delete;
2444d5abbe8Smrg      basic_filebuf(basic_filebuf&&);
2454d5abbe8Smrg#endif
2464d5abbe8Smrg
2474fee23f9Smrg      /**
2484fee23f9Smrg       *  @brief  The destructor closes the file first.
2494fee23f9Smrg       */
2504fee23f9Smrg      virtual
2514fee23f9Smrg      ~basic_filebuf()
252181254a7Smrg      {
253181254a7Smrg	__try
2544fee23f9Smrg	  { this->close(); }
255181254a7Smrg	__catch(...)
256181254a7Smrg	  { }
257181254a7Smrg      }
2584fee23f9Smrg
2594d5abbe8Smrg#if __cplusplus >= 201103L
2604d5abbe8Smrg      basic_filebuf& operator=(const basic_filebuf&) = delete;
2614d5abbe8Smrg      basic_filebuf& operator=(basic_filebuf&&);
2624d5abbe8Smrg      void swap(basic_filebuf&);
2634d5abbe8Smrg#endif
2644d5abbe8Smrg
2654fee23f9Smrg      // Members:
2664fee23f9Smrg      /**
2674fee23f9Smrg       *  @brief  Returns true if the external file is open.
2684fee23f9Smrg       */
2694fee23f9Smrg      bool
2704fee23f9Smrg      is_open() const throw()
2714fee23f9Smrg      { return _M_file.is_open(); }
2724fee23f9Smrg
2734fee23f9Smrg      /**
2744fee23f9Smrg       *  @brief  Opens an external file.
27548fb7bfaSmrg       *  @param  __s  The name of the file.
27648fb7bfaSmrg       *  @param  __mode  The open mode flags.
2774fee23f9Smrg       *  @return  @c this on success, NULL on failure
2784fee23f9Smrg       *
2794fee23f9Smrg       *  If a file is already open, this function immediately fails.
28048fb7bfaSmrg       *  Otherwise it tries to open the file named @a __s using the flags
28148fb7bfaSmrg       *  given in @a __mode.
2824fee23f9Smrg       *
2834fee23f9Smrg       *  Table 92, adapted here, gives the relation between openmode
2844d5abbe8Smrg       *  combinations and the equivalent @c fopen() flags.
2854fee23f9Smrg       *  (NB: lines app, in|out|app, in|app, binary|app, binary|in|out|app,
2864fee23f9Smrg       *  and binary|in|app per DR 596)
2874d5abbe8Smrg       *  <pre>
2884fee23f9Smrg       *  +---------------------------------------------------------+
2894fee23f9Smrg       *  | ios_base Flag combination            stdio equivalent   |
2904fee23f9Smrg       *  |binary  in  out  trunc  app                              |
2914fee23f9Smrg       *  +---------------------------------------------------------+
2924fee23f9Smrg       *  |             +                        w                  |
2934fee23f9Smrg       *  |             +           +            a                  |
2944fee23f9Smrg       *  |                         +            a                  |
2954fee23f9Smrg       *  |             +     +                  w                  |
2964fee23f9Smrg       *  |         +                            r                  |
2974fee23f9Smrg       *  |         +   +                        r+                 |
2984fee23f9Smrg       *  |         +   +     +                  w+                 |
2994fee23f9Smrg       *  |         +   +           +            a+                 |
3004fee23f9Smrg       *  |         +               +            a+                 |
3014fee23f9Smrg       *  +---------------------------------------------------------+
3024fee23f9Smrg       *  |   +         +                        wb                 |
3034fee23f9Smrg       *  |   +         +           +            ab                 |
3044fee23f9Smrg       *  |   +                     +            ab                 |
3054fee23f9Smrg       *  |   +         +     +                  wb                 |
3064fee23f9Smrg       *  |   +     +                            rb                 |
3074fee23f9Smrg       *  |   +     +   +                        r+b                |
3084fee23f9Smrg       *  |   +     +   +     +                  w+b                |
3094fee23f9Smrg       *  |   +     +   +           +            a+b                |
3104fee23f9Smrg       *  |   +     +               +            a+b                |
3114fee23f9Smrg       *  +---------------------------------------------------------+
3124d5abbe8Smrg       *  </pre>
3134fee23f9Smrg       */
3144fee23f9Smrg      __filebuf_type*
3154fee23f9Smrg      open(const char* __s, ios_base::openmode __mode);
3164fee23f9Smrg
317181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
318181254a7Smrg      /**
319181254a7Smrg       *  @brief  Opens an external file.
320181254a7Smrg       *  @param  __s  The name of the file, as a wide character string.
321181254a7Smrg       *  @param  __mode  The open mode flags.
322181254a7Smrg       *  @return  @c this on success, NULL on failure
323181254a7Smrg       */
324181254a7Smrg      __filebuf_type*
325181254a7Smrg      open(const wchar_t* __s, ios_base::openmode __mode);
326181254a7Smrg#endif
327181254a7Smrg
32848fb7bfaSmrg#if __cplusplus >= 201103L
3294fee23f9Smrg      /**
3304fee23f9Smrg       *  @brief  Opens an external file.
33148fb7bfaSmrg       *  @param  __s  The name of the file.
33248fb7bfaSmrg       *  @param  __mode  The open mode flags.
3334fee23f9Smrg       *  @return  @c this on success, NULL on failure
3344fee23f9Smrg       */
3354fee23f9Smrg      __filebuf_type*
3364fee23f9Smrg      open(const std::string& __s, ios_base::openmode __mode)
3374fee23f9Smrg      { return open(__s.c_str(), __mode); }
338a3e9eb18Smrg
339a3e9eb18Smrg#if __cplusplus >= 201703L
340a3e9eb18Smrg      /**
341a3e9eb18Smrg       *  @brief  Opens an external file.
342a3e9eb18Smrg       *  @param  __s  The name of the file, as a filesystem::path.
343a3e9eb18Smrg       *  @param  __mode  The open mode flags.
344a3e9eb18Smrg       *  @return  @c this on success, NULL on failure
345a3e9eb18Smrg       */
346a3e9eb18Smrg      template<typename _Path>
347a3e9eb18Smrg	_If_fs_path<_Path, __filebuf_type*>
348a3e9eb18Smrg	open(const _Path& __s, ios_base::openmode __mode)
349a3e9eb18Smrg	{ return open(__s.c_str(), __mode); }
350a3e9eb18Smrg#endif // C++17
351a3e9eb18Smrg#endif // C++11
3524fee23f9Smrg
3534fee23f9Smrg      /**
3544fee23f9Smrg       *  @brief  Closes the currently associated file.
3554fee23f9Smrg       *  @return  @c this on success, NULL on failure
3564fee23f9Smrg       *
3574fee23f9Smrg       *  If no file is currently open, this function immediately fails.
3584fee23f9Smrg       *
3594fee23f9Smrg       *  If a <em>put buffer area</em> exists, @c overflow(eof) is
3604fee23f9Smrg       *  called to flush all the characters.  The file is then
3614fee23f9Smrg       *  closed.
3624fee23f9Smrg       *
3634fee23f9Smrg       *  If any operations fail, this function also fails.
3644fee23f9Smrg       */
3654fee23f9Smrg      __filebuf_type*
3664fee23f9Smrg      close();
3674fee23f9Smrg
3684fee23f9Smrg    protected:
3694fee23f9Smrg      void
3704fee23f9Smrg      _M_allocate_internal_buffer();
3714fee23f9Smrg
3724fee23f9Smrg      void
3734fee23f9Smrg      _M_destroy_internal_buffer() throw();
3744fee23f9Smrg
3754fee23f9Smrg      // [27.8.1.4] overridden virtual functions
3764fee23f9Smrg      virtual streamsize
3774fee23f9Smrg      showmanyc();
3784fee23f9Smrg
3794fee23f9Smrg      // Stroustrup, 1998, p. 628
3804fee23f9Smrg      // underflow() and uflow() functions are called to get the next
3814fee23f9Smrg      // character from the real input source when the buffer is empty.
3824fee23f9Smrg      // Buffered input uses underflow()
3834fee23f9Smrg
3844fee23f9Smrg      virtual int_type
3854fee23f9Smrg      underflow();
3864fee23f9Smrg
3874fee23f9Smrg      virtual int_type
3884fee23f9Smrg      pbackfail(int_type __c = _Traits::eof());
3894fee23f9Smrg
3904fee23f9Smrg      // Stroustrup, 1998, p 648
3914fee23f9Smrg      // The overflow() function is called to transfer characters to the
3924fee23f9Smrg      // real output destination when the buffer is full. A call to
3934fee23f9Smrg      // overflow(c) outputs the contents of the buffer plus the
3944fee23f9Smrg      // character c.
3954fee23f9Smrg      // 27.5.2.4.5
3964fee23f9Smrg      // Consume some sequence of the characters in the pending sequence.
3974fee23f9Smrg      virtual int_type
3984fee23f9Smrg      overflow(int_type __c = _Traits::eof());
3994fee23f9Smrg
4004fee23f9Smrg      // Convert internal byte sequence to external, char-based
4014fee23f9Smrg      // sequence via codecvt.
4024fee23f9Smrg      bool
4034fee23f9Smrg      _M_convert_to_external(char_type*, streamsize);
4044fee23f9Smrg
4054fee23f9Smrg      /**
4064fee23f9Smrg       *  @brief  Manipulates the buffer.
40748fb7bfaSmrg       *  @param  __s  Pointer to a buffer area.
40848fb7bfaSmrg       *  @param  __n  Size of @a __s.
4094fee23f9Smrg       *  @return  @c this
4104fee23f9Smrg       *
41148fb7bfaSmrg       *  If no file has been opened, and both @a __s and @a __n are zero, then
41248fb7bfaSmrg       *  the stream becomes unbuffered.  Otherwise, @c __s is used as a
4134fee23f9Smrg       *  buffer; see
4144d5abbe8Smrg       *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering
4154fee23f9Smrg       *  for more.
4164fee23f9Smrg       */
4174fee23f9Smrg      virtual __streambuf_type*
4184fee23f9Smrg      setbuf(char_type* __s, streamsize __n);
4194fee23f9Smrg
4204fee23f9Smrg      virtual pos_type
4214fee23f9Smrg      seekoff(off_type __off, ios_base::seekdir __way,
4224fee23f9Smrg	      ios_base::openmode __mode = ios_base::in | ios_base::out);
4234fee23f9Smrg
4244fee23f9Smrg      virtual pos_type
4254fee23f9Smrg      seekpos(pos_type __pos,
4264fee23f9Smrg	      ios_base::openmode __mode = ios_base::in | ios_base::out);
4274fee23f9Smrg
42848fb7bfaSmrg      // Common code for seekoff, seekpos, and overflow
4294fee23f9Smrg      pos_type
4304fee23f9Smrg      _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state);
4314fee23f9Smrg
43248fb7bfaSmrg      int
43348fb7bfaSmrg      _M_get_ext_pos(__state_type &__state);
43448fb7bfaSmrg
4354fee23f9Smrg      virtual int
4364fee23f9Smrg      sync();
4374fee23f9Smrg
4384fee23f9Smrg      virtual void
4394fee23f9Smrg      imbue(const locale& __loc);
4404fee23f9Smrg
4414fee23f9Smrg      virtual streamsize
4424fee23f9Smrg      xsgetn(char_type* __s, streamsize __n);
4434fee23f9Smrg
4444fee23f9Smrg      virtual streamsize
4454fee23f9Smrg      xsputn(const char_type* __s, streamsize __n);
4464fee23f9Smrg
4474fee23f9Smrg      // Flushes output buffer, then writes unshift sequence.
4484fee23f9Smrg      bool
4494fee23f9Smrg      _M_terminate_output();
4504fee23f9Smrg
4514fee23f9Smrg      /**
4524fee23f9Smrg       *  This function sets the pointers of the internal buffer, both get
4534fee23f9Smrg       *  and put areas. Typically:
4544fee23f9Smrg       *
4554fee23f9Smrg       *   __off == egptr() - eback() upon underflow/uflow (@b read mode);
4564fee23f9Smrg       *   __off == 0 upon overflow (@b write mode);
4574fee23f9Smrg       *   __off == -1 upon open, setbuf, seekoff/pos (@b uncommitted mode).
4584fee23f9Smrg       *
4594fee23f9Smrg       *  NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size
4604fee23f9Smrg       *  reflects the actual allocated memory and the last cell is reserved
4614fee23f9Smrg       *  for the overflow char of a full put area.
4624fee23f9Smrg       */
4634fee23f9Smrg      void
4644fee23f9Smrg      _M_set_buffer(streamsize __off)
4654fee23f9Smrg      {
4664fee23f9Smrg	const bool __testin = _M_mode & ios_base::in;
4674d5abbe8Smrg	const bool __testout = (_M_mode & ios_base::out
4684d5abbe8Smrg				|| _M_mode & ios_base::app);
4694fee23f9Smrg
4704fee23f9Smrg	if (__testin && __off > 0)
4714fee23f9Smrg	  this->setg(_M_buf, _M_buf, _M_buf + __off);
4724fee23f9Smrg	else
4734fee23f9Smrg	  this->setg(_M_buf, _M_buf, _M_buf);
4744fee23f9Smrg
4754fee23f9Smrg	if (__testout && __off == 0 && _M_buf_size > 1 )
4764fee23f9Smrg	  this->setp(_M_buf, _M_buf + _M_buf_size - 1);
4774fee23f9Smrg	else
47848fb7bfaSmrg	  this->setp(0, 0);
4794fee23f9Smrg      }
4804fee23f9Smrg    };
4814fee23f9Smrg
4824fee23f9Smrg  // [27.8.1.5] Template class basic_ifstream
4834fee23f9Smrg  /**
4844fee23f9Smrg   *  @brief  Controlling input for files.
4854fee23f9Smrg   *  @ingroup io
4864fee23f9Smrg   *
48748fb7bfaSmrg   *  @tparam _CharT  Type of character stream.
48848fb7bfaSmrg   *  @tparam _Traits  Traits for character type, defaults to
48948fb7bfaSmrg   *                   char_traits<_CharT>.
49048fb7bfaSmrg   *
4914fee23f9Smrg   *  This class supports reading from named files, using the inherited
4924fee23f9Smrg   *  functions from std::basic_istream.  To control the associated
4934fee23f9Smrg   *  sequence, an instance of std::basic_filebuf is used, which this page
4944fee23f9Smrg   *  refers to as @c sb.
4954fee23f9Smrg   */
4964fee23f9Smrg  template<typename _CharT, typename _Traits>
4974fee23f9Smrg    class basic_ifstream : public basic_istream<_CharT, _Traits>
4984fee23f9Smrg    {
4994fee23f9Smrg    public:
5004fee23f9Smrg      // Types:
5014fee23f9Smrg      typedef _CharT 					char_type;
5024fee23f9Smrg      typedef _Traits 					traits_type;
5034fee23f9Smrg      typedef typename traits_type::int_type 		int_type;
5044fee23f9Smrg      typedef typename traits_type::pos_type 		pos_type;
5054fee23f9Smrg      typedef typename traits_type::off_type 		off_type;
5064fee23f9Smrg
5074fee23f9Smrg      // Non-standard types:
5084fee23f9Smrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
5094fee23f9Smrg      typedef basic_istream<char_type, traits_type>	__istream_type;
5104fee23f9Smrg
5114fee23f9Smrg    private:
5124fee23f9Smrg      __filebuf_type	_M_filebuf;
5134fee23f9Smrg
5144fee23f9Smrg    public:
5154fee23f9Smrg      // Constructors/Destructors:
5164fee23f9Smrg      /**
5174fee23f9Smrg       *  @brief  Default constructor.
5184fee23f9Smrg       *
5194fee23f9Smrg       *  Initializes @c sb using its default constructor, and passes
5204fee23f9Smrg       *  @c &sb to the base class initializer.  Does not open any files
5214fee23f9Smrg       *  (you haven't given it a filename to open).
5224fee23f9Smrg       */
5234fee23f9Smrg      basic_ifstream() : __istream_type(), _M_filebuf()
5244fee23f9Smrg      { this->init(&_M_filebuf); }
5254fee23f9Smrg
5264fee23f9Smrg      /**
5274fee23f9Smrg       *  @brief  Create an input file stream.
52848fb7bfaSmrg       *  @param  __s  Null terminated string specifying the filename.
52948fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
5304fee23f9Smrg       *
53148fb7bfaSmrg       *  @c ios_base::in is automatically included in @a __mode.
5324fee23f9Smrg       */
5334fee23f9Smrg      explicit
5344fee23f9Smrg      basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)
5354fee23f9Smrg      : __istream_type(), _M_filebuf()
5364fee23f9Smrg      {
5374fee23f9Smrg	this->init(&_M_filebuf);
5384fee23f9Smrg	this->open(__s, __mode);
5394fee23f9Smrg      }
5404fee23f9Smrg
541181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
542181254a7Smrg      /**
543181254a7Smrg       *  @param  Create an input file stream.
544181254a7Smrg       *  @param  __s  Wide string specifying the filename.
545181254a7Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
546181254a7Smrg       *
547181254a7Smrg       *  @c ios_base::in is automatically included in @a __mode.
548181254a7Smrg       */
549181254a7Smrg      basic_ifstream(const wchar_t* __s,
550181254a7Smrg		     ios_base::openmode __mode = ios_base::in)
551181254a7Smrg      : __istream_type(), _M_filebuf()
552181254a7Smrg      {
553181254a7Smrg	this->init(&_M_filebuf);
554181254a7Smrg	this->open(__s, __mode);
555181254a7Smrg      }
556181254a7Smrg#endif
557181254a7Smrg
55848fb7bfaSmrg#if __cplusplus >= 201103L
5594fee23f9Smrg      /**
5604fee23f9Smrg       *  @brief  Create an input file stream.
56148fb7bfaSmrg       *  @param  __s  std::string specifying the filename.
56248fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
5634fee23f9Smrg       *
56448fb7bfaSmrg       *  @c ios_base::in is automatically included in @a __mode.
5654fee23f9Smrg       */
5664fee23f9Smrg      explicit
5674fee23f9Smrg      basic_ifstream(const std::string& __s,
5684fee23f9Smrg		     ios_base::openmode __mode = ios_base::in)
5694fee23f9Smrg      : __istream_type(), _M_filebuf()
5704fee23f9Smrg      {
5714fee23f9Smrg	this->init(&_M_filebuf);
5724fee23f9Smrg	this->open(__s, __mode);
5734fee23f9Smrg      }
5744d5abbe8Smrg
575a3e9eb18Smrg#if __cplusplus >= 201703L
576a3e9eb18Smrg      /**
577fb8a8121Smrg       *  @brief  Create an input file stream.
578a3e9eb18Smrg       *  @param  __s  filesystem::path specifying the filename.
579a3e9eb18Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
580a3e9eb18Smrg       *
581a3e9eb18Smrg       *  @c ios_base::in is automatically included in @a __mode.
582a3e9eb18Smrg       */
583a3e9eb18Smrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
584a3e9eb18Smrg	basic_ifstream(const _Path& __s,
585a3e9eb18Smrg		       ios_base::openmode __mode = ios_base::in)
586a3e9eb18Smrg	: basic_ifstream(__s.c_str(), __mode)
587a3e9eb18Smrg	{ }
588a3e9eb18Smrg#endif // C++17
589a3e9eb18Smrg
5904d5abbe8Smrg      basic_ifstream(const basic_ifstream&) = delete;
5914d5abbe8Smrg
5924d5abbe8Smrg      basic_ifstream(basic_ifstream&& __rhs)
5934d5abbe8Smrg      : __istream_type(std::move(__rhs)),
5944d5abbe8Smrg      _M_filebuf(std::move(__rhs._M_filebuf))
5954d5abbe8Smrg      { __istream_type::set_rdbuf(&_M_filebuf); }
596a3e9eb18Smrg#endif // C++11
5974fee23f9Smrg
5984fee23f9Smrg      /**
5994fee23f9Smrg       *  @brief  The destructor does nothing.
6004fee23f9Smrg       *
6014fee23f9Smrg       *  The file is closed by the filebuf object, not the formatting
6024fee23f9Smrg       *  stream.
6034fee23f9Smrg       */
6044fee23f9Smrg      ~basic_ifstream()
6054fee23f9Smrg      { }
6064fee23f9Smrg
6074d5abbe8Smrg#if __cplusplus >= 201103L
6084d5abbe8Smrg      // 27.8.3.2 Assign and swap:
6094d5abbe8Smrg
6104d5abbe8Smrg      basic_ifstream&
6114d5abbe8Smrg      operator=(const basic_ifstream&) = delete;
6124d5abbe8Smrg
6134d5abbe8Smrg      basic_ifstream&
6144d5abbe8Smrg      operator=(basic_ifstream&& __rhs)
6154d5abbe8Smrg      {
6164d5abbe8Smrg	__istream_type::operator=(std::move(__rhs));
6174d5abbe8Smrg	_M_filebuf = std::move(__rhs._M_filebuf);
6184d5abbe8Smrg	return *this;
6194d5abbe8Smrg      }
6204d5abbe8Smrg
6214d5abbe8Smrg      void
6224d5abbe8Smrg      swap(basic_ifstream& __rhs)
6234d5abbe8Smrg      {
6244d5abbe8Smrg	__istream_type::swap(__rhs);
6254d5abbe8Smrg	_M_filebuf.swap(__rhs._M_filebuf);
6264d5abbe8Smrg      }
6274d5abbe8Smrg#endif
6284d5abbe8Smrg
6294fee23f9Smrg      // Members:
6304fee23f9Smrg      /**
6314fee23f9Smrg       *  @brief  Accessing the underlying buffer.
6324fee23f9Smrg       *  @return  The current basic_filebuf buffer.
6334fee23f9Smrg       *
6344fee23f9Smrg       *  This hides both signatures of std::basic_ios::rdbuf().
6354fee23f9Smrg       */
6364fee23f9Smrg      __filebuf_type*
6374fee23f9Smrg      rdbuf() const
6384fee23f9Smrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
6394fee23f9Smrg
6404fee23f9Smrg      /**
6414fee23f9Smrg       *  @brief  Wrapper to test for an open file.
6424fee23f9Smrg       *  @return  @c rdbuf()->is_open()
6434fee23f9Smrg       */
6444fee23f9Smrg      bool
6454fee23f9Smrg      is_open()
6464fee23f9Smrg      { return _M_filebuf.is_open(); }
6474fee23f9Smrg
6484fee23f9Smrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
6494fee23f9Smrg      // 365. Lack of const-qualification in clause 27
6504fee23f9Smrg      bool
6514fee23f9Smrg      is_open() const
6524fee23f9Smrg      { return _M_filebuf.is_open(); }
6534fee23f9Smrg
6544fee23f9Smrg      /**
6554fee23f9Smrg       *  @brief  Opens an external file.
65648fb7bfaSmrg       *  @param  __s  The name of the file.
65748fb7bfaSmrg       *  @param  __mode  The open mode flags.
6584fee23f9Smrg       *
65948fb7bfaSmrg       *  Calls @c std::basic_filebuf::open(s,__mode|in).  If that function
6604fee23f9Smrg       *  fails, @c failbit is set in the stream's error state.
6614fee23f9Smrg       */
6624fee23f9Smrg      void
6634fee23f9Smrg      open(const char* __s, ios_base::openmode __mode = ios_base::in)
6644fee23f9Smrg      {
6654fee23f9Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
6664fee23f9Smrg	  this->setstate(ios_base::failbit);
6674fee23f9Smrg	else
6684fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
6694fee23f9Smrg	  // 409. Closing an fstream should clear error state
6704fee23f9Smrg	  this->clear();
6714fee23f9Smrg      }
6724fee23f9Smrg
673181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
674181254a7Smrg      /**
675181254a7Smrg       *  @brief  Opens an external file.
676181254a7Smrg       *  @param  __s  The name of the file, as a wide character string.
677181254a7Smrg       *  @param  __mode  The open mode flags.
678181254a7Smrg       *
679181254a7Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
680181254a7Smrg       *  fails, @c failbit is set in the stream's error state.
681181254a7Smrg       */
682181254a7Smrg      void
683181254a7Smrg      open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in)
684181254a7Smrg      {
685181254a7Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
686181254a7Smrg	  this->setstate(ios_base::failbit);
687181254a7Smrg	else
688181254a7Smrg	  this->clear();
689181254a7Smrg      }
690181254a7Smrg#endif
691181254a7Smrg
69248fb7bfaSmrg#if __cplusplus >= 201103L
6934fee23f9Smrg      /**
6944fee23f9Smrg       *  @brief  Opens an external file.
69548fb7bfaSmrg       *  @param  __s  The name of the file.
69648fb7bfaSmrg       *  @param  __mode  The open mode flags.
6974fee23f9Smrg       *
69848fb7bfaSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
6994fee23f9Smrg       *  fails, @c failbit is set in the stream's error state.
7004fee23f9Smrg       */
7014fee23f9Smrg      void
7024fee23f9Smrg      open(const std::string& __s, ios_base::openmode __mode = ios_base::in)
7034fee23f9Smrg      {
7044fee23f9Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
7054fee23f9Smrg	  this->setstate(ios_base::failbit);
7064fee23f9Smrg	else
7074fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
7084fee23f9Smrg	  // 409. Closing an fstream should clear error state
7094fee23f9Smrg	  this->clear();
7104fee23f9Smrg      }
711a3e9eb18Smrg
712a3e9eb18Smrg#if __cplusplus >= 201703L
713a3e9eb18Smrg      /**
714a3e9eb18Smrg       *  @brief  Opens an external file.
715a3e9eb18Smrg       *  @param  __s  The name of the file, as a filesystem::path.
716a3e9eb18Smrg       *  @param  __mode  The open mode flags.
717a3e9eb18Smrg       *
718a3e9eb18Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
719a3e9eb18Smrg       *  fails, @c failbit is set in the stream's error state.
720a3e9eb18Smrg       */
721a3e9eb18Smrg      template<typename _Path>
722a3e9eb18Smrg	_If_fs_path<_Path, void>
723a3e9eb18Smrg	open(const _Path& __s, ios_base::openmode __mode = ios_base::in)
724a3e9eb18Smrg	{ open(__s.c_str(), __mode); }
725a3e9eb18Smrg#endif // C++17
726a3e9eb18Smrg#endif // C++11
7274fee23f9Smrg
7284fee23f9Smrg      /**
7294fee23f9Smrg       *  @brief  Close the file.
7304fee23f9Smrg       *
7314fee23f9Smrg       *  Calls @c std::basic_filebuf::close().  If that function
7324fee23f9Smrg       *  fails, @c failbit is set in the stream's error state.
7334fee23f9Smrg       */
7344fee23f9Smrg      void
7354fee23f9Smrg      close()
7364fee23f9Smrg      {
7374fee23f9Smrg	if (!_M_filebuf.close())
7384fee23f9Smrg	  this->setstate(ios_base::failbit);
7394fee23f9Smrg      }
7404fee23f9Smrg    };
7414fee23f9Smrg
7424fee23f9Smrg
7434fee23f9Smrg  // [27.8.1.8] Template class basic_ofstream
7444fee23f9Smrg  /**
7454fee23f9Smrg   *  @brief  Controlling output for files.
7464fee23f9Smrg   *  @ingroup io
7474fee23f9Smrg   *
74848fb7bfaSmrg   *  @tparam _CharT  Type of character stream.
74948fb7bfaSmrg   *  @tparam _Traits  Traits for character type, defaults to
75048fb7bfaSmrg   *                   char_traits<_CharT>.
75148fb7bfaSmrg   *
7524fee23f9Smrg   *  This class supports reading from named files, using the inherited
7534fee23f9Smrg   *  functions from std::basic_ostream.  To control the associated
7544fee23f9Smrg   *  sequence, an instance of std::basic_filebuf is used, which this page
7554fee23f9Smrg   *  refers to as @c sb.
7564fee23f9Smrg   */
7574fee23f9Smrg  template<typename _CharT, typename _Traits>
7584fee23f9Smrg    class basic_ofstream : public basic_ostream<_CharT,_Traits>
7594fee23f9Smrg    {
7604fee23f9Smrg    public:
7614fee23f9Smrg      // Types:
7624fee23f9Smrg      typedef _CharT 					char_type;
7634fee23f9Smrg      typedef _Traits 					traits_type;
7644fee23f9Smrg      typedef typename traits_type::int_type 		int_type;
7654fee23f9Smrg      typedef typename traits_type::pos_type 		pos_type;
7664fee23f9Smrg      typedef typename traits_type::off_type 		off_type;
7674fee23f9Smrg
7684fee23f9Smrg      // Non-standard types:
7694fee23f9Smrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
7704fee23f9Smrg      typedef basic_ostream<char_type, traits_type>	__ostream_type;
7714fee23f9Smrg
7724fee23f9Smrg    private:
7734fee23f9Smrg      __filebuf_type	_M_filebuf;
7744fee23f9Smrg
7754fee23f9Smrg    public:
7764fee23f9Smrg      // Constructors:
7774fee23f9Smrg      /**
7784fee23f9Smrg       *  @brief  Default constructor.
7794fee23f9Smrg       *
7804fee23f9Smrg       *  Initializes @c sb using its default constructor, and passes
7814fee23f9Smrg       *  @c &sb to the base class initializer.  Does not open any files
7824fee23f9Smrg       *  (you haven't given it a filename to open).
7834fee23f9Smrg       */
7844fee23f9Smrg      basic_ofstream(): __ostream_type(), _M_filebuf()
7854fee23f9Smrg      { this->init(&_M_filebuf); }
7864fee23f9Smrg
7874fee23f9Smrg      /**
7884fee23f9Smrg       *  @brief  Create an output file stream.
78948fb7bfaSmrg       *  @param  __s  Null terminated string specifying the filename.
79048fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
7914fee23f9Smrg       *
792a3e9eb18Smrg       *  @c ios_base::out is automatically included in @a __mode.
7934fee23f9Smrg       */
7944fee23f9Smrg      explicit
7954fee23f9Smrg      basic_ofstream(const char* __s,
796a3e9eb18Smrg		     ios_base::openmode __mode = ios_base::out)
7974fee23f9Smrg      : __ostream_type(), _M_filebuf()
7984fee23f9Smrg      {
7994fee23f9Smrg	this->init(&_M_filebuf);
8004fee23f9Smrg	this->open(__s, __mode);
8014fee23f9Smrg      }
8024fee23f9Smrg
803181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
804181254a7Smrg      /**
805181254a7Smrg       *  @param  Create an output file stream.
806181254a7Smrg       *  @param  __s  Wide string specifying the filename.
807181254a7Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
808181254a7Smrg       *
809181254a7Smrg       *  @c ios_base::out | @c ios_base::trunc is automatically included in
810181254a7Smrg       *  @a __mode.
811181254a7Smrg       */
812181254a7Smrg      basic_ofstream(const wchar_t* __s,
813181254a7Smrg		     ios_base::openmode __mode = ios_base::out|ios_base::trunc)
814181254a7Smrg      : __ostream_type(), _M_filebuf()
815181254a7Smrg      {
816181254a7Smrg	this->init(&_M_filebuf);
817181254a7Smrg	this->open(__s, __mode);
818181254a7Smrg      }
819181254a7Smrg#endif
820181254a7Smrg
82148fb7bfaSmrg#if __cplusplus >= 201103L
8224fee23f9Smrg      /**
8234fee23f9Smrg       *  @brief  Create an output file stream.
82448fb7bfaSmrg       *  @param  __s  std::string specifying the filename.
82548fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
8264fee23f9Smrg       *
827a3e9eb18Smrg       *  @c ios_base::out is automatically included in @a __mode.
8284fee23f9Smrg       */
8294fee23f9Smrg      explicit
8304fee23f9Smrg      basic_ofstream(const std::string& __s,
831a3e9eb18Smrg		     ios_base::openmode __mode = ios_base::out)
8324fee23f9Smrg      : __ostream_type(), _M_filebuf()
8334fee23f9Smrg      {
8344fee23f9Smrg	this->init(&_M_filebuf);
8354fee23f9Smrg	this->open(__s, __mode);
8364fee23f9Smrg      }
8374d5abbe8Smrg
838a3e9eb18Smrg#if __cplusplus >= 201703L
839a3e9eb18Smrg      /**
840fb8a8121Smrg       *  @brief  Create an output file stream.
841a3e9eb18Smrg       *  @param  __s  filesystem::path specifying the filename.
842a3e9eb18Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
843a3e9eb18Smrg       *
844a3e9eb18Smrg       *  @c ios_base::out is automatically included in @a __mode.
845a3e9eb18Smrg       */
846a3e9eb18Smrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
847a3e9eb18Smrg	basic_ofstream(const _Path& __s,
848a3e9eb18Smrg		       ios_base::openmode __mode = ios_base::out)
849a3e9eb18Smrg	: basic_ofstream(__s.c_str(), __mode)
850a3e9eb18Smrg	{ }
851a3e9eb18Smrg#endif // C++17
852a3e9eb18Smrg
8534d5abbe8Smrg      basic_ofstream(const basic_ofstream&) = delete;
8544d5abbe8Smrg
8554d5abbe8Smrg      basic_ofstream(basic_ofstream&& __rhs)
8564d5abbe8Smrg      : __ostream_type(std::move(__rhs)),
8574d5abbe8Smrg      _M_filebuf(std::move(__rhs._M_filebuf))
8584d5abbe8Smrg      { __ostream_type::set_rdbuf(&_M_filebuf); }
8594fee23f9Smrg#endif
8604fee23f9Smrg
8614fee23f9Smrg      /**
8624fee23f9Smrg       *  @brief  The destructor does nothing.
8634fee23f9Smrg       *
8644fee23f9Smrg       *  The file is closed by the filebuf object, not the formatting
8654fee23f9Smrg       *  stream.
8664fee23f9Smrg       */
8674fee23f9Smrg      ~basic_ofstream()
8684fee23f9Smrg      { }
8694fee23f9Smrg
8704d5abbe8Smrg#if __cplusplus >= 201103L
8714d5abbe8Smrg      // 27.8.3.2 Assign and swap:
8724d5abbe8Smrg
8734d5abbe8Smrg      basic_ofstream&
8744d5abbe8Smrg      operator=(const basic_ofstream&) = delete;
8754d5abbe8Smrg
8764d5abbe8Smrg      basic_ofstream&
8774d5abbe8Smrg      operator=(basic_ofstream&& __rhs)
8784d5abbe8Smrg      {
8794d5abbe8Smrg	__ostream_type::operator=(std::move(__rhs));
8804d5abbe8Smrg	_M_filebuf = std::move(__rhs._M_filebuf);
8814d5abbe8Smrg	return *this;
8824d5abbe8Smrg      }
8834d5abbe8Smrg
8844d5abbe8Smrg      void
8854d5abbe8Smrg      swap(basic_ofstream& __rhs)
8864d5abbe8Smrg      {
8874d5abbe8Smrg	__ostream_type::swap(__rhs);
8884d5abbe8Smrg	_M_filebuf.swap(__rhs._M_filebuf);
8894d5abbe8Smrg      }
8904d5abbe8Smrg#endif
8914d5abbe8Smrg
8924fee23f9Smrg      // Members:
8934fee23f9Smrg      /**
8944fee23f9Smrg       *  @brief  Accessing the underlying buffer.
8954fee23f9Smrg       *  @return  The current basic_filebuf buffer.
8964fee23f9Smrg       *
8974fee23f9Smrg       *  This hides both signatures of std::basic_ios::rdbuf().
8984fee23f9Smrg       */
8994fee23f9Smrg      __filebuf_type*
9004fee23f9Smrg      rdbuf() const
9014fee23f9Smrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
9024fee23f9Smrg
9034fee23f9Smrg      /**
9044fee23f9Smrg       *  @brief  Wrapper to test for an open file.
9054fee23f9Smrg       *  @return  @c rdbuf()->is_open()
9064fee23f9Smrg       */
9074fee23f9Smrg      bool
9084fee23f9Smrg      is_open()
9094fee23f9Smrg      { return _M_filebuf.is_open(); }
9104fee23f9Smrg
9114fee23f9Smrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
9124fee23f9Smrg      // 365. Lack of const-qualification in clause 27
9134fee23f9Smrg      bool
9144fee23f9Smrg      is_open() const
9154fee23f9Smrg      { return _M_filebuf.is_open(); }
9164fee23f9Smrg
9174fee23f9Smrg      /**
9184fee23f9Smrg       *  @brief  Opens an external file.
91948fb7bfaSmrg       *  @param  __s  The name of the file.
92048fb7bfaSmrg       *  @param  __mode  The open mode flags.
9214fee23f9Smrg       *
922a3e9eb18Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
9234fee23f9Smrg       *  function fails, @c failbit is set in the stream's error state.
9244fee23f9Smrg       */
9254fee23f9Smrg      void
926a3e9eb18Smrg      open(const char* __s, ios_base::openmode __mode = ios_base::out)
9274fee23f9Smrg      {
9284fee23f9Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
9294fee23f9Smrg	  this->setstate(ios_base::failbit);
9304fee23f9Smrg	else
9314fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
9324fee23f9Smrg	  // 409. Closing an fstream should clear error state
9334fee23f9Smrg	  this->clear();
9344fee23f9Smrg      }
9354fee23f9Smrg
936181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
937181254a7Smrg      /**
938181254a7Smrg       *  @brief  Opens an external file.
939181254a7Smrg       *  @param  __s  The name of the file.
940181254a7Smrg       *  @param  __mode  The open mode flags.
941181254a7Smrg       *
942181254a7Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
943181254a7Smrg       *  function fails, @c failbit is set in the stream's error state.
944181254a7Smrg       */
945181254a7Smrg      void
946181254a7Smrg      open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out)
947181254a7Smrg      {
948181254a7Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
949181254a7Smrg	  this->setstate(ios_base::failbit);
950181254a7Smrg	else
951181254a7Smrg	  this->clear();
952181254a7Smrg      }
953181254a7Smrg#endif
954181254a7Smrg
95548fb7bfaSmrg#if __cplusplus >= 201103L
9564fee23f9Smrg      /**
9574fee23f9Smrg       *  @brief  Opens an external file.
95848fb7bfaSmrg       *  @param  __s  The name of the file.
95948fb7bfaSmrg       *  @param  __mode  The open mode flags.
9604fee23f9Smrg       *
961a3e9eb18Smrg       *  Calls @c std::basic_filebuf::open(s,mode|out).  If that
9624fee23f9Smrg       *  function fails, @c failbit is set in the stream's error state.
9634fee23f9Smrg       */
9644fee23f9Smrg      void
965a3e9eb18Smrg      open(const std::string& __s, ios_base::openmode __mode = ios_base::out)
9664fee23f9Smrg      {
9674fee23f9Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
9684fee23f9Smrg	  this->setstate(ios_base::failbit);
9694fee23f9Smrg	else
9704fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
9714fee23f9Smrg	  // 409. Closing an fstream should clear error state
9724fee23f9Smrg	  this->clear();
9734fee23f9Smrg      }
974a3e9eb18Smrg
975a3e9eb18Smrg#if __cplusplus >= 201703L
976a3e9eb18Smrg      /**
977a3e9eb18Smrg       *  @brief  Opens an external file.
978a3e9eb18Smrg       *  @param  __s  The name of the file, as a filesystem::path.
979a3e9eb18Smrg       *  @param  __mode  The open mode flags.
980a3e9eb18Smrg       *
981a3e9eb18Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
982a3e9eb18Smrg       *  function fails, @c failbit is set in the stream's error state.
983a3e9eb18Smrg       */
984a3e9eb18Smrg      template<typename _Path>
985a3e9eb18Smrg	_If_fs_path<_Path, void>
986a3e9eb18Smrg	open(const _Path& __s, ios_base::openmode __mode = ios_base::out)
987a3e9eb18Smrg	{ open(__s.c_str(), __mode); }
988a3e9eb18Smrg#endif // C++17
989a3e9eb18Smrg#endif // C++11
9904fee23f9Smrg
9914fee23f9Smrg      /**
9924fee23f9Smrg       *  @brief  Close the file.
9934fee23f9Smrg       *
9944fee23f9Smrg       *  Calls @c std::basic_filebuf::close().  If that function
9954fee23f9Smrg       *  fails, @c failbit is set in the stream's error state.
9964fee23f9Smrg       */
9974fee23f9Smrg      void
9984fee23f9Smrg      close()
9994fee23f9Smrg      {
10004fee23f9Smrg	if (!_M_filebuf.close())
10014fee23f9Smrg	  this->setstate(ios_base::failbit);
10024fee23f9Smrg      }
10034fee23f9Smrg    };
10044fee23f9Smrg
10054fee23f9Smrg
10064fee23f9Smrg  // [27.8.1.11] Template class basic_fstream
10074fee23f9Smrg  /**
10084fee23f9Smrg   *  @brief  Controlling input and output for files.
10094fee23f9Smrg   *  @ingroup io
10104fee23f9Smrg   *
101148fb7bfaSmrg   *  @tparam _CharT  Type of character stream.
101248fb7bfaSmrg   *  @tparam _Traits  Traits for character type, defaults to
101348fb7bfaSmrg   *                   char_traits<_CharT>.
101448fb7bfaSmrg   *
10154fee23f9Smrg   *  This class supports reading from and writing to named files, using
10164fee23f9Smrg   *  the inherited functions from std::basic_iostream.  To control the
10174fee23f9Smrg   *  associated sequence, an instance of std::basic_filebuf is used, which
10184fee23f9Smrg   *  this page refers to as @c sb.
10194fee23f9Smrg   */
10204fee23f9Smrg  template<typename _CharT, typename _Traits>
10214fee23f9Smrg    class basic_fstream : public basic_iostream<_CharT, _Traits>
10224fee23f9Smrg    {
10234fee23f9Smrg    public:
10244fee23f9Smrg      // Types:
10254fee23f9Smrg      typedef _CharT 					char_type;
10264fee23f9Smrg      typedef _Traits 					traits_type;
10274fee23f9Smrg      typedef typename traits_type::int_type 		int_type;
10284fee23f9Smrg      typedef typename traits_type::pos_type 		pos_type;
10294fee23f9Smrg      typedef typename traits_type::off_type 		off_type;
10304fee23f9Smrg
10314fee23f9Smrg      // Non-standard types:
10324fee23f9Smrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
10334fee23f9Smrg      typedef basic_ios<char_type, traits_type>		__ios_type;
10344fee23f9Smrg      typedef basic_iostream<char_type, traits_type>	__iostream_type;
10354fee23f9Smrg
10364fee23f9Smrg    private:
10374fee23f9Smrg      __filebuf_type	_M_filebuf;
10384fee23f9Smrg
10394fee23f9Smrg    public:
10404fee23f9Smrg      // Constructors/destructor:
10414fee23f9Smrg      /**
10424fee23f9Smrg       *  @brief  Default constructor.
10434fee23f9Smrg       *
10444fee23f9Smrg       *  Initializes @c sb using its default constructor, and passes
10454fee23f9Smrg       *  @c &sb to the base class initializer.  Does not open any files
10464fee23f9Smrg       *  (you haven't given it a filename to open).
10474fee23f9Smrg       */
10484fee23f9Smrg      basic_fstream()
10494fee23f9Smrg      : __iostream_type(), _M_filebuf()
10504fee23f9Smrg      { this->init(&_M_filebuf); }
10514fee23f9Smrg
10524fee23f9Smrg      /**
10534fee23f9Smrg       *  @brief  Create an input/output file stream.
105448fb7bfaSmrg       *  @param  __s  Null terminated string specifying the filename.
105548fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
10564fee23f9Smrg       */
10574fee23f9Smrg      explicit
10584fee23f9Smrg      basic_fstream(const char* __s,
10594fee23f9Smrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
106048fb7bfaSmrg      : __iostream_type(0), _M_filebuf()
10614fee23f9Smrg      {
10624fee23f9Smrg	this->init(&_M_filebuf);
10634fee23f9Smrg	this->open(__s, __mode);
10644fee23f9Smrg      }
10654fee23f9Smrg
1066181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
1067181254a7Smrg      /**
1068181254a7Smrg       *  @param  Create an input/output file stream.
1069181254a7Smrg       *  @param  __s  Wide string specifying the filename.
1070181254a7Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
1071181254a7Smrg       */
1072181254a7Smrg      basic_fstream(const wchar_t* __s,
1073181254a7Smrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
1074181254a7Smrg      : __iostream_type(0), _M_filebuf()
1075181254a7Smrg      {
1076181254a7Smrg	this->init(&_M_filebuf);
1077181254a7Smrg	this->open(__s, __mode);
1078181254a7Smrg      }
1079181254a7Smrg#endif
1080181254a7Smrg
108148fb7bfaSmrg#if __cplusplus >= 201103L
10824fee23f9Smrg      /**
10834fee23f9Smrg       *  @brief  Create an input/output file stream.
108448fb7bfaSmrg       *  @param  __s  Null terminated string specifying the filename.
108548fb7bfaSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
10864fee23f9Smrg       */
10874fee23f9Smrg      explicit
10884fee23f9Smrg      basic_fstream(const std::string& __s,
10894fee23f9Smrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
109048fb7bfaSmrg      : __iostream_type(0), _M_filebuf()
10914fee23f9Smrg      {
10924fee23f9Smrg	this->init(&_M_filebuf);
10934fee23f9Smrg	this->open(__s, __mode);
10944fee23f9Smrg      }
10954d5abbe8Smrg
1096a3e9eb18Smrg#if __cplusplus >= 201703L
1097a3e9eb18Smrg      /**
1098fb8a8121Smrg       *  @brief  Create an input/output file stream.
1099a3e9eb18Smrg       *  @param  __s  filesystem::path specifying the filename.
1100a3e9eb18Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
1101a3e9eb18Smrg       */
1102a3e9eb18Smrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
1103a3e9eb18Smrg	basic_fstream(const _Path& __s,
1104a3e9eb18Smrg		      ios_base::openmode __mode = ios_base::in | ios_base::out)
1105a3e9eb18Smrg	: basic_fstream(__s.c_str(), __mode)
1106a3e9eb18Smrg	{ }
1107a3e9eb18Smrg#endif // C++17
1108a3e9eb18Smrg
11094d5abbe8Smrg      basic_fstream(const basic_fstream&) = delete;
11104d5abbe8Smrg
11114d5abbe8Smrg      basic_fstream(basic_fstream&& __rhs)
11124d5abbe8Smrg      : __iostream_type(std::move(__rhs)),
11134d5abbe8Smrg      _M_filebuf(std::move(__rhs._M_filebuf))
11144d5abbe8Smrg      { __iostream_type::set_rdbuf(&_M_filebuf); }
11154fee23f9Smrg#endif
11164fee23f9Smrg
11174fee23f9Smrg      /**
11184fee23f9Smrg       *  @brief  The destructor does nothing.
11194fee23f9Smrg       *
11204fee23f9Smrg       *  The file is closed by the filebuf object, not the formatting
11214fee23f9Smrg       *  stream.
11224fee23f9Smrg       */
11234fee23f9Smrg      ~basic_fstream()
11244fee23f9Smrg      { }
11254fee23f9Smrg
11264d5abbe8Smrg#if __cplusplus >= 201103L
11274d5abbe8Smrg      // 27.8.3.2 Assign and swap:
11284d5abbe8Smrg
11294d5abbe8Smrg      basic_fstream&
11304d5abbe8Smrg      operator=(const basic_fstream&) = delete;
11314d5abbe8Smrg
11324d5abbe8Smrg      basic_fstream&
11334d5abbe8Smrg      operator=(basic_fstream&& __rhs)
11344d5abbe8Smrg      {
11354d5abbe8Smrg	__iostream_type::operator=(std::move(__rhs));
11364d5abbe8Smrg	_M_filebuf = std::move(__rhs._M_filebuf);
11374d5abbe8Smrg	return *this;
11384d5abbe8Smrg      }
11394d5abbe8Smrg
11404d5abbe8Smrg      void
11414d5abbe8Smrg      swap(basic_fstream& __rhs)
11424d5abbe8Smrg      {
11434d5abbe8Smrg	__iostream_type::swap(__rhs);
11444d5abbe8Smrg	_M_filebuf.swap(__rhs._M_filebuf);
11454d5abbe8Smrg      }
11464d5abbe8Smrg#endif
11474d5abbe8Smrg
11484fee23f9Smrg      // Members:
11494fee23f9Smrg      /**
11504fee23f9Smrg       *  @brief  Accessing the underlying buffer.
11514fee23f9Smrg       *  @return  The current basic_filebuf buffer.
11524fee23f9Smrg       *
11534fee23f9Smrg       *  This hides both signatures of std::basic_ios::rdbuf().
11544fee23f9Smrg       */
11554fee23f9Smrg      __filebuf_type*
11564fee23f9Smrg      rdbuf() const
11574fee23f9Smrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
11584fee23f9Smrg
11594fee23f9Smrg      /**
11604fee23f9Smrg       *  @brief  Wrapper to test for an open file.
11614fee23f9Smrg       *  @return  @c rdbuf()->is_open()
11624fee23f9Smrg       */
11634fee23f9Smrg      bool
11644fee23f9Smrg      is_open()
11654fee23f9Smrg      { return _M_filebuf.is_open(); }
11664fee23f9Smrg
11674fee23f9Smrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
11684fee23f9Smrg      // 365. Lack of const-qualification in clause 27
11694fee23f9Smrg      bool
11704fee23f9Smrg      is_open() const
11714fee23f9Smrg      { return _M_filebuf.is_open(); }
11724fee23f9Smrg
11734fee23f9Smrg      /**
11744fee23f9Smrg       *  @brief  Opens an external file.
117548fb7bfaSmrg       *  @param  __s  The name of the file.
117648fb7bfaSmrg       *  @param  __mode  The open mode flags.
11774fee23f9Smrg       *
117848fb7bfaSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
11794fee23f9Smrg       *  function fails, @c failbit is set in the stream's error state.
11804fee23f9Smrg       */
11814fee23f9Smrg      void
11824fee23f9Smrg      open(const char* __s,
11834fee23f9Smrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
11844fee23f9Smrg      {
11854fee23f9Smrg	if (!_M_filebuf.open(__s, __mode))
11864fee23f9Smrg	  this->setstate(ios_base::failbit);
11874fee23f9Smrg	else
11884fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
11894fee23f9Smrg	  // 409. Closing an fstream should clear error state
11904fee23f9Smrg	  this->clear();
11914fee23f9Smrg      }
11924fee23f9Smrg
1193181254a7Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
1194181254a7Smrg      /**
1195181254a7Smrg       *  @brief  Opens an external file.
1196181254a7Smrg       *  @param  __s  The name of the file.
1197181254a7Smrg       *  @param  __mode  The open mode flags.
1198181254a7Smrg       *
1199181254a7Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
1200181254a7Smrg       *  function fails, @c failbit is set in the stream's error state.
1201181254a7Smrg       */
1202181254a7Smrg      void
1203181254a7Smrg      open(const wchar_t* __s,
1204181254a7Smrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
1205181254a7Smrg      {
1206181254a7Smrg	if (!_M_filebuf.open(__s, __mode))
1207181254a7Smrg	  this->setstate(ios_base::failbit);
1208181254a7Smrg	else
1209181254a7Smrg	  this->clear();
1210181254a7Smrg      }
1211181254a7Smrg#endif
1212181254a7Smrg
121348fb7bfaSmrg#if __cplusplus >= 201103L
12144fee23f9Smrg      /**
12154fee23f9Smrg       *  @brief  Opens an external file.
121648fb7bfaSmrg       *  @param  __s  The name of the file.
121748fb7bfaSmrg       *  @param  __mode  The open mode flags.
12184fee23f9Smrg       *
121948fb7bfaSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
12204fee23f9Smrg       *  function fails, @c failbit is set in the stream's error state.
12214fee23f9Smrg       */
12224fee23f9Smrg      void
12234fee23f9Smrg      open(const std::string& __s,
12244fee23f9Smrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
12254fee23f9Smrg      {
12264fee23f9Smrg	if (!_M_filebuf.open(__s, __mode))
12274fee23f9Smrg	  this->setstate(ios_base::failbit);
12284fee23f9Smrg	else
12294fee23f9Smrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
12304fee23f9Smrg	  // 409. Closing an fstream should clear error state
12314fee23f9Smrg	  this->clear();
12324fee23f9Smrg      }
1233a3e9eb18Smrg
1234a3e9eb18Smrg#if __cplusplus >= 201703L
1235a3e9eb18Smrg      /**
1236a3e9eb18Smrg       *  @brief  Opens an external file.
1237a3e9eb18Smrg       *  @param  __s  The name of the file, as a filesystem::path.
1238a3e9eb18Smrg       *  @param  __mode  The open mode flags.
1239a3e9eb18Smrg       *
1240a3e9eb18Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
1241a3e9eb18Smrg       *  function fails, @c failbit is set in the stream's error state.
1242a3e9eb18Smrg       */
1243a3e9eb18Smrg      template<typename _Path>
1244a3e9eb18Smrg	_If_fs_path<_Path, void>
1245a3e9eb18Smrg	open(const _Path& __s,
1246a3e9eb18Smrg	     ios_base::openmode __mode = ios_base::in | ios_base::out)
1247a3e9eb18Smrg	{ open(__s.c_str(), __mode); }
1248a3e9eb18Smrg#endif // C++17
1249a3e9eb18Smrg#endif // C++11
12504fee23f9Smrg
12514fee23f9Smrg      /**
12524fee23f9Smrg       *  @brief  Close the file.
12534fee23f9Smrg       *
12544fee23f9Smrg       *  Calls @c std::basic_filebuf::close().  If that function
12554fee23f9Smrg       *  fails, @c failbit is set in the stream's error state.
12564fee23f9Smrg       */
12574fee23f9Smrg      void
12584fee23f9Smrg      close()
12594fee23f9Smrg      {
12604fee23f9Smrg	if (!_M_filebuf.close())
12614fee23f9Smrg	  this->setstate(ios_base::failbit);
12624fee23f9Smrg      }
12634fee23f9Smrg    };
12644fee23f9Smrg
12654d5abbe8Smrg#if __cplusplus >= 201103L
12664d5abbe8Smrg  /// Swap specialization for filebufs.
12674d5abbe8Smrg  template <class _CharT, class _Traits>
12684d5abbe8Smrg    inline void
12694d5abbe8Smrg    swap(basic_filebuf<_CharT, _Traits>& __x,
12704d5abbe8Smrg	 basic_filebuf<_CharT, _Traits>& __y)
12714d5abbe8Smrg    { __x.swap(__y); }
12724d5abbe8Smrg
12734d5abbe8Smrg  /// Swap specialization for ifstreams.
12744d5abbe8Smrg  template <class _CharT, class _Traits>
12754d5abbe8Smrg    inline void
12764d5abbe8Smrg    swap(basic_ifstream<_CharT, _Traits>& __x,
12774d5abbe8Smrg	 basic_ifstream<_CharT, _Traits>& __y)
12784d5abbe8Smrg    { __x.swap(__y); }
12794d5abbe8Smrg
12804d5abbe8Smrg  /// Swap specialization for ofstreams.
12814d5abbe8Smrg  template <class _CharT, class _Traits>
12824d5abbe8Smrg    inline void
12834d5abbe8Smrg    swap(basic_ofstream<_CharT, _Traits>& __x,
12844d5abbe8Smrg	 basic_ofstream<_CharT, _Traits>& __y)
12854d5abbe8Smrg    { __x.swap(__y); }
12864d5abbe8Smrg
12874d5abbe8Smrg  /// Swap specialization for fstreams.
12884d5abbe8Smrg  template <class _CharT, class _Traits>
12894d5abbe8Smrg    inline void
12904d5abbe8Smrg    swap(basic_fstream<_CharT, _Traits>& __x,
12914d5abbe8Smrg	 basic_fstream<_CharT, _Traits>& __y)
12924d5abbe8Smrg    { __x.swap(__y); }
12934d5abbe8Smrg#endif
12944d5abbe8Smrg
129548fb7bfaSmrg_GLIBCXX_END_NAMESPACE_VERSION
129648fb7bfaSmrg} // namespace
12974fee23f9Smrg
12984fee23f9Smrg#include <bits/fstream.tcc>
12994fee23f9Smrg
13004fee23f9Smrg#endif /* _GLIBCXX_FSTREAM */
1301