17056250fSNikolas Klauser // -*- C++ -*- 27056250fSNikolas Klauser //===----------------------------------------------------------------------===// 37056250fSNikolas Klauser // 47056250fSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 57056250fSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 67056250fSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 77056250fSNikolas Klauser // 87056250fSNikolas Klauser //===----------------------------------------------------------------------===// 97056250fSNikolas Klauser 107056250fSNikolas Klauser #ifndef _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 117056250fSNikolas Klauser #define _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 127056250fSNikolas Klauser 13f87aa19bSLouis Dionne #include <__assert> 147056250fSNikolas Klauser #include <__config> 157056250fSNikolas Klauser #include <__filesystem/path.h> 167056250fSNikolas Klauser #include <__iterator/iterator_traits.h> 177056250fSNikolas Klauser 18fa6b9e40SArthur O'Dwyer #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19fa6b9e40SArthur O'Dwyer # pragma GCC system_header 20fa6b9e40SArthur O'Dwyer #endif 21fa6b9e40SArthur O'Dwyer 22ac8c9f1eSLouis Dionne #if _LIBCPP_STD_VER >= 17 237056250fSNikolas Klauser 247056250fSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 257056250fSNikolas Klauser 26f1ea0b11SNikolas Klauser class _LIBCPP_EXPORTED_FROM_ABI path::iterator { 277056250fSNikolas Klauser public: 287056250fSNikolas Klauser enum _ParserState : unsigned char { 297056250fSNikolas Klauser _Singular, 307056250fSNikolas Klauser _BeforeBegin, 317056250fSNikolas Klauser _InRootName, 327056250fSNikolas Klauser _InRootDir, 337056250fSNikolas Klauser _InFilenames, 347056250fSNikolas Klauser _InTrailingSep, 357056250fSNikolas Klauser _AtEnd 367056250fSNikolas Klauser }; 377056250fSNikolas Klauser 387056250fSNikolas Klauser public: 39459b4b72SArthur O'Dwyer typedef input_iterator_tag iterator_category; 40459b4b72SArthur O'Dwyer typedef bidirectional_iterator_tag iterator_concept; 417056250fSNikolas Klauser 427056250fSNikolas Klauser typedef path value_type; 437056250fSNikolas Klauser typedef ptrdiff_t difference_type; 447056250fSNikolas Klauser typedef const path* pointer; 45459b4b72SArthur O'Dwyer typedef path reference; 467056250fSNikolas Klauser 477056250fSNikolas Klauser public: 489783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI iterator() : __stashed_elem_(), __path_ptr_(nullptr), __entry_(), __state_(_Singular) {} 497056250fSNikolas Klauser 5083ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI iterator(const iterator&) = default; 5183ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI ~iterator() = default; 527056250fSNikolas Klauser 5383ce1397SNikolas Klauser _LIBCPP_HIDE_FROM_ABI iterator& operator=(const iterator&) = default; 547056250fSNikolas Klauser 559783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __stashed_elem_; } 567056250fSNikolas Klauser 579783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return &__stashed_elem_; } 587056250fSNikolas Klauser 599783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI iterator& operator++() { 60*4f215fddSKonstantin Varlamov _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to increment a singular iterator"); 619783f28cSLouis Dionne _LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _AtEnd, "attempting to increment the end iterator"); 627056250fSNikolas Klauser return __increment(); 637056250fSNikolas Klauser } 647056250fSNikolas Klauser 659783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI iterator operator++(int) { 667056250fSNikolas Klauser iterator __it(*this); 677056250fSNikolas Klauser this->operator++(); 687056250fSNikolas Klauser return __it; 697056250fSNikolas Klauser } 707056250fSNikolas Klauser 719783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI iterator& operator--() { 72*4f215fddSKonstantin Varlamov _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to decrement a singular iterator"); 739783f28cSLouis Dionne _LIBCPP_ASSERT_UNCATEGORIZED( 749783f28cSLouis Dionne __entry_.data() != __path_ptr_->native().data(), "attempting to decrement the begin iterator"); 757056250fSNikolas Klauser return __decrement(); 767056250fSNikolas Klauser } 777056250fSNikolas Klauser 789783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI iterator operator--(int) { 797056250fSNikolas Klauser iterator __it(*this); 807056250fSNikolas Klauser this->operator--(); 817056250fSNikolas Klauser return __it; 827056250fSNikolas Klauser } 837056250fSNikolas Klauser 847056250fSNikolas Klauser private: 857056250fSNikolas Klauser friend class path; 867056250fSNikolas Klauser 879783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI friend bool operator==(const iterator&, const iterator&); 887056250fSNikolas Klauser 897056250fSNikolas Klauser iterator& __increment(); 907056250fSNikolas Klauser iterator& __decrement(); 917056250fSNikolas Klauser 927056250fSNikolas Klauser path __stashed_elem_; 937056250fSNikolas Klauser const path* __path_ptr_; 947056250fSNikolas Klauser path::__string_view __entry_; 957056250fSNikolas Klauser _ParserState __state_; 967056250fSNikolas Klauser }; 977056250fSNikolas Klauser 98c352fa74SLouis Dionne _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY 999783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI bool operator==(const path::iterator& __lhs, const path::iterator& __rhs) { 1009783f28cSLouis Dionne return __lhs.__path_ptr_ == __rhs.__path_ptr_ && __lhs.__entry_.data() == __rhs.__entry_.data(); 1017056250fSNikolas Klauser } 1027056250fSNikolas Klauser 103c352fa74SLouis Dionne _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY 1049783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const path::iterator& __lhs, const path::iterator& __rhs) { 1057056250fSNikolas Klauser return !(__lhs == __rhs); 1067056250fSNikolas Klauser } 1077056250fSNikolas Klauser 1087056250fSNikolas Klauser _LIBCPP_END_NAMESPACE_FILESYSTEM 1097056250fSNikolas Klauser 110ac8c9f1eSLouis Dionne #endif // _LIBCPP_STD_VER >= 17 1117056250fSNikolas Klauser 1127056250fSNikolas Klauser #endif // _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 113