Home | History | Annotate | Download | only in bits
      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