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