xref: /freebsd-src/contrib/llvm-project/libcxx/include/__iterator/istream_iterator.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
1fe6060f1SDimitry Andric // -*- C++ -*-
2fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
3fe6060f1SDimitry Andric //
4fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7fe6060f1SDimitry Andric //
8fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
9fe6060f1SDimitry Andric 
10fe6060f1SDimitry Andric #ifndef _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H
11fe6060f1SDimitry Andric #define _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H
12fe6060f1SDimitry Andric 
13fe6060f1SDimitry Andric #include <__config>
145f757f3fSDimitry Andric #include <__fwd/istream.h>
155f757f3fSDimitry Andric #include <__fwd/string.h>
1681ad6265SDimitry Andric #include <__iterator/default_sentinel.h>
17fe6060f1SDimitry Andric #include <__iterator/iterator.h>
18fe6060f1SDimitry Andric #include <__iterator/iterator_traits.h>
19fe6060f1SDimitry Andric #include <__memory/addressof.h>
2081ad6265SDimitry Andric #include <cstddef>
21fe6060f1SDimitry Andric 
22fe6060f1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
23fe6060f1SDimitry Andric #  pragma GCC system_header
24fe6060f1SDimitry Andric #endif
25fe6060f1SDimitry Andric 
26fe6060f1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
27fe6060f1SDimitry Andric 
28fe6060f1SDimitry Andric _LIBCPP_SUPPRESS_DEPRECATED_PUSH
29*cb14a3feSDimitry Andric template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t>
30fe6060f1SDimitry Andric class _LIBCPP_TEMPLATE_VIS istream_iterator
31fe6060f1SDimitry Andric #if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES)
32fe6060f1SDimitry Andric     : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&>
33fe6060f1SDimitry Andric #endif
34fe6060f1SDimitry Andric {
35fe6060f1SDimitry Andric   _LIBCPP_SUPPRESS_DEPRECATED_POP
36*cb14a3feSDimitry Andric 
37fe6060f1SDimitry Andric public:
38fe6060f1SDimitry Andric   typedef input_iterator_tag iterator_category;
39fe6060f1SDimitry Andric   typedef _Tp value_type;
40fe6060f1SDimitry Andric   typedef _Distance difference_type;
41fe6060f1SDimitry Andric   typedef const _Tp* pointer;
42fe6060f1SDimitry Andric   typedef const _Tp& reference;
43fe6060f1SDimitry Andric   typedef _CharT char_type;
44fe6060f1SDimitry Andric   typedef _Traits traits_type;
45fe6060f1SDimitry Andric   typedef basic_istream<_CharT, _Traits> istream_type;
46*cb14a3feSDimitry Andric 
47fe6060f1SDimitry Andric private:
48fe6060f1SDimitry Andric   istream_type* __in_stream_;
49fe6060f1SDimitry Andric   _Tp __value_;
50*cb14a3feSDimitry Andric 
51fe6060f1SDimitry Andric public:
istream_iterator()525f757f3fSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(nullptr), __value_() {}
5306c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20
istream_iterator(default_sentinel_t)5481ad6265SDimitry Andric   _LIBCPP_HIDE_FROM_ABI constexpr istream_iterator(default_sentinel_t) : istream_iterator() {}
5506c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20
istream_iterator(istream_type & __s)56*cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI istream_iterator(istream_type& __s) : __in_stream_(std::addressof(__s)) {
57fe6060f1SDimitry Andric     if (!(*__in_stream_ >> __value_))
58fe6060f1SDimitry Andric       __in_stream_ = nullptr;
59fe6060f1SDimitry Andric   }
60fe6060f1SDimitry Andric 
615f757f3fSDimitry Andric   _LIBCPP_HIDE_FROM_ABI const _Tp& operator*() const { return __value_; }
625f757f3fSDimitry Andric   _LIBCPP_HIDE_FROM_ABI const _Tp* operator->() const { return std::addressof((operator*())); }
63*cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI istream_iterator& operator++() {
64fe6060f1SDimitry Andric     if (!(*__in_stream_ >> __value_))
65fe6060f1SDimitry Andric       __in_stream_ = nullptr;
66fe6060f1SDimitry Andric     return *this;
67fe6060f1SDimitry Andric   }
68*cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI istream_iterator operator++(int) {
69*cb14a3feSDimitry Andric     istream_iterator __t(*this);
70*cb14a3feSDimitry Andric     ++(*this);
71*cb14a3feSDimitry Andric     return __t;
72*cb14a3feSDimitry Andric   }
73fe6060f1SDimitry Andric 
74fe6060f1SDimitry Andric   template <class _Up, class _CharU, class _TraitsU, class _DistanceU>
75*cb14a3feSDimitry Andric   friend _LIBCPP_HIDE_FROM_ABI bool operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x,
76fe6060f1SDimitry Andric                                                const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y);
7781ad6265SDimitry Andric 
7806c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 20
7981ad6265SDimitry Andric   friend _LIBCPP_HIDE_FROM_ABI bool operator==(const istream_iterator& __i, default_sentinel_t) {
8081ad6265SDimitry Andric     return __i.__in_stream_ == nullptr;
8181ad6265SDimitry Andric   }
8206c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 20
83fe6060f1SDimitry Andric };
84fe6060f1SDimitry Andric 
85fe6060f1SDimitry Andric template <class _Tp, class _CharT, class _Traits, class _Distance>
86*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI bool operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
87*cb14a3feSDimitry Andric                                              const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) {
88fe6060f1SDimitry Andric   return __x.__in_stream_ == __y.__in_stream_;
89fe6060f1SDimitry Andric }
90fe6060f1SDimitry Andric 
9181ad6265SDimitry Andric #if _LIBCPP_STD_VER <= 17
92fe6060f1SDimitry Andric template <class _Tp, class _CharT, class _Traits, class _Distance>
93*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x,
94*cb14a3feSDimitry Andric                                              const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) {
95fe6060f1SDimitry Andric   return !(__x == __y);
96fe6060f1SDimitry Andric }
9781ad6265SDimitry Andric #endif // _LIBCPP_STD_VER <= 17
98fe6060f1SDimitry Andric 
99fe6060f1SDimitry Andric _LIBCPP_END_NAMESPACE_STD
100fe6060f1SDimitry Andric 
101fe6060f1SDimitry Andric #endif // _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H
102