2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H
11 #define _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H
14 #include <__cstddef/ptrdiff_t.h>
15 #include <__fwd/istream.h>
16 #include <__fwd/string.h>
17 #include <__iterator/default_sentinel.h>
18 #include <__iterator/iterator.h>
19 #include <__iterator/iterator_traits.h>
20 #include <__memory/addressof.h>
22 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
23 # pragma GCC system_header
26 _LIBCPP_BEGIN_NAMESPACE_STD
28 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
29 template <class _Tp
, class _CharT
= char, class _Traits
= char_traits
<_CharT
>, class _Distance
= ptrdiff_t>
30 class _LIBCPP_TEMPLATE_VIS istream_iterator
31 #if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
32 : public iterator
<input_iterator_tag
, _Tp
, _Distance
, const _Tp
*, const _Tp
&>
35 _LIBCPP_SUPPRESS_DEPRECATED_POP
38 typedef input_iterator_tag iterator_category
;
39 typedef _Tp value_type
;
40 typedef _Distance difference_type
;
41 typedef const _Tp
* pointer
;
42 typedef const _Tp
& reference
;
43 typedef _CharT char_type
;
44 typedef _Traits traits_type
;
45 typedef basic_istream
<_CharT
, _Traits
> istream_type
;
48 istream_type
* __in_stream_
;
52 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR
istream_iterator() : __in_stream_(nullptr), __value_() {}
53 #if _LIBCPP_STD_VER >= 20
54 _LIBCPP_HIDE_FROM_ABI
constexpr istream_iterator(default_sentinel_t
) : istream_iterator() {}
55 #endif // _LIBCPP_STD_VER >= 20
56 _LIBCPP_HIDE_FROM_ABI
istream_iterator(istream_type
& __s
) : __in_stream_(std::addressof(__s
)) {
57 if (!(*__in_stream_
>> __value_
))
58 __in_stream_
= nullptr;
61 _LIBCPP_HIDE_FROM_ABI
const _Tp
& operator*() const { return __value_
; }
62 _LIBCPP_HIDE_FROM_ABI
const _Tp
* operator->() const { return std::addressof((operator*())); }
63 _LIBCPP_HIDE_FROM_ABI istream_iterator
& operator++() {
64 if (!(*__in_stream_
>> __value_
))
65 __in_stream_
= nullptr;
68 _LIBCPP_HIDE_FROM_ABI istream_iterator
operator++(int) {
69 istream_iterator
__t(*this);
74 template <class _Up
, class _CharU
, class _TraitsU
, class _DistanceU
>
75 friend _LIBCPP_HIDE_FROM_ABI
bool operator==(const istream_iterator
<_Up
, _CharU
, _TraitsU
, _DistanceU
>& __x
,
76 const istream_iterator
<_Up
, _CharU
, _TraitsU
, _DistanceU
>& __y
);
78 #if _LIBCPP_STD_VER >= 20
79 friend _LIBCPP_HIDE_FROM_ABI
bool operator==(const istream_iterator
& __i
, default_sentinel_t
) {
80 return __i
.__in_stream_
== nullptr;
82 #endif // _LIBCPP_STD_VER >= 20
85 template <class _Tp
, class _CharT
, class _Traits
, class _Distance
>
86 inline _LIBCPP_HIDE_FROM_ABI
bool operator==(const istream_iterator
<_Tp
, _CharT
, _Traits
, _Distance
>& __x
,
87 const istream_iterator
<_Tp
, _CharT
, _Traits
, _Distance
>& __y
) {
88 return __x
.__in_stream_
== __y
.__in_stream_
;
91 #if _LIBCPP_STD_VER <= 17
92 template <class _Tp
, class _CharT
, class _Traits
, class _Distance
>
93 inline _LIBCPP_HIDE_FROM_ABI
bool operator!=(const istream_iterator
<_Tp
, _CharT
, _Traits
, _Distance
>& __x
,
94 const istream_iterator
<_Tp
, _CharT
, _Traits
, _Distance
>& __y
) {
97 #endif // _LIBCPP_STD_VER <= 17
99 _LIBCPP_END_NAMESPACE_STD
101 #endif // _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H