File Coverage

/usr/include/c++/5/bits/postypes.h
Criterion Covered Total %
statement 0 1 0.0
branch n/a
condition n/a
subroutine n/a
pod n/a
total 0 1 0.0


line stmt bran cond sub pod time code
1             // Position types -*- C++ -*-
2              
3             // Copyright (C) 1997-2015 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             // .
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 // For mbstate_t
41              
42             // XXX If is really needed, make sure to define the macros
43             // before including it, in order not to break (and
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 // 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, and char_traits.
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
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 0           { 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
211             // objects belong to the same equivalence class if the contained
212             // offsets compare equal.
213             /// Test if equivalent to another position.
214             template
215             inline bool
216             operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
217             { return streamoff(__lhs) == streamoff(__rhs); }
218              
219             template
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
227             /// File position for char streams.
228             typedef fpos streampos;
229             /// File position for wchar_t streams.
230             typedef fpos wstreampos;
231              
232             #if __cplusplus >= 201103L
233             /// File position for char16_t streams.
234             typedef fpos u16streampos;
235             /// File position for char32_t streams.
236             typedef fpos u32streampos;
237             #endif
238              
239             _GLIBCXX_END_NAMESPACE_VERSION
240             } // namespace
241              
242             #endif