xref: /freebsd-src/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10eae32dcSDimitry Andric // -*- C++ -*-
20eae32dcSDimitry Andric //===----------------------------------------------------------------------===//
30eae32dcSDimitry Andric //
40eae32dcSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50eae32dcSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
60eae32dcSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70eae32dcSDimitry Andric //
80eae32dcSDimitry Andric //===----------------------------------------------------------------------===//
90eae32dcSDimitry Andric 
100eae32dcSDimitry Andric #ifndef _LIBCPP___FILESYSTEM_PATH_ITERATOR_H
110eae32dcSDimitry Andric #define _LIBCPP___FILESYSTEM_PATH_ITERATOR_H
120eae32dcSDimitry Andric 
1381ad6265SDimitry Andric #include <__assert>
140eae32dcSDimitry Andric #include <__config>
150eae32dcSDimitry Andric #include <__filesystem/path.h>
160eae32dcSDimitry Andric #include <__iterator/iterator_traits.h>
170eae32dcSDimitry Andric #include <cstddef>
180eae32dcSDimitry Andric #include <string>
190eae32dcSDimitry Andric #include <string_view>
200eae32dcSDimitry Andric 
2181ad6265SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2281ad6265SDimitry Andric #  pragma GCC system_header
2381ad6265SDimitry Andric #endif
2481ad6265SDimitry Andric 
255f757f3fSDimitry Andric #if _LIBCPP_STD_VER >= 17
260eae32dcSDimitry Andric 
270eae32dcSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM
280eae32dcSDimitry Andric 
2906c3fb27SDimitry Andric class _LIBCPP_EXPORTED_FROM_ABI path::iterator {
300eae32dcSDimitry Andric public:
310eae32dcSDimitry Andric   enum _ParserState : unsigned char {
320eae32dcSDimitry Andric     _Singular,
330eae32dcSDimitry Andric     _BeforeBegin,
340eae32dcSDimitry Andric     _InRootName,
350eae32dcSDimitry Andric     _InRootDir,
360eae32dcSDimitry Andric     _InFilenames,
370eae32dcSDimitry Andric     _InTrailingSep,
380eae32dcSDimitry Andric     _AtEnd
390eae32dcSDimitry Andric   };
400eae32dcSDimitry Andric 
410eae32dcSDimitry Andric public:
4204eeddc0SDimitry Andric   typedef input_iterator_tag iterator_category;
4304eeddc0SDimitry Andric   typedef bidirectional_iterator_tag iterator_concept;
440eae32dcSDimitry Andric 
450eae32dcSDimitry Andric   typedef path value_type;
460eae32dcSDimitry Andric   typedef ptrdiff_t difference_type;
470eae32dcSDimitry Andric   typedef const path* pointer;
4804eeddc0SDimitry Andric   typedef path reference;
490eae32dcSDimitry Andric 
500eae32dcSDimitry Andric public:
51cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator() : __stashed_elem_(), __path_ptr_(nullptr), __entry_(), __state_(_Singular) {}
520eae32dcSDimitry Andric 
5306c3fb27SDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator(const iterator&) = default;
5406c3fb27SDimitry Andric   _LIBCPP_HIDE_FROM_ABI ~iterator()               = default;
550eae32dcSDimitry Andric 
5606c3fb27SDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator& operator=(const iterator&) = default;
570eae32dcSDimitry Andric 
58cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI reference operator*() const { return __stashed_elem_; }
590eae32dcSDimitry Andric 
60cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI pointer operator->() const { return &__stashed_elem_; }
610eae32dcSDimitry Andric 
62cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator& operator++() {
63*1db9f3b2SDimitry Andric     _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to increment a singular iterator");
64cb14a3feSDimitry Andric     _LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _AtEnd, "attempting to increment the end iterator");
650eae32dcSDimitry Andric     return __increment();
660eae32dcSDimitry Andric   }
670eae32dcSDimitry Andric 
68cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator operator++(int) {
690eae32dcSDimitry Andric     iterator __it(*this);
700eae32dcSDimitry Andric     this->operator++();
710eae32dcSDimitry Andric     return __it;
720eae32dcSDimitry Andric   }
730eae32dcSDimitry Andric 
74cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator& operator--() {
75*1db9f3b2SDimitry Andric     _LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to decrement a singular iterator");
76cb14a3feSDimitry Andric     _LIBCPP_ASSERT_UNCATEGORIZED(
77cb14a3feSDimitry Andric         __entry_.data() != __path_ptr_->native().data(), "attempting to decrement the begin iterator");
780eae32dcSDimitry Andric     return __decrement();
790eae32dcSDimitry Andric   }
800eae32dcSDimitry Andric 
81cb14a3feSDimitry Andric   _LIBCPP_HIDE_FROM_ABI iterator operator--(int) {
820eae32dcSDimitry Andric     iterator __it(*this);
830eae32dcSDimitry Andric     this->operator--();
840eae32dcSDimitry Andric     return __it;
850eae32dcSDimitry Andric   }
860eae32dcSDimitry Andric 
870eae32dcSDimitry Andric private:
880eae32dcSDimitry Andric   friend class path;
890eae32dcSDimitry Andric 
90cb14a3feSDimitry Andric   inline _LIBCPP_HIDE_FROM_ABI friend bool operator==(const iterator&, const iterator&);
910eae32dcSDimitry Andric 
920eae32dcSDimitry Andric   iterator& __increment();
930eae32dcSDimitry Andric   iterator& __decrement();
940eae32dcSDimitry Andric 
950eae32dcSDimitry Andric   path __stashed_elem_;
960eae32dcSDimitry Andric   const path* __path_ptr_;
970eae32dcSDimitry Andric   path::__string_view __entry_;
980eae32dcSDimitry Andric   _ParserState __state_;
990eae32dcSDimitry Andric };
1000eae32dcSDimitry Andric 
10106c3fb27SDimitry Andric _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY
102cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI bool operator==(const path::iterator& __lhs, const path::iterator& __rhs) {
103cb14a3feSDimitry Andric   return __lhs.__path_ptr_ == __rhs.__path_ptr_ && __lhs.__entry_.data() == __rhs.__entry_.data();
1040eae32dcSDimitry Andric }
1050eae32dcSDimitry Andric 
10606c3fb27SDimitry Andric _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY
107cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const path::iterator& __lhs, const path::iterator& __rhs) {
1080eae32dcSDimitry Andric   return !(__lhs == __rhs);
1090eae32dcSDimitry Andric }
1100eae32dcSDimitry Andric 
1110eae32dcSDimitry Andric _LIBCPP_END_NAMESPACE_FILESYSTEM
1120eae32dcSDimitry Andric 
1135f757f3fSDimitry Andric #endif // _LIBCPP_STD_VER >= 17
1140eae32dcSDimitry Andric 
1150eae32dcSDimitry Andric #endif // _LIBCPP___FILESYSTEM_PATH_ITERATOR_H
116