libstdc++
postypes.h
Go to the documentation of this file.
1 // Position types -*- C++ -*-
2 
3 // Copyright (C) 1997-2014 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 3, 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 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file bits/postypes.h
26  * This is an internal header file, included by other library headers.
27  * Do not attempt to use it directly. @headername{iosfwd}
28  */
29 
30 //
31 // ISO C++ 14882: 27.4.1 - Types
32 // ISO C++ 14882: 27.4.3 - Template class fpos
33 //
34 
35 #ifndef _GLIBCXX_POSTYPES_H
36 #define _GLIBCXX_POSTYPES_H 1
37 
38 #pragma GCC system_header
39 
40 #include <cwchar> // For mbstate_t
41 
42 // XXX If <stdint.h> is really needed, make sure to define the macros
43 // before including it, in order not to break <tr1/cstdint> (and <cstdint>
44 // in C++0x). Reconsider all this as soon as possible...
45 #if (defined(_GLIBCXX_HAVE_INT64_T) && !defined(_GLIBCXX_HAVE_INT64_T_LONG) \
46  && !defined(_GLIBCXX_HAVE_INT64_T_LONG_LONG))
47 
48 #ifndef __STDC_LIMIT_MACROS
49 # define _UNDEF__STDC_LIMIT_MACROS
50 # define __STDC_LIMIT_MACROS
51 #endif
52 #ifndef __STDC_CONSTANT_MACROS
53 # define _UNDEF__STDC_CONSTANT_MACROS
54 # define __STDC_CONSTANT_MACROS
55 #endif
56 #include <stdint.h> // For int64_t
57 #ifdef _UNDEF__STDC_LIMIT_MACROS
58 # undef __STDC_LIMIT_MACROS
59 # undef _UNDEF__STDC_LIMIT_MACROS
60 #endif
61 #ifdef _UNDEF__STDC_CONSTANT_MACROS
62 # undef __STDC_CONSTANT_MACROS
63 # undef _UNDEF__STDC_CONSTANT_MACROS
64 #endif
65 
66 #endif
67 
68 namespace std _GLIBCXX_VISIBILITY(default)
69 {
70 _GLIBCXX_BEGIN_NAMESPACE_VERSION
71 
72  // The types streamoff, streampos and wstreampos and the class
73  // template fpos<> are described in clauses 21.1.2, 21.1.3, 27.1.2,
74  // 27.2, 27.4.1, 27.4.3 and D.6. Despite all this verbiage, the
75  // behaviour of these types is mostly implementation defined or
76  // unspecified. The behaviour in this implementation is as noted
77  // below.
78 
79  /**
80  * @brief Type used by fpos, char_traits<char>, and char_traits<wchar_t>.
81  *
82  * In clauses 21.1.3.1 and 27.4.1 streamoff is described as an
83  * implementation defined type.
84  * Note: In versions of GCC up to and including GCC 3.3, streamoff
85  * was typedef long.
86  */
87 #ifdef _GLIBCXX_HAVE_INT64_T_LONG
88  typedef long streamoff;
89 #elif defined(_GLIBCXX_HAVE_INT64_T_LONG_LONG)
90  typedef long long streamoff;
91 #elif defined(_GLIBCXX_HAVE_INT64_T)
92  typedef int64_t streamoff;
93 #else
94  typedef long long streamoff;
95 #endif
96 
97  /// Integral type for I/O operation counts and buffer sizes.
98  typedef ptrdiff_t streamsize; // Signed integral type
99 
100  /**
101  * @brief Class representing stream positions.
102  *
103  * The standard places no requirements upon the template parameter StateT.
104  * In this implementation StateT must be DefaultConstructible,
105  * CopyConstructible and Assignable. The standard only requires that fpos
106  * should contain a member of type StateT. In this implementation it also
107  * contains an offset stored as a signed integer.
108  *
109  * @param StateT Type passed to and returned from state().
110  */
111  template<typename _StateT>
112  class fpos
113  {
114  private:
115  streamoff _M_off;
116  _StateT _M_state;
117 
118  public:
119  // The standard doesn't require that fpos objects can be default
120  // constructed. This implementation provides a default
121  // constructor that initializes the offset to 0 and default
122  // constructs the state.
123  fpos()
124  : _M_off(0), _M_state() { }
125 
126  // The standard requires that fpos objects can be constructed
127  // from streamoff objects using the constructor syntax, and
128  // fails to give any meaningful semantics. In this
129  // implementation implicit conversion is also allowed, and this
130  // constructor stores the streamoff as the offset and default
131  // constructs the state.
132  /// Construct position from offset.
134  : _M_off(__off), _M_state() { }
135 
136  /// Convert to streamoff.
137  operator streamoff() const { return _M_off; }
138 
139  /// Remember the value of @a st.
140  void
141  state(_StateT __st)
142  { _M_state = __st; }
143 
144  /// Return the last set value of @a st.
145  _StateT
146  state() const
147  { return _M_state; }
148 
149  // The standard requires that this operator must be defined, but
150  // gives no semantics. In this implementation it just adds its
151  // argument to the stored offset and returns *this.
152  /// Add offset to this position.
153  fpos&
155  {
156  _M_off += __off;
157  return *this;
158  }
159 
160  // The standard requires that this operator must be defined, but
161  // gives no semantics. In this implementation it just subtracts
162  // its argument from the stored offset and returns *this.
163  /// Subtract offset from this position.
164  fpos&
166  {
167  _M_off -= __off;
168  return *this;
169  }
170 
171  // The standard requires that this operator must be defined, but
172  // defines its semantics only in terms of operator-. In this
173  // implementation it constructs a copy of *this, adds the
174  // argument to that copy using operator+= and then returns the
175  // copy.
176  /// Add position and offset.
177  fpos
178  operator+(streamoff __off) const
179  {
180  fpos __pos(*this);
181  __pos += __off;
182  return __pos;
183  }
184 
185  // The standard requires that this operator must be defined, but
186  // defines its semantics only in terms of operator+. In this
187  // implementation it constructs a copy of *this, subtracts the
188  // argument from that copy using operator-= and then returns the
189  // copy.
190  /// Subtract offset from position.
191  fpos
192  operator-(streamoff __off) const
193  {
194  fpos __pos(*this);
195  __pos -= __off;
196  return __pos;
197  }
198 
199  // The standard requires that this operator must be defined, but
200  // defines its semantics only in terms of operator+. In this
201  // implementation it returns the difference between the offset
202  // stored in *this and in the argument.
203  /// Subtract position to return offset.
204  streamoff
205  operator-(const fpos& __other) const
206  { return _M_off - __other._M_off; }
207  };
208 
209  // The standard only requires that operator== must be an
210  // equivalence relation. In this implementation two fpos<StateT>
211  // objects belong to the same equivalence class if the contained
212  // offsets compare equal.
213  /// Test if equivalent to another position.
214  template<typename _StateT>
215  inline bool
216  operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
217  { return streamoff(__lhs) == streamoff(__rhs); }
218 
219  template<typename _StateT>
220  inline bool
221  operator!=(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
222  { return streamoff(__lhs) != streamoff(__rhs); }
223 
224  // Clauses 21.1.3.1 and 21.1.3.2 describe streampos and wstreampos
225  // as implementation defined types, but clause 27.2 requires that
226  // they must both be typedefs for fpos<mbstate_t>
227  /// File position for char streams.
229  /// File position for wchar_t streams.
231 
232 #if __cplusplus >= 201103L
233  /// File position for char16_t streams.
235  /// File position for char32_t streams.
237 #endif
238 
239 _GLIBCXX_END_NAMESPACE_VERSION
240 } // namespace
241 
242 #endif
fpos & operator+=(streamoff __off)
Add offset to this position.
Definition: postypes.h:154
fpos< mbstate_t > u32streampos
File position for char32_t streams.
Definition: postypes.h:236
fpos< mbstate_t > wstreampos
File position for wchar_t streams.
Definition: postypes.h:230
fpos< mbstate_t > u16streampos
File position for char16_t streams.
Definition: postypes.h:234
fpos operator+(streamoff __off) const
Add position and offset.
Definition: postypes.h:178
void state(_StateT __st)
Remember the value of st.
Definition: postypes.h:141
fpos(streamoff __off)
Construct position from offset.
Definition: postypes.h:133
Class representing stream positions.
Definition: postypes.h:112
streamoff operator-(const fpos &__other) const
Subtract position to return offset.
Definition: postypes.h:205
fpos operator-(streamoff __off) const
Subtract offset from position.
Definition: postypes.h:192
long long streamoff
Type used by fpos, char_traits&lt;char&gt;, and char_traits&lt;wchar_t&gt;.
Definition: postypes.h:94
fpos< mbstate_t > streampos
File position for char streams.
Definition: postypes.h:228
_StateT state() const
Return the last set value of st.
Definition: postypes.h:146
ptrdiff_t streamsize
Integral type for I/O operation counts and buffer sizes.
Definition: postypes.h:98
fpos & operator-=(streamoff __off)
Subtract offset from this position.
Definition: postypes.h:165