The C and C++ Include Header Files
/usr/include/c++/11/bits/stream_iterator.h
$ cat -n /usr/include/c++/11/bits/stream_iterator.h 1 // Stream iterators 2 3 // Copyright (C) 2001-2021 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/stream_iterator.h 26 * This is an internal header file, included by other library headers. 27 * Do not attempt to use it directly. @headername{iterator} 28 */ 29 30 #ifndef _STREAM_ITERATOR_H 31 #define _STREAM_ITERATOR_H 1 32 33 #pragma GCC system_header 34 35 #include
36 37 namespace std _GLIBCXX_VISIBILITY(default) 38 { 39 _GLIBCXX_BEGIN_NAMESPACE_VERSION 40 41 /** 42 * @addtogroup iterators 43 * @{ 44 */ 45 46 /// Provides input iterator semantics for streams. 47 template
, typename _Dist = ptrdiff_t> 49 class istream_iterator 50 : public iterator
51 { 52 public: 53 typedef _CharT char_type; 54 typedef _Traits traits_type; 55 typedef basic_istream<_CharT, _Traits> istream_type; 56 57 private: 58 istream_type* _M_stream; 59 _Tp _M_value; 60 // This bool becomes false at end-of-stream. It should be sufficient to 61 // check _M_stream != nullptr instead, but historically we did not set 62 // _M_stream to null when reaching the end, so we need to keep this flag. 63 bool _M_ok; 64 65 public: 66 /// Construct end of input stream iterator. 67 _GLIBCXX_CONSTEXPR istream_iterator() 68 : _M_stream(0), _M_value(), _M_ok(false) {} 69 70 /// Construct start of input stream iterator. 71 istream_iterator(istream_type& __s) 72 : _M_stream(std::__addressof(__s)), _M_ok(true) 73 { _M_read(); } 74 75 istream_iterator(const istream_iterator& __obj) 76 : _M_stream(__obj._M_stream), _M_value(__obj._M_value), 77 _M_ok(__obj._M_ok) 78 { } 79 80 #if __cplusplus > 201703L && __cpp_lib_concepts 81 constexpr 82 istream_iterator(default_sentinel_t) 83 noexcept(is_nothrow_default_constructible_v<_Tp>) 84 : istream_iterator() { } 85 #endif 86 87 #if __cplusplus >= 201103L 88 istream_iterator& operator=(const istream_iterator&) = default; 89 ~istream_iterator() = default; 90 #endif 91 92 const _Tp& 93 operator*() const 94 { 95 __glibcxx_requires_cond(_M_ok, 96 _M_message(__gnu_debug::__msg_deref_istream) 97 ._M_iterator(*this)); 98 return _M_value; 99 } 100 101 const _Tp* 102 operator->() const { return std::__addressof((operator*())); } 103 104 istream_iterator& 105 operator++() 106 { 107 __glibcxx_requires_cond(_M_ok, 108 _M_message(__gnu_debug::__msg_inc_istream) 109 ._M_iterator(*this)); 110 _M_read(); 111 return *this; 112 } 113 114 istream_iterator 115 operator++(int) 116 { 117 __glibcxx_requires_cond(_M_ok, 118 _M_message(__gnu_debug::__msg_inc_istream) 119 ._M_iterator(*this)); 120 istream_iterator __tmp = *this; 121 _M_read(); 122 return __tmp; 123 } 124 125 private: 126 bool 127 _M_equal(const istream_iterator& __x) const 128 { 129 // Ideally this would just return _M_stream == __x._M_stream, 130 // but code compiled with old versions never sets _M_stream to null. 131 return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); 132 } 133 134 void 135 _M_read() 136 { 137 if (_M_stream && !(*_M_stream >> _M_value)) 138 { 139 _M_stream = 0; 140 _M_ok = false; 141 } 142 } 143 144 /// Return true if the iterators refer to the same stream, 145 /// or are both at end-of-stream. 146 friend bool 147 operator==(const istream_iterator& __x, const istream_iterator& __y) 148 { return __x._M_equal(__y); } 149 150 /// Return true if the iterators refer to different streams, 151 /// or if one is at end-of-stream and the other is not. 152 friend bool 153 operator!=(const istream_iterator& __x, const istream_iterator& __y) 154 { return !__x._M_equal(__y); } 155 156 #if __cplusplus > 201703L && __cpp_lib_concepts 157 friend bool 158 operator==(const istream_iterator& __i, default_sentinel_t) 159 { return !__i._M_stream; } 160 #endif 161 }; 162 163 /** 164 * @brief Provides output iterator semantics for streams. 165 * 166 * This class provides an iterator to write to an ostream. The type Tp is 167 * the only type written by this iterator and there must be an 168 * operator<<(Tp) defined. 169 * 170 * @tparam _Tp The type to write to the ostream. 171 * @tparam _CharT The ostream char_type. 172 * @tparam _Traits The ostream char_traits. 173 */ 174 template
> 176 class ostream_iterator 177 : public iterator
178 { 179 public: 180 ///@{ 181 /// Public typedef 182 #if __cplusplus > 201703L 183 using difference_type = ptrdiff_t; 184 #endif 185 typedef _CharT char_type; 186 typedef _Traits traits_type; 187 typedef basic_ostream<_CharT, _Traits> ostream_type; 188 ///@} 189 190 private: 191 ostream_type* _M_stream; 192 const _CharT* _M_string; 193 194 public: 195 #if __cplusplus > 201703L 196 constexpr ostream_iterator() noexcept 197 : _M_stream(nullptr), _M_string(nullptr) { } 198 #endif 199 200 /// Construct from an ostream. 201 ostream_iterator(ostream_type& __s) 202 : _M_stream(std::__addressof(__s)), _M_string(0) {} 203 204 /** 205 * Construct from an ostream. 206 * 207 * The delimiter string @a c is written to the stream after every Tp 208 * written to the stream. The delimiter is not copied, and thus must 209 * not be destroyed while this iterator is in use. 210 * 211 * @param __s Underlying ostream to write to. 212 * @param __c CharT delimiter string to insert. 213 */ 214 ostream_iterator(ostream_type& __s, const _CharT* __c) 215 : _M_stream(std::__addressof(__s)), _M_string(__c) { } 216 217 /// Copy constructor. 218 ostream_iterator(const ostream_iterator& __obj) 219 : _M_stream(__obj._M_stream), _M_string(__obj._M_string) { } 220 221 #if __cplusplus >= 201103L 222 ostream_iterator& operator=(const ostream_iterator&) = default; 223 #endif 224 225 /// Writes @a value to underlying ostream using operator<<. If 226 /// constructed with delimiter string, writes delimiter to ostream. 227 ostream_iterator& 228 operator=(const _Tp& __value) 229 { 230 __glibcxx_requires_cond(_M_stream != 0, 231 _M_message(__gnu_debug::__msg_output_ostream) 232 ._M_iterator(*this)); 233 *_M_stream << __value; 234 if (_M_string) 235 *_M_stream << _M_string; 236 return *this; 237 } 238 239 ostream_iterator& 240 operator*() 241 { return *this; } 242 243 ostream_iterator& 244 operator++() 245 { return *this; } 246 247 ostream_iterator& 248 operator++(int) 249 { return *this; } 250 }; 251 252 /// @} group iterators 253 254 _GLIBCXX_END_NAMESPACE_VERSION 255 } // namespace 256 257 #endif
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2024 MyWebUniversity.com ™