1*4bdff4beSrobert // -*- C++ -*- 2*4bdff4beSrobert //===----------------------------------------------------------------------===// 3*4bdff4beSrobert // 4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information. 6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4bdff4beSrobert // 8*4bdff4beSrobert //===----------------------------------------------------------------------===// 9*4bdff4beSrobert 10*4bdff4beSrobert #ifndef _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 11*4bdff4beSrobert #define _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 12*4bdff4beSrobert 13*4bdff4beSrobert #include <__assert> 14*4bdff4beSrobert #include <__availability> 15*4bdff4beSrobert #include <__config> 16*4bdff4beSrobert #include <__filesystem/path.h> 17*4bdff4beSrobert #include <__iterator/iterator_traits.h> 18*4bdff4beSrobert #include <cstddef> 19*4bdff4beSrobert #include <string> 20*4bdff4beSrobert #include <string_view> 21*4bdff4beSrobert 22*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 23*4bdff4beSrobert # pragma GCC system_header 24*4bdff4beSrobert #endif 25*4bdff4beSrobert 26*4bdff4beSrobert #ifndef _LIBCPP_CXX03_LANG 27*4bdff4beSrobert 28*4bdff4beSrobert _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 29*4bdff4beSrobert 30*4bdff4beSrobert _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH 31*4bdff4beSrobert 32*4bdff4beSrobert class _LIBCPP_TYPE_VIS path::iterator { 33*4bdff4beSrobert public: 34*4bdff4beSrobert enum _ParserState : unsigned char { 35*4bdff4beSrobert _Singular, 36*4bdff4beSrobert _BeforeBegin, 37*4bdff4beSrobert _InRootName, 38*4bdff4beSrobert _InRootDir, 39*4bdff4beSrobert _InFilenames, 40*4bdff4beSrobert _InTrailingSep, 41*4bdff4beSrobert _AtEnd 42*4bdff4beSrobert }; 43*4bdff4beSrobert 44*4bdff4beSrobert public: 45*4bdff4beSrobert typedef input_iterator_tag iterator_category; 46*4bdff4beSrobert typedef bidirectional_iterator_tag iterator_concept; 47*4bdff4beSrobert 48*4bdff4beSrobert typedef path value_type; 49*4bdff4beSrobert typedef ptrdiff_t difference_type; 50*4bdff4beSrobert typedef const path* pointer; 51*4bdff4beSrobert typedef path reference; 52*4bdff4beSrobert 53*4bdff4beSrobert public: 54*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY iterator()55*4bdff4beSrobert iterator() 56*4bdff4beSrobert : __stashed_elem_(), __path_ptr_(nullptr), __entry_(), 57*4bdff4beSrobert __state_(_Singular) {} 58*4bdff4beSrobert 59*4bdff4beSrobert iterator(const iterator&) = default; 60*4bdff4beSrobert ~iterator() = default; 61*4bdff4beSrobert 62*4bdff4beSrobert iterator& operator=(const iterator&) = default; 63*4bdff4beSrobert 64*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 65*4bdff4beSrobert reference operator*() const { return __stashed_elem_; } 66*4bdff4beSrobert 67*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 68*4bdff4beSrobert pointer operator->() const { return &__stashed_elem_; } 69*4bdff4beSrobert 70*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 71*4bdff4beSrobert iterator& operator++() { 72*4bdff4beSrobert _LIBCPP_ASSERT(__state_ != _Singular, 73*4bdff4beSrobert "attempting to increment a singular iterator"); 74*4bdff4beSrobert _LIBCPP_ASSERT(__state_ != _AtEnd, 75*4bdff4beSrobert "attempting to increment the end iterator"); 76*4bdff4beSrobert return __increment(); 77*4bdff4beSrobert } 78*4bdff4beSrobert 79*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 80*4bdff4beSrobert iterator operator++(int) { 81*4bdff4beSrobert iterator __it(*this); 82*4bdff4beSrobert this->operator++(); 83*4bdff4beSrobert return __it; 84*4bdff4beSrobert } 85*4bdff4beSrobert 86*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 87*4bdff4beSrobert iterator& operator--() { 88*4bdff4beSrobert _LIBCPP_ASSERT(__state_ != _Singular, 89*4bdff4beSrobert "attempting to decrement a singular iterator"); 90*4bdff4beSrobert _LIBCPP_ASSERT(__entry_.data() != __path_ptr_->native().data(), 91*4bdff4beSrobert "attempting to decrement the begin iterator"); 92*4bdff4beSrobert return __decrement(); 93*4bdff4beSrobert } 94*4bdff4beSrobert 95*4bdff4beSrobert _LIBCPP_INLINE_VISIBILITY 96*4bdff4beSrobert iterator operator--(int) { 97*4bdff4beSrobert iterator __it(*this); 98*4bdff4beSrobert this->operator--(); 99*4bdff4beSrobert return __it; 100*4bdff4beSrobert } 101*4bdff4beSrobert 102*4bdff4beSrobert private: 103*4bdff4beSrobert friend class path; 104*4bdff4beSrobert 105*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY friend bool operator==(const iterator&, 106*4bdff4beSrobert const iterator&); 107*4bdff4beSrobert 108*4bdff4beSrobert iterator& __increment(); 109*4bdff4beSrobert iterator& __decrement(); 110*4bdff4beSrobert 111*4bdff4beSrobert path __stashed_elem_; 112*4bdff4beSrobert const path* __path_ptr_; 113*4bdff4beSrobert path::__string_view __entry_; 114*4bdff4beSrobert _ParserState __state_; 115*4bdff4beSrobert }; 116*4bdff4beSrobert 117*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY bool operator==(const path::iterator& __lhs, 118*4bdff4beSrobert const path::iterator& __rhs) { 119*4bdff4beSrobert return __lhs.__path_ptr_ == __rhs.__path_ptr_ && 120*4bdff4beSrobert __lhs.__entry_.data() == __rhs.__entry_.data(); 121*4bdff4beSrobert } 122*4bdff4beSrobert 123*4bdff4beSrobert inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const path::iterator& __lhs, 124*4bdff4beSrobert const path::iterator& __rhs) { 125*4bdff4beSrobert return !(__lhs == __rhs); 126*4bdff4beSrobert } 127*4bdff4beSrobert 128*4bdff4beSrobert _LIBCPP_AVAILABILITY_FILESYSTEM_POP 129*4bdff4beSrobert 130*4bdff4beSrobert _LIBCPP_END_NAMESPACE_FILESYSTEM 131*4bdff4beSrobert 132*4bdff4beSrobert #endif // _LIBCPP_CXX03_LANG 133*4bdff4beSrobert 134*4bdff4beSrobert #endif // _LIBCPP___FILESYSTEM_PATH_ITERATOR_H 135