1    	// Position types -*- C++ -*-
2    	
3    	// Copyright (C) 1997-2013 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.
133  	      fpos(streamoff __off)
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&
154  	      operator+=(streamoff __off)
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&
165  	      operator-=(streamoff __off)
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.
228  	  typedef fpos<mbstate_t> streampos;
229  	  /// File position for wchar_t streams.
230  	  typedef fpos<mbstate_t> wstreampos;
231  	
232  	#if __cplusplus >= 201103L
233  	  /// File position for char16_t streams.
234  	  typedef fpos<mbstate_t> u16streampos;
235  	  /// File position for char32_t streams.
236  	  typedef fpos<mbstate_t> u32streampos;
237  	#endif
238  	
239  	_GLIBCXX_END_NAMESPACE_VERSION
240  	} // namespace
241  	
242  	#endif
243