source: svn/trunk/newcon3bcm2_21bu/toolchain/include/c++/3.4.2/ext/stdio_filebuf.h

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 5.6 KB
Line 
1// File descriptor layer for filebuf -*- C++ -*-
2
3// Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 2, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING.  If not, write to the Free
18// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19// USA.
20
21// As a special exception, you may use this file as part of a free software
22// library without restriction.  Specifically, if other files instantiate
23// templates or use macros or inline functions from this file, or you compile
24// this file and link it with other files to produce an executable, this
25// file does not by itself cause the resulting executable to be covered by
26// the GNU General Public License.  This exception does not however
27// invalidate any other reasons why the executable file might be covered by
28// the GNU General Public License.
29
30/** @file ext/stdio_filebuf.h
31 *  This file is a GNU extension to the Standard C++ Library.
32 */
33
34#ifndef _STDIO_FILEBUF_H
35#define _STDIO_FILEBUF_H 1
36
37#pragma GCC system_header
38
39#include <fstream>
40
41namespace __gnu_cxx
42{
43  /**
44   *  @class stdio_filebuf ext/stdio_filebuf.h <ext/stdio_filebuf.h>
45   *  @brief Provides a layer of compatibility for C/POSIX.
46   *
47   *  This GNU extension provides extensions for working with standard C
48   *  FILE*'s and POSIX file descriptors.  It must be instantiated by the
49   *  user with the type of character used in the file stream, e.g.,
50   *  stdio_filebuf<char>.
51  */
52  template<typename _CharT, typename _Traits = std::char_traits<_CharT> >
53    class stdio_filebuf : public std::basic_filebuf<_CharT, _Traits>
54    {
55    public:
56      // Types:
57      typedef _CharT                                    char_type;
58      typedef _Traits                                   traits_type;
59      typedef typename traits_type::int_type            int_type;
60      typedef typename traits_type::pos_type            pos_type;
61      typedef typename traits_type::off_type            off_type;
62      typedef std::size_t                               size_t;
63
64    public:
65      /**
66       * deferred initialization
67      */
68      stdio_filebuf() : std::basic_filebuf<_CharT, _Traits>() {}
69
70      /**
71       *  @param  fd  An open file descriptor.
72       *  @param  mode  Same meaning as in a standard filebuf.
73       *  @param  size  Optimal or preferred size of internal buffer, in chars.
74       *
75       *  This constructor associates a file stream buffer with an open
76       *  POSIX file descriptor. The file descriptor will be automatically
77       *  closed when the stdio_filebuf is closed/destroyed.
78      */
79      stdio_filebuf(int __fd, std::ios_base::openmode __mode,
80                    size_t __size = static_cast<size_t>(BUFSIZ));
81
82      /**
83       *  @param  f  An open @c FILE*.
84       *  @param  mode  Same meaning as in a standard filebuf.
85       *  @param  size  Optimal or preferred size of internal buffer, in chars.
86       *                Defaults to system's @c BUFSIZ.
87       *
88       *  This constructor associates a file stream buffer with an open
89       *  C @c FILE*.  The @c FILE* will not be automatically closed when the
90       *  stdio_filebuf is closed/destroyed.
91      */
92      stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
93                    size_t __size = static_cast<size_t>(BUFSIZ));
94
95      /**
96       *  Closes the external data stream if the file descriptor constructor
97       *  was used.
98      */
99      virtual
100      ~stdio_filebuf();
101
102      /**
103       *  @return  The underlying file descriptor.
104       *
105       *  Once associated with an external data stream, this function can be
106       *  used to access the underlying POSIX file descriptor.  Note that
107       *  there is no way for the library to track what you do with the
108       *  descriptor, so be careful.
109      */
110      int
111      fd() { return this->_M_file.fd(); }
112
113      /**
114       *  @return  The underlying FILE*.
115       *
116       *  This function can be used to access the underlying "C" file pointer.
117       *  Note that there is no way for the library to track what you do
118       *  with the file, so be careful.
119       */
120      std::__c_file*
121      file() { return this->_M_file.file(); }
122    };
123
124  template<typename _CharT, typename _Traits>
125    stdio_filebuf<_CharT, _Traits>::~stdio_filebuf()
126    { }
127
128  template<typename _CharT, typename _Traits>
129    stdio_filebuf<_CharT, _Traits>::
130    stdio_filebuf(int __fd, std::ios_base::openmode __mode, size_t __size)
131    {
132      this->_M_file.sys_open(__fd, __mode);
133      if (this->is_open())
134        {
135          this->_M_mode = __mode;
136          this->_M_buf_size = __size;
137          this->_M_allocate_internal_buffer();
138          this->_M_reading = false;
139          this->_M_writing = false;
140          this->_M_set_buffer(-1);
141        }
142    }
143
144  template<typename _CharT, typename _Traits>
145    stdio_filebuf<_CharT, _Traits>::
146    stdio_filebuf(std::__c_file* __f, std::ios_base::openmode __mode,
147                  size_t __size)
148    {
149      this->_M_file.sys_open(__f, __mode);
150      if (this->is_open())
151        {
152          this->_M_mode = __mode;
153          this->_M_buf_size = __size;
154          this->_M_allocate_internal_buffer();
155          this->_M_reading = false;
156          this->_M_writing = false;
157          this->_M_set_buffer(-1);
158        }
159    }
160} // namespace __gnu_cxx
161
162#endif
Note: See TracBrowser for help on using the repository browser.