xref: /llvm-project/libcxx/include/__filesystem/path_iterator.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
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