xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/std/fstream (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg// File based streams -*- C++ -*-
21debfc3dSmrg
3*8feb0f0bSmrg// Copyright (C) 1997-2020 Free Software Foundation, Inc.
41debfc3dSmrg//
51debfc3dSmrg// This file is part of the GNU ISO C++ Library.  This library is free
61debfc3dSmrg// software; you can redistribute it and/or modify it under the
71debfc3dSmrg// terms of the GNU General Public License as published by the
81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option)
91debfc3dSmrg// any later version.
101debfc3dSmrg
111debfc3dSmrg// This library is distributed in the hope that it will be useful,
121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of
131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141debfc3dSmrg// GNU General Public License for more details.
151debfc3dSmrg
161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional
171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version
181debfc3dSmrg// 3.1, as published by the Free Software Foundation.
191debfc3dSmrg
201debfc3dSmrg// You should have received a copy of the GNU General Public License and
211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program;
221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
231debfc3dSmrg// <http://www.gnu.org/licenses/>.
241debfc3dSmrg
251debfc3dSmrg/** @file include/fstream
261debfc3dSmrg *  This is a Standard C++ Library header.
271debfc3dSmrg */
281debfc3dSmrg
291debfc3dSmrg//
301debfc3dSmrg// ISO C++ 14882: 27.8  File-based streams
311debfc3dSmrg//
321debfc3dSmrg
331debfc3dSmrg#ifndef _GLIBCXX_FSTREAM
341debfc3dSmrg#define _GLIBCXX_FSTREAM 1
351debfc3dSmrg
361debfc3dSmrg#pragma GCC system_header
371debfc3dSmrg
381debfc3dSmrg#include <istream>
391debfc3dSmrg#include <ostream>
401debfc3dSmrg#include <bits/codecvt.h>
411debfc3dSmrg#include <cstdio>             // For BUFSIZ
421debfc3dSmrg#include <bits/basic_file.h>  // For __basic_file, __c_lock
431debfc3dSmrg#if __cplusplus >= 201103L
441debfc3dSmrg#include <string>             // For std::string overloads.
451debfc3dSmrg#endif
461debfc3dSmrg
471debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default)
481debfc3dSmrg{
491debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION
501debfc3dSmrg
51a2dc1f3fSmrg#if __cplusplus >= 201703L
52a2dc1f3fSmrg  // Enable if _Path is a filesystem::path or experimental::filesystem::path
53a2dc1f3fSmrg  template<typename _Path, typename _Result = _Path, typename _Path2
54a2dc1f3fSmrg	   = decltype(std::declval<_Path&>().make_preferred().filename())>
55a2dc1f3fSmrg    using _If_fs_path = enable_if_t<is_same_v<_Path, _Path2>, _Result>;
56a2dc1f3fSmrg#endif // C++17
57a2dc1f3fSmrg
58a2dc1f3fSmrg
591debfc3dSmrg  // [27.8.1.1] template class basic_filebuf
601debfc3dSmrg  /**
611debfc3dSmrg   *  @brief  The actual work of input and output (for files).
621debfc3dSmrg   *  @ingroup io
631debfc3dSmrg   *
641debfc3dSmrg   *  @tparam _CharT  Type of character stream.
651debfc3dSmrg   *  @tparam _Traits  Traits for character type, defaults to
661debfc3dSmrg   *                   char_traits<_CharT>.
671debfc3dSmrg   *
681debfc3dSmrg   *  This class associates both its input and output sequence with an
691debfc3dSmrg   *  external disk file, and maintains a joint file position for both
701debfc3dSmrg   *  sequences.  Many of its semantics are described in terms of similar
711debfc3dSmrg   *  behavior in the Standard C Library's @c FILE streams.
721debfc3dSmrg   *
731debfc3dSmrg   *  Requirements on traits_type, specific to this class:
741debfc3dSmrg   *  - traits_type::pos_type must be fpos<traits_type::state_type>
751debfc3dSmrg   *  - traits_type::off_type must be streamoff
761debfc3dSmrg   *  - traits_type::state_type must be Assignable and DefaultConstructible,
771debfc3dSmrg   *  - traits_type::state_type() must be the initial state for codecvt.
781debfc3dSmrg   */
791debfc3dSmrg  template<typename _CharT, typename _Traits>
801debfc3dSmrg    class basic_filebuf : public basic_streambuf<_CharT, _Traits>
811debfc3dSmrg    {
821debfc3dSmrg#if __cplusplus >= 201103L
831debfc3dSmrg      template<typename _Tp>
841debfc3dSmrg	using __chk_state = __and_<is_copy_assignable<_Tp>,
851debfc3dSmrg				   is_copy_constructible<_Tp>,
861debfc3dSmrg				   is_default_constructible<_Tp>>;
871debfc3dSmrg
881debfc3dSmrg      static_assert(__chk_state<typename _Traits::state_type>::value,
891debfc3dSmrg		    "state_type must be CopyAssignable, CopyConstructible"
901debfc3dSmrg		    " and DefaultConstructible");
911debfc3dSmrg
921debfc3dSmrg      static_assert(is_same<typename _Traits::pos_type,
931debfc3dSmrg			    fpos<typename _Traits::state_type>>::value,
941debfc3dSmrg		    "pos_type must be fpos<state_type>");
951debfc3dSmrg#endif
961debfc3dSmrg    public:
971debfc3dSmrg      // Types:
981debfc3dSmrg      typedef _CharT                     	        char_type;
991debfc3dSmrg      typedef _Traits                    	        traits_type;
1001debfc3dSmrg      typedef typename traits_type::int_type 		int_type;
1011debfc3dSmrg      typedef typename traits_type::pos_type 		pos_type;
1021debfc3dSmrg      typedef typename traits_type::off_type 		off_type;
1031debfc3dSmrg
1041debfc3dSmrg      typedef basic_streambuf<char_type, traits_type>  	__streambuf_type;
1051debfc3dSmrg      typedef basic_filebuf<char_type, traits_type>     __filebuf_type;
1061debfc3dSmrg      typedef __basic_file<char>		        __file_type;
1071debfc3dSmrg      typedef typename traits_type::state_type          __state_type;
1081debfc3dSmrg      typedef codecvt<char_type, char, __state_type>    __codecvt_type;
1091debfc3dSmrg
1101debfc3dSmrg      friend class ios_base; // For sync_with_stdio.
1111debfc3dSmrg
1121debfc3dSmrg    protected:
1131debfc3dSmrg      // Data Members:
1141debfc3dSmrg      // MT lock inherited from libio or other low-level io library.
1151debfc3dSmrg      __c_lock          	_M_lock;
1161debfc3dSmrg
1171debfc3dSmrg      // External buffer.
1181debfc3dSmrg      __file_type 		_M_file;
1191debfc3dSmrg
1201debfc3dSmrg      /// Place to stash in || out || in | out settings for current filebuf.
1211debfc3dSmrg      ios_base::openmode 	_M_mode;
1221debfc3dSmrg
1231debfc3dSmrg      // Beginning state type for codecvt.
1241debfc3dSmrg      __state_type 		_M_state_beg;
1251debfc3dSmrg
1261debfc3dSmrg      // During output, the state that corresponds to pptr(),
1271debfc3dSmrg      // during input, the state that corresponds to egptr() and
1281debfc3dSmrg      // _M_ext_next.
1291debfc3dSmrg      __state_type		_M_state_cur;
1301debfc3dSmrg
1311debfc3dSmrg      // Not used for output. During input, the state that corresponds
1321debfc3dSmrg      // to eback() and _M_ext_buf.
1331debfc3dSmrg      __state_type		_M_state_last;
1341debfc3dSmrg
1351debfc3dSmrg      /// Pointer to the beginning of internal buffer.
1361debfc3dSmrg      char_type*		_M_buf;
1371debfc3dSmrg
1381debfc3dSmrg      /**
1391debfc3dSmrg       *  Actual size of internal buffer. This number is equal to the size
1401debfc3dSmrg       *  of the put area + 1 position, reserved for the overflow char of
1411debfc3dSmrg       *  a full area.
1421debfc3dSmrg       */
1431debfc3dSmrg      size_t			_M_buf_size;
1441debfc3dSmrg
1451debfc3dSmrg      // Set iff _M_buf is allocated memory from _M_allocate_internal_buffer.
1461debfc3dSmrg      bool			_M_buf_allocated;
1471debfc3dSmrg
1481debfc3dSmrg      /**
1491debfc3dSmrg       *  _M_reading == false && _M_writing == false for @b uncommitted mode;
1501debfc3dSmrg       *  _M_reading == true for @b read mode;
1511debfc3dSmrg       *  _M_writing == true for @b write mode;
1521debfc3dSmrg       *
1531debfc3dSmrg       *  NB: _M_reading == true && _M_writing == true is unused.
1541debfc3dSmrg       */
1551debfc3dSmrg      bool                      _M_reading;
1561debfc3dSmrg      bool                      _M_writing;
1571debfc3dSmrg
158*8feb0f0bSmrg      ///@{
1591debfc3dSmrg      /**
1601debfc3dSmrg       *  Necessary bits for putback buffer management.
1611debfc3dSmrg       *
1621debfc3dSmrg       *  @note pbacks of over one character are not currently supported.
1631debfc3dSmrg       */
1641debfc3dSmrg      char_type			_M_pback;
1651debfc3dSmrg      char_type*		_M_pback_cur_save;
1661debfc3dSmrg      char_type*		_M_pback_end_save;
1671debfc3dSmrg      bool			_M_pback_init;
168*8feb0f0bSmrg      ///@}
1691debfc3dSmrg
1701debfc3dSmrg      // Cached codecvt facet.
1711debfc3dSmrg      const __codecvt_type* 	_M_codecvt;
1721debfc3dSmrg
1731debfc3dSmrg      /**
1741debfc3dSmrg       *  Buffer for external characters. Used for input when
1751debfc3dSmrg       *  codecvt::always_noconv() == false. When valid, this corresponds
1761debfc3dSmrg       *  to eback().
1771debfc3dSmrg       */
1781debfc3dSmrg      char*			_M_ext_buf;
1791debfc3dSmrg
1801debfc3dSmrg      /**
1811debfc3dSmrg       *  Size of buffer held by _M_ext_buf.
1821debfc3dSmrg       */
1831debfc3dSmrg      streamsize		_M_ext_buf_size;
1841debfc3dSmrg
1851debfc3dSmrg      /**
1861debfc3dSmrg       *  Pointers into the buffer held by _M_ext_buf that delimit a
1871debfc3dSmrg       *  subsequence of bytes that have been read but not yet converted.
1881debfc3dSmrg       *  When valid, _M_ext_next corresponds to egptr().
1891debfc3dSmrg       */
1901debfc3dSmrg      const char*		_M_ext_next;
1911debfc3dSmrg      char*			_M_ext_end;
1921debfc3dSmrg
1931debfc3dSmrg      /**
1941debfc3dSmrg       *  Initializes pback buffers, and moves normal buffers to safety.
1951debfc3dSmrg       *  Assumptions:
1961debfc3dSmrg       *  _M_in_cur has already been moved back
1971debfc3dSmrg       */
1981debfc3dSmrg      void
1991debfc3dSmrg      _M_create_pback()
2001debfc3dSmrg      {
2011debfc3dSmrg	if (!_M_pback_init)
2021debfc3dSmrg	  {
2031debfc3dSmrg	    _M_pback_cur_save = this->gptr();
2041debfc3dSmrg	    _M_pback_end_save = this->egptr();
2051debfc3dSmrg	    this->setg(&_M_pback, &_M_pback, &_M_pback + 1);
2061debfc3dSmrg	    _M_pback_init = true;
2071debfc3dSmrg	  }
2081debfc3dSmrg      }
2091debfc3dSmrg
2101debfc3dSmrg      /**
2111debfc3dSmrg       *  Deactivates pback buffer contents, and restores normal buffer.
2121debfc3dSmrg       *  Assumptions:
2131debfc3dSmrg       *  The pback buffer has only moved forward.
2141debfc3dSmrg       */
2151debfc3dSmrg      void
2161debfc3dSmrg      _M_destroy_pback() throw()
2171debfc3dSmrg      {
2181debfc3dSmrg	if (_M_pback_init)
2191debfc3dSmrg	  {
2201debfc3dSmrg	    // Length _M_in_cur moved in the pback buffer.
2211debfc3dSmrg	    _M_pback_cur_save += this->gptr() != this->eback();
2221debfc3dSmrg	    this->setg(_M_buf, _M_pback_cur_save, _M_pback_end_save);
2231debfc3dSmrg	    _M_pback_init = false;
2241debfc3dSmrg	  }
2251debfc3dSmrg      }
2261debfc3dSmrg
2271debfc3dSmrg    public:
2281debfc3dSmrg      // Constructors/destructor:
2291debfc3dSmrg      /**
2301debfc3dSmrg       *  @brief  Does not open any files.
2311debfc3dSmrg       *
2321debfc3dSmrg       *  The default constructor initializes the parent class using its
2331debfc3dSmrg       *  own default ctor.
2341debfc3dSmrg       */
2351debfc3dSmrg      basic_filebuf();
2361debfc3dSmrg
2371debfc3dSmrg#if __cplusplus >= 201103L
2381debfc3dSmrg      basic_filebuf(const basic_filebuf&) = delete;
2391debfc3dSmrg      basic_filebuf(basic_filebuf&&);
2401debfc3dSmrg#endif
2411debfc3dSmrg
2421debfc3dSmrg      /**
2431debfc3dSmrg       *  @brief  The destructor closes the file first.
2441debfc3dSmrg       */
2451debfc3dSmrg      virtual
2461debfc3dSmrg      ~basic_filebuf()
247c0a68be4Smrg      {
248c0a68be4Smrg	__try
2491debfc3dSmrg	  { this->close(); }
250c0a68be4Smrg	__catch(...)
251c0a68be4Smrg	  { }
252c0a68be4Smrg      }
2531debfc3dSmrg
2541debfc3dSmrg#if __cplusplus >= 201103L
2551debfc3dSmrg      basic_filebuf& operator=(const basic_filebuf&) = delete;
2561debfc3dSmrg      basic_filebuf& operator=(basic_filebuf&&);
2571debfc3dSmrg      void swap(basic_filebuf&);
2581debfc3dSmrg#endif
2591debfc3dSmrg
2601debfc3dSmrg      // Members:
2611debfc3dSmrg      /**
2621debfc3dSmrg       *  @brief  Returns true if the external file is open.
2631debfc3dSmrg       */
2641debfc3dSmrg      bool
2651debfc3dSmrg      is_open() const throw()
2661debfc3dSmrg      { return _M_file.is_open(); }
2671debfc3dSmrg
2681debfc3dSmrg      /**
2691debfc3dSmrg       *  @brief  Opens an external file.
2701debfc3dSmrg       *  @param  __s  The name of the file.
2711debfc3dSmrg       *  @param  __mode  The open mode flags.
2721debfc3dSmrg       *  @return  @c this on success, NULL on failure
2731debfc3dSmrg       *
2741debfc3dSmrg       *  If a file is already open, this function immediately fails.
2751debfc3dSmrg       *  Otherwise it tries to open the file named @a __s using the flags
2761debfc3dSmrg       *  given in @a __mode.
2771debfc3dSmrg       *
2781debfc3dSmrg       *  Table 92, adapted here, gives the relation between openmode
2791debfc3dSmrg       *  combinations and the equivalent @c fopen() flags.
2801debfc3dSmrg       *  (NB: lines app, in|out|app, in|app, binary|app, binary|in|out|app,
2811debfc3dSmrg       *  and binary|in|app per DR 596)
2821debfc3dSmrg       *  <pre>
2831debfc3dSmrg       *  +---------------------------------------------------------+
2841debfc3dSmrg       *  | ios_base Flag combination            stdio equivalent   |
2851debfc3dSmrg       *  |binary  in  out  trunc  app                              |
2861debfc3dSmrg       *  +---------------------------------------------------------+
2871debfc3dSmrg       *  |             +                        w                  |
2881debfc3dSmrg       *  |             +           +            a                  |
2891debfc3dSmrg       *  |                         +            a                  |
2901debfc3dSmrg       *  |             +     +                  w                  |
2911debfc3dSmrg       *  |         +                            r                  |
2921debfc3dSmrg       *  |         +   +                        r+                 |
2931debfc3dSmrg       *  |         +   +     +                  w+                 |
2941debfc3dSmrg       *  |         +   +           +            a+                 |
2951debfc3dSmrg       *  |         +               +            a+                 |
2961debfc3dSmrg       *  +---------------------------------------------------------+
2971debfc3dSmrg       *  |   +         +                        wb                 |
2981debfc3dSmrg       *  |   +         +           +            ab                 |
2991debfc3dSmrg       *  |   +                     +            ab                 |
3001debfc3dSmrg       *  |   +         +     +                  wb                 |
3011debfc3dSmrg       *  |   +     +                            rb                 |
3021debfc3dSmrg       *  |   +     +   +                        r+b                |
3031debfc3dSmrg       *  |   +     +   +     +                  w+b                |
3041debfc3dSmrg       *  |   +     +   +           +            a+b                |
3051debfc3dSmrg       *  |   +     +               +            a+b                |
3061debfc3dSmrg       *  +---------------------------------------------------------+
3071debfc3dSmrg       *  </pre>
3081debfc3dSmrg       */
3091debfc3dSmrg      __filebuf_type*
3101debfc3dSmrg      open(const char* __s, ios_base::openmode __mode);
3111debfc3dSmrg
312c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
313c0a68be4Smrg      /**
314c0a68be4Smrg       *  @brief  Opens an external file.
315c0a68be4Smrg       *  @param  __s  The name of the file, as a wide character string.
316c0a68be4Smrg       *  @param  __mode  The open mode flags.
317c0a68be4Smrg       *  @return  @c this on success, NULL on failure
318c0a68be4Smrg       */
319c0a68be4Smrg      __filebuf_type*
320c0a68be4Smrg      open(const wchar_t* __s, ios_base::openmode __mode);
321c0a68be4Smrg#endif
322c0a68be4Smrg
3231debfc3dSmrg#if __cplusplus >= 201103L
3241debfc3dSmrg      /**
3251debfc3dSmrg       *  @brief  Opens an external file.
3261debfc3dSmrg       *  @param  __s  The name of the file.
3271debfc3dSmrg       *  @param  __mode  The open mode flags.
3281debfc3dSmrg       *  @return  @c this on success, NULL on failure
3291debfc3dSmrg       */
3301debfc3dSmrg      __filebuf_type*
3311debfc3dSmrg      open(const std::string& __s, ios_base::openmode __mode)
3321debfc3dSmrg      { return open(__s.c_str(), __mode); }
333a2dc1f3fSmrg
334a2dc1f3fSmrg#if __cplusplus >= 201703L
335a2dc1f3fSmrg      /**
336a2dc1f3fSmrg       *  @brief  Opens an external file.
337a2dc1f3fSmrg       *  @param  __s  The name of the file, as a filesystem::path.
338a2dc1f3fSmrg       *  @param  __mode  The open mode flags.
339a2dc1f3fSmrg       *  @return  @c this on success, NULL on failure
340a2dc1f3fSmrg       */
341a2dc1f3fSmrg      template<typename _Path>
342a2dc1f3fSmrg	_If_fs_path<_Path, __filebuf_type*>
343a2dc1f3fSmrg	open(const _Path& __s, ios_base::openmode __mode)
344a2dc1f3fSmrg	{ return open(__s.c_str(), __mode); }
345a2dc1f3fSmrg#endif // C++17
346a2dc1f3fSmrg#endif // C++11
3471debfc3dSmrg
3481debfc3dSmrg      /**
3491debfc3dSmrg       *  @brief  Closes the currently associated file.
3501debfc3dSmrg       *  @return  @c this on success, NULL on failure
3511debfc3dSmrg       *
3521debfc3dSmrg       *  If no file is currently open, this function immediately fails.
3531debfc3dSmrg       *
3541debfc3dSmrg       *  If a <em>put buffer area</em> exists, @c overflow(eof) is
3551debfc3dSmrg       *  called to flush all the characters.  The file is then
3561debfc3dSmrg       *  closed.
3571debfc3dSmrg       *
3581debfc3dSmrg       *  If any operations fail, this function also fails.
3591debfc3dSmrg       */
3601debfc3dSmrg      __filebuf_type*
3611debfc3dSmrg      close();
3621debfc3dSmrg
3631debfc3dSmrg    protected:
3641debfc3dSmrg      void
3651debfc3dSmrg      _M_allocate_internal_buffer();
3661debfc3dSmrg
3671debfc3dSmrg      void
3681debfc3dSmrg      _M_destroy_internal_buffer() throw();
3691debfc3dSmrg
3701debfc3dSmrg      // [27.8.1.4] overridden virtual functions
3711debfc3dSmrg      virtual streamsize
3721debfc3dSmrg      showmanyc();
3731debfc3dSmrg
3741debfc3dSmrg      // Stroustrup, 1998, p. 628
3751debfc3dSmrg      // underflow() and uflow() functions are called to get the next
3761debfc3dSmrg      // character from the real input source when the buffer is empty.
3771debfc3dSmrg      // Buffered input uses underflow()
3781debfc3dSmrg
3791debfc3dSmrg      virtual int_type
3801debfc3dSmrg      underflow();
3811debfc3dSmrg
3821debfc3dSmrg      virtual int_type
3831debfc3dSmrg      pbackfail(int_type __c = _Traits::eof());
3841debfc3dSmrg
3851debfc3dSmrg      // Stroustrup, 1998, p 648
3861debfc3dSmrg      // The overflow() function is called to transfer characters to the
3871debfc3dSmrg      // real output destination when the buffer is full. A call to
3881debfc3dSmrg      // overflow(c) outputs the contents of the buffer plus the
3891debfc3dSmrg      // character c.
3901debfc3dSmrg      // 27.5.2.4.5
3911debfc3dSmrg      // Consume some sequence of the characters in the pending sequence.
3921debfc3dSmrg      virtual int_type
3931debfc3dSmrg      overflow(int_type __c = _Traits::eof());
3941debfc3dSmrg
3951debfc3dSmrg      // Convert internal byte sequence to external, char-based
3961debfc3dSmrg      // sequence via codecvt.
3971debfc3dSmrg      bool
3981debfc3dSmrg      _M_convert_to_external(char_type*, streamsize);
3991debfc3dSmrg
4001debfc3dSmrg      /**
4011debfc3dSmrg       *  @brief  Manipulates the buffer.
4021debfc3dSmrg       *  @param  __s  Pointer to a buffer area.
4031debfc3dSmrg       *  @param  __n  Size of @a __s.
4041debfc3dSmrg       *  @return  @c this
4051debfc3dSmrg       *
4061debfc3dSmrg       *  If no file has been opened, and both @a __s and @a __n are zero, then
4071debfc3dSmrg       *  the stream becomes unbuffered.  Otherwise, @c __s is used as a
4081debfc3dSmrg       *  buffer; see
4091debfc3dSmrg       *  https://gcc.gnu.org/onlinedocs/libstdc++/manual/streambufs.html#io.streambuf.buffering
4101debfc3dSmrg       *  for more.
4111debfc3dSmrg       */
4121debfc3dSmrg      virtual __streambuf_type*
4131debfc3dSmrg      setbuf(char_type* __s, streamsize __n);
4141debfc3dSmrg
4151debfc3dSmrg      virtual pos_type
4161debfc3dSmrg      seekoff(off_type __off, ios_base::seekdir __way,
4171debfc3dSmrg	      ios_base::openmode __mode = ios_base::in | ios_base::out);
4181debfc3dSmrg
4191debfc3dSmrg      virtual pos_type
4201debfc3dSmrg      seekpos(pos_type __pos,
4211debfc3dSmrg	      ios_base::openmode __mode = ios_base::in | ios_base::out);
4221debfc3dSmrg
4231debfc3dSmrg      // Common code for seekoff, seekpos, and overflow
4241debfc3dSmrg      pos_type
4251debfc3dSmrg      _M_seek(off_type __off, ios_base::seekdir __way, __state_type __state);
4261debfc3dSmrg
4271debfc3dSmrg      int
4281debfc3dSmrg      _M_get_ext_pos(__state_type &__state);
4291debfc3dSmrg
4301debfc3dSmrg      virtual int
4311debfc3dSmrg      sync();
4321debfc3dSmrg
4331debfc3dSmrg      virtual void
4341debfc3dSmrg      imbue(const locale& __loc);
4351debfc3dSmrg
4361debfc3dSmrg      virtual streamsize
4371debfc3dSmrg      xsgetn(char_type* __s, streamsize __n);
4381debfc3dSmrg
4391debfc3dSmrg      virtual streamsize
4401debfc3dSmrg      xsputn(const char_type* __s, streamsize __n);
4411debfc3dSmrg
4421debfc3dSmrg      // Flushes output buffer, then writes unshift sequence.
4431debfc3dSmrg      bool
4441debfc3dSmrg      _M_terminate_output();
4451debfc3dSmrg
4461debfc3dSmrg      /**
4471debfc3dSmrg       *  This function sets the pointers of the internal buffer, both get
4481debfc3dSmrg       *  and put areas. Typically:
4491debfc3dSmrg       *
4501debfc3dSmrg       *   __off == egptr() - eback() upon underflow/uflow (@b read mode);
4511debfc3dSmrg       *   __off == 0 upon overflow (@b write mode);
4521debfc3dSmrg       *   __off == -1 upon open, setbuf, seekoff/pos (@b uncommitted mode).
4531debfc3dSmrg       *
4541debfc3dSmrg       *  NB: epptr() - pbase() == _M_buf_size - 1, since _M_buf_size
4551debfc3dSmrg       *  reflects the actual allocated memory and the last cell is reserved
4561debfc3dSmrg       *  for the overflow char of a full put area.
4571debfc3dSmrg       */
4581debfc3dSmrg      void
4591debfc3dSmrg      _M_set_buffer(streamsize __off)
4601debfc3dSmrg      {
4611debfc3dSmrg	const bool __testin = _M_mode & ios_base::in;
4621debfc3dSmrg	const bool __testout = (_M_mode & ios_base::out
4631debfc3dSmrg				|| _M_mode & ios_base::app);
4641debfc3dSmrg
4651debfc3dSmrg	if (__testin && __off > 0)
4661debfc3dSmrg	  this->setg(_M_buf, _M_buf, _M_buf + __off);
4671debfc3dSmrg	else
4681debfc3dSmrg	  this->setg(_M_buf, _M_buf, _M_buf);
4691debfc3dSmrg
4701debfc3dSmrg	if (__testout && __off == 0 && _M_buf_size > 1 )
4711debfc3dSmrg	  this->setp(_M_buf, _M_buf + _M_buf_size - 1);
4721debfc3dSmrg	else
4731debfc3dSmrg	  this->setp(0, 0);
4741debfc3dSmrg      }
4751debfc3dSmrg    };
4761debfc3dSmrg
4771debfc3dSmrg  // [27.8.1.5] Template class basic_ifstream
4781debfc3dSmrg  /**
4791debfc3dSmrg   *  @brief  Controlling input for files.
4801debfc3dSmrg   *  @ingroup io
4811debfc3dSmrg   *
4821debfc3dSmrg   *  @tparam _CharT  Type of character stream.
4831debfc3dSmrg   *  @tparam _Traits  Traits for character type, defaults to
4841debfc3dSmrg   *                   char_traits<_CharT>.
4851debfc3dSmrg   *
4861debfc3dSmrg   *  This class supports reading from named files, using the inherited
4871debfc3dSmrg   *  functions from std::basic_istream.  To control the associated
4881debfc3dSmrg   *  sequence, an instance of std::basic_filebuf is used, which this page
4891debfc3dSmrg   *  refers to as @c sb.
4901debfc3dSmrg   */
4911debfc3dSmrg  template<typename _CharT, typename _Traits>
4921debfc3dSmrg    class basic_ifstream : public basic_istream<_CharT, _Traits>
4931debfc3dSmrg    {
4941debfc3dSmrg    public:
4951debfc3dSmrg      // Types:
4961debfc3dSmrg      typedef _CharT 					char_type;
4971debfc3dSmrg      typedef _Traits 					traits_type;
4981debfc3dSmrg      typedef typename traits_type::int_type 		int_type;
4991debfc3dSmrg      typedef typename traits_type::pos_type 		pos_type;
5001debfc3dSmrg      typedef typename traits_type::off_type 		off_type;
5011debfc3dSmrg
5021debfc3dSmrg      // Non-standard types:
5031debfc3dSmrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
5041debfc3dSmrg      typedef basic_istream<char_type, traits_type>	__istream_type;
5051debfc3dSmrg
5061debfc3dSmrg    private:
5071debfc3dSmrg      __filebuf_type	_M_filebuf;
5081debfc3dSmrg
5091debfc3dSmrg    public:
5101debfc3dSmrg      // Constructors/Destructors:
5111debfc3dSmrg      /**
5121debfc3dSmrg       *  @brief  Default constructor.
5131debfc3dSmrg       *
5141debfc3dSmrg       *  Initializes @c sb using its default constructor, and passes
5151debfc3dSmrg       *  @c &sb to the base class initializer.  Does not open any files
5161debfc3dSmrg       *  (you haven't given it a filename to open).
5171debfc3dSmrg       */
5181debfc3dSmrg      basic_ifstream() : __istream_type(), _M_filebuf()
5191debfc3dSmrg      { this->init(&_M_filebuf); }
5201debfc3dSmrg
5211debfc3dSmrg      /**
5221debfc3dSmrg       *  @brief  Create an input file stream.
5231debfc3dSmrg       *  @param  __s  Null terminated string specifying the filename.
5241debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
5251debfc3dSmrg       *
5261debfc3dSmrg       *  @c ios_base::in is automatically included in @a __mode.
5271debfc3dSmrg       */
5281debfc3dSmrg      explicit
5291debfc3dSmrg      basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in)
5301debfc3dSmrg      : __istream_type(), _M_filebuf()
5311debfc3dSmrg      {
5321debfc3dSmrg	this->init(&_M_filebuf);
5331debfc3dSmrg	this->open(__s, __mode);
5341debfc3dSmrg      }
5351debfc3dSmrg
536c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
537c0a68be4Smrg      /**
538c0a68be4Smrg       *  @param  Create an input file stream.
539c0a68be4Smrg       *  @param  __s  Wide string specifying the filename.
540c0a68be4Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
541c0a68be4Smrg       *
542c0a68be4Smrg       *  @c ios_base::in is automatically included in @a __mode.
543c0a68be4Smrg       */
544c0a68be4Smrg      basic_ifstream(const wchar_t* __s,
545c0a68be4Smrg		     ios_base::openmode __mode = ios_base::in)
546c0a68be4Smrg      : __istream_type(), _M_filebuf()
547c0a68be4Smrg      {
548c0a68be4Smrg	this->init(&_M_filebuf);
549c0a68be4Smrg	this->open(__s, __mode);
550c0a68be4Smrg      }
551c0a68be4Smrg#endif
552c0a68be4Smrg
5531debfc3dSmrg#if __cplusplus >= 201103L
5541debfc3dSmrg      /**
5551debfc3dSmrg       *  @brief  Create an input file stream.
5561debfc3dSmrg       *  @param  __s  std::string specifying the filename.
5571debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
5581debfc3dSmrg       *
5591debfc3dSmrg       *  @c ios_base::in is automatically included in @a __mode.
5601debfc3dSmrg       */
5611debfc3dSmrg      explicit
5621debfc3dSmrg      basic_ifstream(const std::string& __s,
5631debfc3dSmrg		     ios_base::openmode __mode = ios_base::in)
5641debfc3dSmrg      : __istream_type(), _M_filebuf()
5651debfc3dSmrg      {
5661debfc3dSmrg	this->init(&_M_filebuf);
5671debfc3dSmrg	this->open(__s, __mode);
5681debfc3dSmrg      }
5691debfc3dSmrg
570a2dc1f3fSmrg#if __cplusplus >= 201703L
571a2dc1f3fSmrg      /**
572*8feb0f0bSmrg       *  @brief  Create an input file stream.
573a2dc1f3fSmrg       *  @param  __s  filesystem::path specifying the filename.
574a2dc1f3fSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
575a2dc1f3fSmrg       *
576a2dc1f3fSmrg       *  @c ios_base::in is automatically included in @a __mode.
577a2dc1f3fSmrg       */
578a2dc1f3fSmrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
579a2dc1f3fSmrg	basic_ifstream(const _Path& __s,
580a2dc1f3fSmrg		       ios_base::openmode __mode = ios_base::in)
581a2dc1f3fSmrg	: basic_ifstream(__s.c_str(), __mode)
582a2dc1f3fSmrg	{ }
583a2dc1f3fSmrg#endif // C++17
584a2dc1f3fSmrg
5851debfc3dSmrg      basic_ifstream(const basic_ifstream&) = delete;
5861debfc3dSmrg
5871debfc3dSmrg      basic_ifstream(basic_ifstream&& __rhs)
5881debfc3dSmrg      : __istream_type(std::move(__rhs)),
5891debfc3dSmrg      _M_filebuf(std::move(__rhs._M_filebuf))
5901debfc3dSmrg      { __istream_type::set_rdbuf(&_M_filebuf); }
591a2dc1f3fSmrg#endif // C++11
5921debfc3dSmrg
5931debfc3dSmrg      /**
5941debfc3dSmrg       *  @brief  The destructor does nothing.
5951debfc3dSmrg       *
5961debfc3dSmrg       *  The file is closed by the filebuf object, not the formatting
5971debfc3dSmrg       *  stream.
5981debfc3dSmrg       */
5991debfc3dSmrg      ~basic_ifstream()
6001debfc3dSmrg      { }
6011debfc3dSmrg
6021debfc3dSmrg#if __cplusplus >= 201103L
6031debfc3dSmrg      // 27.8.3.2 Assign and swap:
6041debfc3dSmrg
6051debfc3dSmrg      basic_ifstream&
6061debfc3dSmrg      operator=(const basic_ifstream&) = delete;
6071debfc3dSmrg
6081debfc3dSmrg      basic_ifstream&
6091debfc3dSmrg      operator=(basic_ifstream&& __rhs)
6101debfc3dSmrg      {
6111debfc3dSmrg	__istream_type::operator=(std::move(__rhs));
6121debfc3dSmrg	_M_filebuf = std::move(__rhs._M_filebuf);
6131debfc3dSmrg	return *this;
6141debfc3dSmrg      }
6151debfc3dSmrg
6161debfc3dSmrg      void
6171debfc3dSmrg      swap(basic_ifstream& __rhs)
6181debfc3dSmrg      {
6191debfc3dSmrg	__istream_type::swap(__rhs);
6201debfc3dSmrg	_M_filebuf.swap(__rhs._M_filebuf);
6211debfc3dSmrg      }
6221debfc3dSmrg#endif
6231debfc3dSmrg
6241debfc3dSmrg      // Members:
6251debfc3dSmrg      /**
6261debfc3dSmrg       *  @brief  Accessing the underlying buffer.
6271debfc3dSmrg       *  @return  The current basic_filebuf buffer.
6281debfc3dSmrg       *
6291debfc3dSmrg       *  This hides both signatures of std::basic_ios::rdbuf().
6301debfc3dSmrg       */
6311debfc3dSmrg      __filebuf_type*
6321debfc3dSmrg      rdbuf() const
6331debfc3dSmrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
6341debfc3dSmrg
6351debfc3dSmrg      /**
6361debfc3dSmrg       *  @brief  Wrapper to test for an open file.
6371debfc3dSmrg       *  @return  @c rdbuf()->is_open()
6381debfc3dSmrg       */
6391debfc3dSmrg      bool
6401debfc3dSmrg      is_open()
6411debfc3dSmrg      { return _M_filebuf.is_open(); }
6421debfc3dSmrg
6431debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
6441debfc3dSmrg      // 365. Lack of const-qualification in clause 27
6451debfc3dSmrg      bool
6461debfc3dSmrg      is_open() const
6471debfc3dSmrg      { return _M_filebuf.is_open(); }
6481debfc3dSmrg
6491debfc3dSmrg      /**
6501debfc3dSmrg       *  @brief  Opens an external file.
6511debfc3dSmrg       *  @param  __s  The name of the file.
6521debfc3dSmrg       *  @param  __mode  The open mode flags.
6531debfc3dSmrg       *
6541debfc3dSmrg       *  Calls @c std::basic_filebuf::open(s,__mode|in).  If that function
6551debfc3dSmrg       *  fails, @c failbit is set in the stream's error state.
6561debfc3dSmrg       */
6571debfc3dSmrg      void
6581debfc3dSmrg      open(const char* __s, ios_base::openmode __mode = ios_base::in)
6591debfc3dSmrg      {
6601debfc3dSmrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
6611debfc3dSmrg	  this->setstate(ios_base::failbit);
6621debfc3dSmrg	else
6631debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
6641debfc3dSmrg	  // 409. Closing an fstream should clear error state
6651debfc3dSmrg	  this->clear();
6661debfc3dSmrg      }
6671debfc3dSmrg
668c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
669c0a68be4Smrg      /**
670c0a68be4Smrg       *  @brief  Opens an external file.
671c0a68be4Smrg       *  @param  __s  The name of the file, as a wide character string.
672c0a68be4Smrg       *  @param  __mode  The open mode flags.
673c0a68be4Smrg       *
674c0a68be4Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
675c0a68be4Smrg       *  fails, @c failbit is set in the stream's error state.
676c0a68be4Smrg       */
677c0a68be4Smrg      void
678c0a68be4Smrg      open(const wchar_t* __s, ios_base::openmode __mode = ios_base::in)
679c0a68be4Smrg      {
680c0a68be4Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
681c0a68be4Smrg	  this->setstate(ios_base::failbit);
682c0a68be4Smrg	else
683c0a68be4Smrg	  this->clear();
684c0a68be4Smrg      }
685c0a68be4Smrg#endif
686c0a68be4Smrg
6871debfc3dSmrg#if __cplusplus >= 201103L
6881debfc3dSmrg      /**
6891debfc3dSmrg       *  @brief  Opens an external file.
6901debfc3dSmrg       *  @param  __s  The name of the file.
6911debfc3dSmrg       *  @param  __mode  The open mode flags.
6921debfc3dSmrg       *
6931debfc3dSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
6941debfc3dSmrg       *  fails, @c failbit is set in the stream's error state.
6951debfc3dSmrg       */
6961debfc3dSmrg      void
6971debfc3dSmrg      open(const std::string& __s, ios_base::openmode __mode = ios_base::in)
6981debfc3dSmrg      {
6991debfc3dSmrg	if (!_M_filebuf.open(__s, __mode | ios_base::in))
7001debfc3dSmrg	  this->setstate(ios_base::failbit);
7011debfc3dSmrg	else
7021debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
7031debfc3dSmrg	  // 409. Closing an fstream should clear error state
7041debfc3dSmrg	  this->clear();
7051debfc3dSmrg      }
706a2dc1f3fSmrg
707a2dc1f3fSmrg#if __cplusplus >= 201703L
708a2dc1f3fSmrg      /**
709a2dc1f3fSmrg       *  @brief  Opens an external file.
710a2dc1f3fSmrg       *  @param  __s  The name of the file, as a filesystem::path.
711a2dc1f3fSmrg       *  @param  __mode  The open mode flags.
712a2dc1f3fSmrg       *
713a2dc1f3fSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode|in).  If that function
714a2dc1f3fSmrg       *  fails, @c failbit is set in the stream's error state.
715a2dc1f3fSmrg       */
716a2dc1f3fSmrg      template<typename _Path>
717a2dc1f3fSmrg	_If_fs_path<_Path, void>
718a2dc1f3fSmrg	open(const _Path& __s, ios_base::openmode __mode = ios_base::in)
719a2dc1f3fSmrg	{ open(__s.c_str(), __mode); }
720a2dc1f3fSmrg#endif // C++17
721a2dc1f3fSmrg#endif // C++11
7221debfc3dSmrg
7231debfc3dSmrg      /**
7241debfc3dSmrg       *  @brief  Close the file.
7251debfc3dSmrg       *
7261debfc3dSmrg       *  Calls @c std::basic_filebuf::close().  If that function
7271debfc3dSmrg       *  fails, @c failbit is set in the stream's error state.
7281debfc3dSmrg       */
7291debfc3dSmrg      void
7301debfc3dSmrg      close()
7311debfc3dSmrg      {
7321debfc3dSmrg	if (!_M_filebuf.close())
7331debfc3dSmrg	  this->setstate(ios_base::failbit);
7341debfc3dSmrg      }
7351debfc3dSmrg    };
7361debfc3dSmrg
7371debfc3dSmrg
7381debfc3dSmrg  // [27.8.1.8] Template class basic_ofstream
7391debfc3dSmrg  /**
7401debfc3dSmrg   *  @brief  Controlling output for files.
7411debfc3dSmrg   *  @ingroup io
7421debfc3dSmrg   *
7431debfc3dSmrg   *  @tparam _CharT  Type of character stream.
7441debfc3dSmrg   *  @tparam _Traits  Traits for character type, defaults to
7451debfc3dSmrg   *                   char_traits<_CharT>.
7461debfc3dSmrg   *
7471debfc3dSmrg   *  This class supports reading from named files, using the inherited
7481debfc3dSmrg   *  functions from std::basic_ostream.  To control the associated
7491debfc3dSmrg   *  sequence, an instance of std::basic_filebuf is used, which this page
7501debfc3dSmrg   *  refers to as @c sb.
7511debfc3dSmrg   */
7521debfc3dSmrg  template<typename _CharT, typename _Traits>
7531debfc3dSmrg    class basic_ofstream : public basic_ostream<_CharT,_Traits>
7541debfc3dSmrg    {
7551debfc3dSmrg    public:
7561debfc3dSmrg      // Types:
7571debfc3dSmrg      typedef _CharT 					char_type;
7581debfc3dSmrg      typedef _Traits 					traits_type;
7591debfc3dSmrg      typedef typename traits_type::int_type 		int_type;
7601debfc3dSmrg      typedef typename traits_type::pos_type 		pos_type;
7611debfc3dSmrg      typedef typename traits_type::off_type 		off_type;
7621debfc3dSmrg
7631debfc3dSmrg      // Non-standard types:
7641debfc3dSmrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
7651debfc3dSmrg      typedef basic_ostream<char_type, traits_type>	__ostream_type;
7661debfc3dSmrg
7671debfc3dSmrg    private:
7681debfc3dSmrg      __filebuf_type	_M_filebuf;
7691debfc3dSmrg
7701debfc3dSmrg    public:
7711debfc3dSmrg      // Constructors:
7721debfc3dSmrg      /**
7731debfc3dSmrg       *  @brief  Default constructor.
7741debfc3dSmrg       *
7751debfc3dSmrg       *  Initializes @c sb using its default constructor, and passes
7761debfc3dSmrg       *  @c &sb to the base class initializer.  Does not open any files
7771debfc3dSmrg       *  (you haven't given it a filename to open).
7781debfc3dSmrg       */
7791debfc3dSmrg      basic_ofstream(): __ostream_type(), _M_filebuf()
7801debfc3dSmrg      { this->init(&_M_filebuf); }
7811debfc3dSmrg
7821debfc3dSmrg      /**
7831debfc3dSmrg       *  @brief  Create an output file stream.
7841debfc3dSmrg       *  @param  __s  Null terminated string specifying the filename.
7851debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
7861debfc3dSmrg       *
787a2dc1f3fSmrg       *  @c ios_base::out is automatically included in @a __mode.
7881debfc3dSmrg       */
7891debfc3dSmrg      explicit
7901debfc3dSmrg      basic_ofstream(const char* __s,
791a2dc1f3fSmrg		     ios_base::openmode __mode = ios_base::out)
7921debfc3dSmrg      : __ostream_type(), _M_filebuf()
7931debfc3dSmrg      {
7941debfc3dSmrg	this->init(&_M_filebuf);
7951debfc3dSmrg	this->open(__s, __mode);
7961debfc3dSmrg      }
7971debfc3dSmrg
798c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
799c0a68be4Smrg      /**
800c0a68be4Smrg       *  @param  Create an output file stream.
801c0a68be4Smrg       *  @param  __s  Wide string specifying the filename.
802c0a68be4Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
803c0a68be4Smrg       *
804c0a68be4Smrg       *  @c ios_base::out | @c ios_base::trunc is automatically included in
805c0a68be4Smrg       *  @a __mode.
806c0a68be4Smrg       */
807c0a68be4Smrg      basic_ofstream(const wchar_t* __s,
808c0a68be4Smrg		     ios_base::openmode __mode = ios_base::out|ios_base::trunc)
809c0a68be4Smrg      : __ostream_type(), _M_filebuf()
810c0a68be4Smrg      {
811c0a68be4Smrg	this->init(&_M_filebuf);
812c0a68be4Smrg	this->open(__s, __mode);
813c0a68be4Smrg      }
814c0a68be4Smrg#endif
815c0a68be4Smrg
8161debfc3dSmrg#if __cplusplus >= 201103L
8171debfc3dSmrg      /**
8181debfc3dSmrg       *  @brief  Create an output file stream.
8191debfc3dSmrg       *  @param  __s  std::string specifying the filename.
8201debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
8211debfc3dSmrg       *
822a2dc1f3fSmrg       *  @c ios_base::out is automatically included in @a __mode.
8231debfc3dSmrg       */
8241debfc3dSmrg      explicit
8251debfc3dSmrg      basic_ofstream(const std::string& __s,
826a2dc1f3fSmrg		     ios_base::openmode __mode = ios_base::out)
8271debfc3dSmrg      : __ostream_type(), _M_filebuf()
8281debfc3dSmrg      {
8291debfc3dSmrg	this->init(&_M_filebuf);
8301debfc3dSmrg	this->open(__s, __mode);
8311debfc3dSmrg      }
8321debfc3dSmrg
833a2dc1f3fSmrg#if __cplusplus >= 201703L
834a2dc1f3fSmrg      /**
835*8feb0f0bSmrg       *  @brief  Create an output file stream.
836a2dc1f3fSmrg       *  @param  __s  filesystem::path specifying the filename.
837a2dc1f3fSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
838a2dc1f3fSmrg       *
839a2dc1f3fSmrg       *  @c ios_base::out is automatically included in @a __mode.
840a2dc1f3fSmrg       */
841a2dc1f3fSmrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
842a2dc1f3fSmrg	basic_ofstream(const _Path& __s,
843a2dc1f3fSmrg		       ios_base::openmode __mode = ios_base::out)
844a2dc1f3fSmrg	: basic_ofstream(__s.c_str(), __mode)
845a2dc1f3fSmrg	{ }
846a2dc1f3fSmrg#endif // C++17
847a2dc1f3fSmrg
8481debfc3dSmrg      basic_ofstream(const basic_ofstream&) = delete;
8491debfc3dSmrg
8501debfc3dSmrg      basic_ofstream(basic_ofstream&& __rhs)
8511debfc3dSmrg      : __ostream_type(std::move(__rhs)),
8521debfc3dSmrg      _M_filebuf(std::move(__rhs._M_filebuf))
8531debfc3dSmrg      { __ostream_type::set_rdbuf(&_M_filebuf); }
8541debfc3dSmrg#endif
8551debfc3dSmrg
8561debfc3dSmrg      /**
8571debfc3dSmrg       *  @brief  The destructor does nothing.
8581debfc3dSmrg       *
8591debfc3dSmrg       *  The file is closed by the filebuf object, not the formatting
8601debfc3dSmrg       *  stream.
8611debfc3dSmrg       */
8621debfc3dSmrg      ~basic_ofstream()
8631debfc3dSmrg      { }
8641debfc3dSmrg
8651debfc3dSmrg#if __cplusplus >= 201103L
8661debfc3dSmrg      // 27.8.3.2 Assign and swap:
8671debfc3dSmrg
8681debfc3dSmrg      basic_ofstream&
8691debfc3dSmrg      operator=(const basic_ofstream&) = delete;
8701debfc3dSmrg
8711debfc3dSmrg      basic_ofstream&
8721debfc3dSmrg      operator=(basic_ofstream&& __rhs)
8731debfc3dSmrg      {
8741debfc3dSmrg	__ostream_type::operator=(std::move(__rhs));
8751debfc3dSmrg	_M_filebuf = std::move(__rhs._M_filebuf);
8761debfc3dSmrg	return *this;
8771debfc3dSmrg      }
8781debfc3dSmrg
8791debfc3dSmrg      void
8801debfc3dSmrg      swap(basic_ofstream& __rhs)
8811debfc3dSmrg      {
8821debfc3dSmrg	__ostream_type::swap(__rhs);
8831debfc3dSmrg	_M_filebuf.swap(__rhs._M_filebuf);
8841debfc3dSmrg      }
8851debfc3dSmrg#endif
8861debfc3dSmrg
8871debfc3dSmrg      // Members:
8881debfc3dSmrg      /**
8891debfc3dSmrg       *  @brief  Accessing the underlying buffer.
8901debfc3dSmrg       *  @return  The current basic_filebuf buffer.
8911debfc3dSmrg       *
8921debfc3dSmrg       *  This hides both signatures of std::basic_ios::rdbuf().
8931debfc3dSmrg       */
8941debfc3dSmrg      __filebuf_type*
8951debfc3dSmrg      rdbuf() const
8961debfc3dSmrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
8971debfc3dSmrg
8981debfc3dSmrg      /**
8991debfc3dSmrg       *  @brief  Wrapper to test for an open file.
9001debfc3dSmrg       *  @return  @c rdbuf()->is_open()
9011debfc3dSmrg       */
9021debfc3dSmrg      bool
9031debfc3dSmrg      is_open()
9041debfc3dSmrg      { return _M_filebuf.is_open(); }
9051debfc3dSmrg
9061debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
9071debfc3dSmrg      // 365. Lack of const-qualification in clause 27
9081debfc3dSmrg      bool
9091debfc3dSmrg      is_open() const
9101debfc3dSmrg      { return _M_filebuf.is_open(); }
9111debfc3dSmrg
9121debfc3dSmrg      /**
9131debfc3dSmrg       *  @brief  Opens an external file.
9141debfc3dSmrg       *  @param  __s  The name of the file.
9151debfc3dSmrg       *  @param  __mode  The open mode flags.
9161debfc3dSmrg       *
917a2dc1f3fSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
9181debfc3dSmrg       *  function fails, @c failbit is set in the stream's error state.
9191debfc3dSmrg       */
9201debfc3dSmrg      void
921a2dc1f3fSmrg      open(const char* __s, ios_base::openmode __mode = ios_base::out)
9221debfc3dSmrg      {
9231debfc3dSmrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
9241debfc3dSmrg	  this->setstate(ios_base::failbit);
9251debfc3dSmrg	else
9261debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
9271debfc3dSmrg	  // 409. Closing an fstream should clear error state
9281debfc3dSmrg	  this->clear();
9291debfc3dSmrg      }
9301debfc3dSmrg
931c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
932c0a68be4Smrg      /**
933c0a68be4Smrg       *  @brief  Opens an external file.
934c0a68be4Smrg       *  @param  __s  The name of the file.
935c0a68be4Smrg       *  @param  __mode  The open mode flags.
936c0a68be4Smrg       *
937c0a68be4Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
938c0a68be4Smrg       *  function fails, @c failbit is set in the stream's error state.
939c0a68be4Smrg       */
940c0a68be4Smrg      void
941c0a68be4Smrg      open(const wchar_t* __s, ios_base::openmode __mode = ios_base::out)
942c0a68be4Smrg      {
943c0a68be4Smrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
944c0a68be4Smrg	  this->setstate(ios_base::failbit);
945c0a68be4Smrg	else
946c0a68be4Smrg	  this->clear();
947c0a68be4Smrg      }
948c0a68be4Smrg#endif
949c0a68be4Smrg
9501debfc3dSmrg#if __cplusplus >= 201103L
9511debfc3dSmrg      /**
9521debfc3dSmrg       *  @brief  Opens an external file.
9531debfc3dSmrg       *  @param  __s  The name of the file.
9541debfc3dSmrg       *  @param  __mode  The open mode flags.
9551debfc3dSmrg       *
956a2dc1f3fSmrg       *  Calls @c std::basic_filebuf::open(s,mode|out).  If that
9571debfc3dSmrg       *  function fails, @c failbit is set in the stream's error state.
9581debfc3dSmrg       */
9591debfc3dSmrg      void
960a2dc1f3fSmrg      open(const std::string& __s, ios_base::openmode __mode = ios_base::out)
9611debfc3dSmrg      {
9621debfc3dSmrg	if (!_M_filebuf.open(__s, __mode | ios_base::out))
9631debfc3dSmrg	  this->setstate(ios_base::failbit);
9641debfc3dSmrg	else
9651debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
9661debfc3dSmrg	  // 409. Closing an fstream should clear error state
9671debfc3dSmrg	  this->clear();
9681debfc3dSmrg      }
969a2dc1f3fSmrg
970a2dc1f3fSmrg#if __cplusplus >= 201703L
971a2dc1f3fSmrg      /**
972a2dc1f3fSmrg       *  @brief  Opens an external file.
973a2dc1f3fSmrg       *  @param  __s  The name of the file, as a filesystem::path.
974a2dc1f3fSmrg       *  @param  __mode  The open mode flags.
975a2dc1f3fSmrg       *
976a2dc1f3fSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode|out).  If that
977a2dc1f3fSmrg       *  function fails, @c failbit is set in the stream's error state.
978a2dc1f3fSmrg       */
979a2dc1f3fSmrg      template<typename _Path>
980a2dc1f3fSmrg	_If_fs_path<_Path, void>
981a2dc1f3fSmrg	open(const _Path& __s, ios_base::openmode __mode = ios_base::out)
982a2dc1f3fSmrg	{ open(__s.c_str(), __mode); }
983a2dc1f3fSmrg#endif // C++17
984a2dc1f3fSmrg#endif // C++11
9851debfc3dSmrg
9861debfc3dSmrg      /**
9871debfc3dSmrg       *  @brief  Close the file.
9881debfc3dSmrg       *
9891debfc3dSmrg       *  Calls @c std::basic_filebuf::close().  If that function
9901debfc3dSmrg       *  fails, @c failbit is set in the stream's error state.
9911debfc3dSmrg       */
9921debfc3dSmrg      void
9931debfc3dSmrg      close()
9941debfc3dSmrg      {
9951debfc3dSmrg	if (!_M_filebuf.close())
9961debfc3dSmrg	  this->setstate(ios_base::failbit);
9971debfc3dSmrg      }
9981debfc3dSmrg    };
9991debfc3dSmrg
10001debfc3dSmrg
10011debfc3dSmrg  // [27.8.1.11] Template class basic_fstream
10021debfc3dSmrg  /**
10031debfc3dSmrg   *  @brief  Controlling input and output for files.
10041debfc3dSmrg   *  @ingroup io
10051debfc3dSmrg   *
10061debfc3dSmrg   *  @tparam _CharT  Type of character stream.
10071debfc3dSmrg   *  @tparam _Traits  Traits for character type, defaults to
10081debfc3dSmrg   *                   char_traits<_CharT>.
10091debfc3dSmrg   *
10101debfc3dSmrg   *  This class supports reading from and writing to named files, using
10111debfc3dSmrg   *  the inherited functions from std::basic_iostream.  To control the
10121debfc3dSmrg   *  associated sequence, an instance of std::basic_filebuf is used, which
10131debfc3dSmrg   *  this page refers to as @c sb.
10141debfc3dSmrg   */
10151debfc3dSmrg  template<typename _CharT, typename _Traits>
10161debfc3dSmrg    class basic_fstream : public basic_iostream<_CharT, _Traits>
10171debfc3dSmrg    {
10181debfc3dSmrg    public:
10191debfc3dSmrg      // Types:
10201debfc3dSmrg      typedef _CharT 					char_type;
10211debfc3dSmrg      typedef _Traits 					traits_type;
10221debfc3dSmrg      typedef typename traits_type::int_type 		int_type;
10231debfc3dSmrg      typedef typename traits_type::pos_type 		pos_type;
10241debfc3dSmrg      typedef typename traits_type::off_type 		off_type;
10251debfc3dSmrg
10261debfc3dSmrg      // Non-standard types:
10271debfc3dSmrg      typedef basic_filebuf<char_type, traits_type> 	__filebuf_type;
10281debfc3dSmrg      typedef basic_ios<char_type, traits_type>		__ios_type;
10291debfc3dSmrg      typedef basic_iostream<char_type, traits_type>	__iostream_type;
10301debfc3dSmrg
10311debfc3dSmrg    private:
10321debfc3dSmrg      __filebuf_type	_M_filebuf;
10331debfc3dSmrg
10341debfc3dSmrg    public:
10351debfc3dSmrg      // Constructors/destructor:
10361debfc3dSmrg      /**
10371debfc3dSmrg       *  @brief  Default constructor.
10381debfc3dSmrg       *
10391debfc3dSmrg       *  Initializes @c sb using its default constructor, and passes
10401debfc3dSmrg       *  @c &sb to the base class initializer.  Does not open any files
10411debfc3dSmrg       *  (you haven't given it a filename to open).
10421debfc3dSmrg       */
10431debfc3dSmrg      basic_fstream()
10441debfc3dSmrg      : __iostream_type(), _M_filebuf()
10451debfc3dSmrg      { this->init(&_M_filebuf); }
10461debfc3dSmrg
10471debfc3dSmrg      /**
10481debfc3dSmrg       *  @brief  Create an input/output file stream.
10491debfc3dSmrg       *  @param  __s  Null terminated string specifying the filename.
10501debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
10511debfc3dSmrg       */
10521debfc3dSmrg      explicit
10531debfc3dSmrg      basic_fstream(const char* __s,
10541debfc3dSmrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
10551debfc3dSmrg      : __iostream_type(0), _M_filebuf()
10561debfc3dSmrg      {
10571debfc3dSmrg	this->init(&_M_filebuf);
10581debfc3dSmrg	this->open(__s, __mode);
10591debfc3dSmrg      }
10601debfc3dSmrg
1061c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
1062c0a68be4Smrg      /**
1063c0a68be4Smrg       *  @param  Create an input/output file stream.
1064c0a68be4Smrg       *  @param  __s  Wide string specifying the filename.
1065c0a68be4Smrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
1066c0a68be4Smrg       */
1067c0a68be4Smrg      basic_fstream(const wchar_t* __s,
1068c0a68be4Smrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
1069c0a68be4Smrg      : __iostream_type(0), _M_filebuf()
1070c0a68be4Smrg      {
1071c0a68be4Smrg	this->init(&_M_filebuf);
1072c0a68be4Smrg	this->open(__s, __mode);
1073c0a68be4Smrg      }
1074c0a68be4Smrg#endif
1075c0a68be4Smrg
10761debfc3dSmrg#if __cplusplus >= 201103L
10771debfc3dSmrg      /**
10781debfc3dSmrg       *  @brief  Create an input/output file stream.
10791debfc3dSmrg       *  @param  __s  Null terminated string specifying the filename.
10801debfc3dSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
10811debfc3dSmrg       */
10821debfc3dSmrg      explicit
10831debfc3dSmrg      basic_fstream(const std::string& __s,
10841debfc3dSmrg		    ios_base::openmode __mode = ios_base::in | ios_base::out)
10851debfc3dSmrg      : __iostream_type(0), _M_filebuf()
10861debfc3dSmrg      {
10871debfc3dSmrg	this->init(&_M_filebuf);
10881debfc3dSmrg	this->open(__s, __mode);
10891debfc3dSmrg      }
10901debfc3dSmrg
1091a2dc1f3fSmrg#if __cplusplus >= 201703L
1092a2dc1f3fSmrg      /**
1093*8feb0f0bSmrg       *  @brief  Create an input/output file stream.
1094a2dc1f3fSmrg       *  @param  __s  filesystem::path specifying the filename.
1095a2dc1f3fSmrg       *  @param  __mode  Open file in specified mode (see std::ios_base).
1096a2dc1f3fSmrg       */
1097a2dc1f3fSmrg      template<typename _Path, typename _Require = _If_fs_path<_Path>>
1098a2dc1f3fSmrg	basic_fstream(const _Path& __s,
1099a2dc1f3fSmrg		      ios_base::openmode __mode = ios_base::in | ios_base::out)
1100a2dc1f3fSmrg	: basic_fstream(__s.c_str(), __mode)
1101a2dc1f3fSmrg	{ }
1102a2dc1f3fSmrg#endif // C++17
1103a2dc1f3fSmrg
11041debfc3dSmrg      basic_fstream(const basic_fstream&) = delete;
11051debfc3dSmrg
11061debfc3dSmrg      basic_fstream(basic_fstream&& __rhs)
11071debfc3dSmrg      : __iostream_type(std::move(__rhs)),
11081debfc3dSmrg      _M_filebuf(std::move(__rhs._M_filebuf))
11091debfc3dSmrg      { __iostream_type::set_rdbuf(&_M_filebuf); }
11101debfc3dSmrg#endif
11111debfc3dSmrg
11121debfc3dSmrg      /**
11131debfc3dSmrg       *  @brief  The destructor does nothing.
11141debfc3dSmrg       *
11151debfc3dSmrg       *  The file is closed by the filebuf object, not the formatting
11161debfc3dSmrg       *  stream.
11171debfc3dSmrg       */
11181debfc3dSmrg      ~basic_fstream()
11191debfc3dSmrg      { }
11201debfc3dSmrg
11211debfc3dSmrg#if __cplusplus >= 201103L
11221debfc3dSmrg      // 27.8.3.2 Assign and swap:
11231debfc3dSmrg
11241debfc3dSmrg      basic_fstream&
11251debfc3dSmrg      operator=(const basic_fstream&) = delete;
11261debfc3dSmrg
11271debfc3dSmrg      basic_fstream&
11281debfc3dSmrg      operator=(basic_fstream&& __rhs)
11291debfc3dSmrg      {
11301debfc3dSmrg	__iostream_type::operator=(std::move(__rhs));
11311debfc3dSmrg	_M_filebuf = std::move(__rhs._M_filebuf);
11321debfc3dSmrg	return *this;
11331debfc3dSmrg      }
11341debfc3dSmrg
11351debfc3dSmrg      void
11361debfc3dSmrg      swap(basic_fstream& __rhs)
11371debfc3dSmrg      {
11381debfc3dSmrg	__iostream_type::swap(__rhs);
11391debfc3dSmrg	_M_filebuf.swap(__rhs._M_filebuf);
11401debfc3dSmrg      }
11411debfc3dSmrg#endif
11421debfc3dSmrg
11431debfc3dSmrg      // Members:
11441debfc3dSmrg      /**
11451debfc3dSmrg       *  @brief  Accessing the underlying buffer.
11461debfc3dSmrg       *  @return  The current basic_filebuf buffer.
11471debfc3dSmrg       *
11481debfc3dSmrg       *  This hides both signatures of std::basic_ios::rdbuf().
11491debfc3dSmrg       */
11501debfc3dSmrg      __filebuf_type*
11511debfc3dSmrg      rdbuf() const
11521debfc3dSmrg      { return const_cast<__filebuf_type*>(&_M_filebuf); }
11531debfc3dSmrg
11541debfc3dSmrg      /**
11551debfc3dSmrg       *  @brief  Wrapper to test for an open file.
11561debfc3dSmrg       *  @return  @c rdbuf()->is_open()
11571debfc3dSmrg       */
11581debfc3dSmrg      bool
11591debfc3dSmrg      is_open()
11601debfc3dSmrg      { return _M_filebuf.is_open(); }
11611debfc3dSmrg
11621debfc3dSmrg      // _GLIBCXX_RESOLVE_LIB_DEFECTS
11631debfc3dSmrg      // 365. Lack of const-qualification in clause 27
11641debfc3dSmrg      bool
11651debfc3dSmrg      is_open() const
11661debfc3dSmrg      { return _M_filebuf.is_open(); }
11671debfc3dSmrg
11681debfc3dSmrg      /**
11691debfc3dSmrg       *  @brief  Opens an external file.
11701debfc3dSmrg       *  @param  __s  The name of the file.
11711debfc3dSmrg       *  @param  __mode  The open mode flags.
11721debfc3dSmrg       *
11731debfc3dSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
11741debfc3dSmrg       *  function fails, @c failbit is set in the stream's error state.
11751debfc3dSmrg       */
11761debfc3dSmrg      void
11771debfc3dSmrg      open(const char* __s,
11781debfc3dSmrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
11791debfc3dSmrg      {
11801debfc3dSmrg	if (!_M_filebuf.open(__s, __mode))
11811debfc3dSmrg	  this->setstate(ios_base::failbit);
11821debfc3dSmrg	else
11831debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
11841debfc3dSmrg	  // 409. Closing an fstream should clear error state
11851debfc3dSmrg	  this->clear();
11861debfc3dSmrg      }
11871debfc3dSmrg
1188c0a68be4Smrg#if _GLIBCXX_HAVE__WFOPEN && _GLIBCXX_USE_WCHAR_T
1189c0a68be4Smrg      /**
1190c0a68be4Smrg       *  @brief  Opens an external file.
1191c0a68be4Smrg       *  @param  __s  The name of the file.
1192c0a68be4Smrg       *  @param  __mode  The open mode flags.
1193c0a68be4Smrg       *
1194c0a68be4Smrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
1195c0a68be4Smrg       *  function fails, @c failbit is set in the stream's error state.
1196c0a68be4Smrg       */
1197c0a68be4Smrg      void
1198c0a68be4Smrg      open(const wchar_t* __s,
1199c0a68be4Smrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
1200c0a68be4Smrg      {
1201c0a68be4Smrg	if (!_M_filebuf.open(__s, __mode))
1202c0a68be4Smrg	  this->setstate(ios_base::failbit);
1203c0a68be4Smrg	else
1204c0a68be4Smrg	  this->clear();
1205c0a68be4Smrg      }
1206c0a68be4Smrg#endif
1207c0a68be4Smrg
12081debfc3dSmrg#if __cplusplus >= 201103L
12091debfc3dSmrg      /**
12101debfc3dSmrg       *  @brief  Opens an external file.
12111debfc3dSmrg       *  @param  __s  The name of the file.
12121debfc3dSmrg       *  @param  __mode  The open mode flags.
12131debfc3dSmrg       *
12141debfc3dSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
12151debfc3dSmrg       *  function fails, @c failbit is set in the stream's error state.
12161debfc3dSmrg       */
12171debfc3dSmrg      void
12181debfc3dSmrg      open(const std::string& __s,
12191debfc3dSmrg	   ios_base::openmode __mode = ios_base::in | ios_base::out)
12201debfc3dSmrg      {
12211debfc3dSmrg	if (!_M_filebuf.open(__s, __mode))
12221debfc3dSmrg	  this->setstate(ios_base::failbit);
12231debfc3dSmrg	else
12241debfc3dSmrg	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
12251debfc3dSmrg	  // 409. Closing an fstream should clear error state
12261debfc3dSmrg	  this->clear();
12271debfc3dSmrg      }
1228a2dc1f3fSmrg
1229a2dc1f3fSmrg#if __cplusplus >= 201703L
1230a2dc1f3fSmrg      /**
1231a2dc1f3fSmrg       *  @brief  Opens an external file.
1232a2dc1f3fSmrg       *  @param  __s  The name of the file, as a filesystem::path.
1233a2dc1f3fSmrg       *  @param  __mode  The open mode flags.
1234a2dc1f3fSmrg       *
1235a2dc1f3fSmrg       *  Calls @c std::basic_filebuf::open(__s,__mode).  If that
1236a2dc1f3fSmrg       *  function fails, @c failbit is set in the stream's error state.
1237a2dc1f3fSmrg       */
1238a2dc1f3fSmrg      template<typename _Path>
1239a2dc1f3fSmrg	_If_fs_path<_Path, void>
1240a2dc1f3fSmrg	open(const _Path& __s,
1241a2dc1f3fSmrg	     ios_base::openmode __mode = ios_base::in | ios_base::out)
1242a2dc1f3fSmrg	{ open(__s.c_str(), __mode); }
1243a2dc1f3fSmrg#endif // C++17
1244a2dc1f3fSmrg#endif // C++11
12451debfc3dSmrg
12461debfc3dSmrg      /**
12471debfc3dSmrg       *  @brief  Close the file.
12481debfc3dSmrg       *
12491debfc3dSmrg       *  Calls @c std::basic_filebuf::close().  If that function
12501debfc3dSmrg       *  fails, @c failbit is set in the stream's error state.
12511debfc3dSmrg       */
12521debfc3dSmrg      void
12531debfc3dSmrg      close()
12541debfc3dSmrg      {
12551debfc3dSmrg	if (!_M_filebuf.close())
12561debfc3dSmrg	  this->setstate(ios_base::failbit);
12571debfc3dSmrg      }
12581debfc3dSmrg    };
12591debfc3dSmrg
12601debfc3dSmrg#if __cplusplus >= 201103L
12611debfc3dSmrg  /// Swap specialization for filebufs.
12621debfc3dSmrg  template <class _CharT, class _Traits>
12631debfc3dSmrg    inline void
12641debfc3dSmrg    swap(basic_filebuf<_CharT, _Traits>& __x,
12651debfc3dSmrg	 basic_filebuf<_CharT, _Traits>& __y)
12661debfc3dSmrg    { __x.swap(__y); }
12671debfc3dSmrg
12681debfc3dSmrg  /// Swap specialization for ifstreams.
12691debfc3dSmrg  template <class _CharT, class _Traits>
12701debfc3dSmrg    inline void
12711debfc3dSmrg    swap(basic_ifstream<_CharT, _Traits>& __x,
12721debfc3dSmrg	 basic_ifstream<_CharT, _Traits>& __y)
12731debfc3dSmrg    { __x.swap(__y); }
12741debfc3dSmrg
12751debfc3dSmrg  /// Swap specialization for ofstreams.
12761debfc3dSmrg  template <class _CharT, class _Traits>
12771debfc3dSmrg    inline void
12781debfc3dSmrg    swap(basic_ofstream<_CharT, _Traits>& __x,
12791debfc3dSmrg	 basic_ofstream<_CharT, _Traits>& __y)
12801debfc3dSmrg    { __x.swap(__y); }
12811debfc3dSmrg
12821debfc3dSmrg  /// Swap specialization for fstreams.
12831debfc3dSmrg  template <class _CharT, class _Traits>
12841debfc3dSmrg    inline void
12851debfc3dSmrg    swap(basic_fstream<_CharT, _Traits>& __x,
12861debfc3dSmrg	 basic_fstream<_CharT, _Traits>& __y)
12871debfc3dSmrg    { __x.swap(__y); }
12881debfc3dSmrg#endif
12891debfc3dSmrg
12901debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION
12911debfc3dSmrg} // namespace
12921debfc3dSmrg
12931debfc3dSmrg#include <bits/fstream.tcc>
12941debfc3dSmrg
12951debfc3dSmrg#endif /* _GLIBCXX_FSTREAM */
1296