Path: blob/main/contrib/llvm-project/libcxx/include/__filesystem/path_iterator.h
35262 views
// -*- C++ -*-1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#ifndef _LIBCPP___FILESYSTEM_PATH_ITERATOR_H10#define _LIBCPP___FILESYSTEM_PATH_ITERATOR_H1112#include <__assert>13#include <__config>14#include <__filesystem/path.h>15#include <__iterator/iterator_traits.h>16#include <cstddef>17#include <string>18#include <string_view>1920#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)21# pragma GCC system_header22#endif2324#if _LIBCPP_STD_VER >= 172526_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM2728class _LIBCPP_EXPORTED_FROM_ABI path::iterator {29public:30enum _ParserState : unsigned char {31_Singular,32_BeforeBegin,33_InRootName,34_InRootDir,35_InFilenames,36_InTrailingSep,37_AtEnd38};3940public:41typedef input_iterator_tag iterator_category;42typedef bidirectional_iterator_tag iterator_concept;4344typedef path value_type;45typedef ptrdiff_t difference_type;46typedef const path* pointer;47typedef path reference;4849public:50_LIBCPP_HIDE_FROM_ABI iterator() : __stashed_elem_(), __path_ptr_(nullptr), __entry_(), __state_(_Singular) {}5152_LIBCPP_HIDE_FROM_ABI iterator(const iterator&) = default;53_LIBCPP_HIDE_FROM_ABI ~iterator() = default;5455_LIBCPP_HIDE_FROM_ABI iterator& operator=(const iterator&) = default;5657_LIBCPP_HIDE_FROM_ABI reference operator*() const { return __stashed_elem_; }5859_LIBCPP_HIDE_FROM_ABI pointer operator->() const { return &__stashed_elem_; }6061_LIBCPP_HIDE_FROM_ABI iterator& operator++() {62_LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to increment a singular iterator");63_LIBCPP_ASSERT_UNCATEGORIZED(__state_ != _AtEnd, "attempting to increment the end iterator");64return __increment();65}6667_LIBCPP_HIDE_FROM_ABI iterator operator++(int) {68iterator __it(*this);69this->operator++();70return __it;71}7273_LIBCPP_HIDE_FROM_ABI iterator& operator--() {74_LIBCPP_ASSERT_NON_NULL(__state_ != _Singular, "attempting to decrement a singular iterator");75_LIBCPP_ASSERT_UNCATEGORIZED(76__entry_.data() != __path_ptr_->native().data(), "attempting to decrement the begin iterator");77return __decrement();78}7980_LIBCPP_HIDE_FROM_ABI iterator operator--(int) {81iterator __it(*this);82this->operator--();83return __it;84}8586private:87friend class path;8889inline _LIBCPP_HIDE_FROM_ABI friend bool operator==(const iterator&, const iterator&);9091iterator& __increment();92iterator& __decrement();9394path __stashed_elem_;95const path* __path_ptr_;96path::__string_view __entry_;97_ParserState __state_;98};99100_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY101inline _LIBCPP_HIDE_FROM_ABI bool operator==(const path::iterator& __lhs, const path::iterator& __rhs) {102return __lhs.__path_ptr_ == __rhs.__path_ptr_ && __lhs.__entry_.data() == __rhs.__entry_.data();103}104105_LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY106inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const path::iterator& __lhs, const path::iterator& __rhs) {107return !(__lhs == __rhs);108}109110_LIBCPP_END_NAMESPACE_FILESYSTEM111112#endif // _LIBCPP_STD_VER >= 17113114#endif // _LIBCPP___FILESYSTEM_PATH_ITERATOR_H115116117