30#ifndef _GLIBCXX_EXPERIMENTAL_FS_PATH_H
31#define _GLIBCXX_EXPERIMENTAL_FS_PATH_H 1
33#if __cplusplus < 201103L
47#if __cplusplus == 201402L
51#if defined(_WIN32) && !defined(__CYGWIN__)
52# define _GLIBCXX_FILESYSTEM_IS_WINDOWS 1
56namespace std _GLIBCXX_VISIBILITY(default)
58_GLIBCXX_BEGIN_NAMESPACE_VERSION
66_GLIBCXX_BEGIN_NAMESPACE_CXX11
68#if __cplusplus == 201402L
70#elif __cplusplus > 201402L
71 using std::basic_string_view;
81 template<
typename _CharT,
82 typename _Ch =
typename remove_const<_CharT>::type>
83 using __is_encoded_char
84 = __or_<is_same<_Ch, char>,
85 is_same<_Ch, wchar_t>,
86#ifdef _GLIBCXX_USE_CHAR8_T
87 is_same<_Ch, char8_t>,
89 is_same<_Ch, char16_t>,
90 is_same<_Ch, char32_t>>;
92 template<
typename _Iter,
94 using __is_path_iter_src
95 = __and_<__is_encoded_char<typename _Iter_traits::value_type>,
97 typename _Iter_traits::iterator_category>>;
99 template<
typename _Iter>
100 static __is_path_iter_src<_Iter>
101 __is_path_src(_Iter,
int);
103 template<
typename _CharT,
typename _Traits,
typename _Alloc>
104 static __is_encoded_char<_CharT>
105 __is_path_src(
const basic_string<_CharT, _Traits, _Alloc>&,
int);
107#if __cplusplus >= 201402L
108 template<
typename _CharT,
typename _Traits>
109 static __is_encoded_char<_CharT>
110 __is_path_src(
const basic_string_view<_CharT, _Traits>&,
int);
113 template<
typename _Unknown>
115 __is_path_src(
const _Unknown&, ...);
117 template<
typename _Tp1,
typename _Tp2>
118 struct __constructible_from;
120 template<
typename _Iter>
121 struct __constructible_from<_Iter, _Iter>
122 : __is_path_iter_src<_Iter>
125 template<
typename _Source>
126 struct __constructible_from<_Source, void>
127 : decltype(__is_path_src(std::declval<const _Source&>(), 0))
130 template<
typename _Tp1,
typename _Tp2 = void,
131 typename _Tp1_nocv =
typename remove_cv<_Tp1>::type,
132 typename _Tp1_noptr =
typename remove_pointer<_Tp1>::type>
133 using _Path =
typename
135 __not_<is_void<_Tp1_noptr>>,
136 __constructible_from<_Tp1, _Tp2>>::value,
139 template<
typename _Source>
141 _S_range_begin(_Source __begin) {
return __begin; }
143 struct __nul_terminated { };
145 template<
typename _Source>
146 inline __nul_terminated
147 _S_range_end(_Source) {
return {}; }
149 template<
typename _CharT,
typename _Traits,
typename _Alloc>
151 _S_range_begin(
const basic_string<_CharT, _Traits, _Alloc>& __str)
152 {
return __str.data(); }
154 template<
typename _CharT,
typename _Traits,
typename _Alloc>
156 _S_range_end(
const basic_string<_CharT, _Traits, _Alloc>& __str)
157 {
return __str.data() + __str.size(); }
159#if __cplusplus >= 201402L
160 template<
typename _CharT,
typename _Traits>
162 _S_range_begin(
const basic_string_view<_CharT, _Traits>& __str)
163 {
return __str.data(); }
165 template<
typename _CharT,
typename _Traits>
167 _S_range_end(
const basic_string_view<_CharT, _Traits>& __str)
168 {
return __str.data() + __str.size(); }
171 template<
typename _Tp,
174 typename _UnqualVal =
typename std::remove_const<_Val>::type>
179 template<
typename _Tp,
182 typename _UnqualVal =
typename std::remove_const<_Val>::type>
186#ifdef _GLIBCXX_USE_CHAR8_T
189 >::value, _UnqualVal>::type;
198#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
199 typedef wchar_t value_type;
200 static constexpr value_type preferred_separator =
L'\\';
202 typedef char value_type;
203 static constexpr value_type preferred_separator =
'/';
214 : _M_pathname(
std::move(__p._M_pathname)), _M_type(__p._M_type)
216 if (_M_type == _Type::_Multi)
223 { _M_split_cmpts(); }
226 typename _Require = __detail::_Path<_Source>>
228 : _M_pathname(_S_convert(__detail::_S_range_begin(
__source),
230 { _M_split_cmpts(); }
233 typename _Require = __detail::_Path<_InputIterator, _InputIterator>>
235 : _M_pathname(_S_convert(__first, __last))
236 { _M_split_cmpts(); }
239 typename _Require = __detail::_Path<_Source>,
240 typename _Require2 = __detail::__value_type_is_char<_Source>>
242 : _M_pathname(_S_convert_loc(__detail::_S_range_begin(
__source),
244 { _M_split_cmpts(); }
247 typename _Require = __detail::_Path<_InputIterator, _InputIterator>,
248 typename _Require2 = __detail::__value_type_is_char<_InputIterator>>
250 : _M_pathname(_S_convert_loc(__first, __last,
__loc))
251 { _M_split_cmpts(); }
257 path& operator=(
const path& __p) =
default;
258 path& operator=(
path&& __p)
noexcept;
262 template<
typename _Source>
263 __detail::_Path<_Source>&
267 template<
typename _Source>
268 __detail::_Path<_Source>&
272 template<
typename _InputIterator>
273 __detail::_Path<_InputIterator, _InputIterator>&
275 {
return *
this =
path(__first, __last); }
279 path& operator/=(
const path& __p) {
return _M_append(__p._M_pathname); }
281 template<
typename _Source>
282 __detail::_Path<_Source>&
286 template<
typename _Source>
287 __detail::_Path<_Source>&
290 return _M_append(_S_convert(__detail::_S_range_begin(
__source),
294 template<
typename _InputIterator>
295 __detail::_Path<_InputIterator, _InputIterator>&
297 {
return _M_append(_S_convert(__first, __last)); }
302 path& operator+=(
const string_type& __x);
303 path& operator+=(
const value_type* __x);
304 path& operator+=(value_type __x);
305#if __cplusplus >= 201402L
309 template<
typename _Source>
310 __detail::_Path<_Source>&
311 operator+=(
_Source const& __x) {
return concat(__x); }
313 template<
typename _CharT>
314 __detail::_Path<_CharT*, _CharT*>&
315 operator+=(_CharT __x);
317 template<
typename _Source>
318 __detail::_Path<_Source>&
321 return *
this += _S_convert(__detail::_S_range_begin(__x),
322 __detail::_S_range_end(__x));
325 template<
typename _InputIterator>
326 __detail::_Path<_InputIterator, _InputIterator>&
328 {
return *
this += _S_convert(__first, __last); }
332 void clear()
noexcept { _M_pathname.clear(); _M_split_cmpts(); }
334 path& make_preferred();
335 path& remove_filename();
343 const string_type& native()
const noexcept {
return _M_pathname; }
344 const value_type* c_str()
const noexcept {
return _M_pathname.c_str(); }
345 operator string_type()
const {
return _M_pathname; }
347 template<
typename _CharT,
typename _Traits = std::
char_traits<_CharT>,
348 typename _Allocator = std::allocator<_CharT>>
353#if _GLIBCXX_USE_WCHAR_T
356#ifdef _GLIBCXX_USE_CHAR8_T
358 std::u8string u8string()
const;
366 template<
typename _CharT,
typename _Traits = std::
char_traits<_CharT>,
367 typename _Allocator = std::allocator<_CharT>>
372#if _GLIBCXX_USE_WCHAR_T
375#ifdef _GLIBCXX_USE_CHAR8_T
377 std::u8string generic_u8string()
const;
386 int compare(
const path& __p)
const noexcept;
387 int compare(
const string_type&
__s)
const;
388 int compare(
const value_type*
__s)
const;
389#if __cplusplus >= 201402L
395 path root_name()
const;
396 path root_directory()
const;
397 path root_path()
const;
398 path relative_path()
const;
399 path parent_path()
const;
400 path filename()
const;
402 path extension()
const;
406 _GLIBCXX_NODISCARD
bool empty()
const noexcept {
return _M_pathname.empty(); }
407 bool has_root_name()
const;
408 bool has_root_directory()
const;
409 bool has_root_path()
const;
410 bool has_relative_path()
const;
411 bool has_parent_path()
const;
412 bool has_filename()
const;
413 bool has_stem()
const;
414 bool has_extension()
const;
415 bool is_absolute()
const;
416 bool is_relative()
const {
return !is_absolute(); }
430 =
typename std::remove_cv<typename _Traits::value_type>::type>
442 enum class _Type :
unsigned char {
443 _Multi, _Root_name, _Root_dir, _Filename
446 path(string_type
__str, _Type __type) : _M_pathname(
__str), _M_type(__type)
448 __glibcxx_assert(!empty());
449 __glibcxx_assert(_M_type != _Type::_Multi);
452 enum class _Split { _Stem, _Extension };
454 path& _M_append(
const string_type&
__str)
456 if (!_M_pathname.empty() && !_S_is_dir_sep(_M_pathname.back())
457 && !
__str.empty() && !_S_is_dir_sep(
__str.front()))
458 _M_pathname += preferred_separator;
459 _M_pathname +=
__str;
466 template<
typename _CharT>
470 _S_convert(value_type*
__src, __detail::__nul_terminated)
471 {
return string_type(
__src); }
474 _S_convert(
const value_type*
__src, __detail::__nul_terminated)
475 {
return string_type(
__src); }
477 template<
typename _Iter>
479 _S_convert(_Iter __first, _Iter __last)
483 _S_convert(__first, __last);
486 template<
typename _InputIterator>
491 return _S_convert(
__s.c_str(),
__s.c_str() +
__s.size());
495 _S_convert_loc(
const char* __first,
const char* __last,
498 template<
typename _Iter>
506 template<
typename _InputIterator>
512 return _S_convert_loc(
__s.data(),
__s.data() +
__s.size(),
__loc);
515 static bool _S_is_dir_sep(value_type
__ch)
517#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
518 return __ch ==
L'/' ||
__ch == preferred_separator;
524 void _M_split_cmpts();
526 void _M_add_root_name(
size_t __n);
527 void _M_add_root_dir(
size_t __pos);
528 void _M_add_filename(
size_t __pos,
size_t __n);
530 string_type _M_pathname;
533 using _List = _GLIBCXX_STD_C::vector<_Cmpt>;
535 _Type _M_type = _Type::_Multi;
555 inline bool operator>(
const path& __lhs,
const path& __rhs)
noexcept
556 {
return __rhs < __lhs; }
559 inline bool operator>=(
const path& __lhs,
const path& __rhs)
noexcept
560 {
return !(__lhs < __rhs); }
563 inline bool operator==(
const path& __lhs,
const path& __rhs)
noexcept
564 {
return __lhs.compare(__rhs) == 0; }
567 inline bool operator!=(
const path& __lhs,
const path& __rhs)
noexcept
568 {
return !(__lhs == __rhs); }
571 inline path
operator/(
const path& __lhs,
const path& __rhs)
573 path __result(__lhs);
579 template<
typename _CharT,
typename _Traits>
580 basic_ostream<_CharT, _Traits>&
581 operator<<(basic_ostream<_CharT, _Traits>& __os,
const path& __p)
583 auto __tmp = __p.string<_CharT, _Traits>();
584 using __quoted_string
586 __os << __quoted_string{__tmp, _CharT(
'"'), _CharT(
'\\')};
591 template<
typename _CharT,
typename _Traits>
592 basic_istream<_CharT, _Traits>&
593 operator>>(basic_istream<_CharT, _Traits>& __is, path& __p)
595 basic_string<_CharT, _Traits> __tmp;
596 using __quoted_string
598 if (__is >> __quoted_string{ __tmp, _CharT(
'"'), _CharT(
'\\') })
604#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
605 template<
typename _InputIterator>
607 __u8path(_InputIterator __first, _InputIterator __last,
char)
611 path::string_type __tmp;
613 const char*
const __ptr = __u8str.
data();
614 if (__str_codecvt_in_all(__ptr, __ptr + __u8str.size(), __tmp, __cvt))
615 return path{ __tmp };
616 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
617 "Cannot convert character sequence",
618 std::make_error_code(errc::illegal_byte_sequence)));
621#ifdef _GLIBCXX_USE_CHAR8_T
622 template<
typename _InputIterator>
624 __u8path(_InputIterator __first, _InputIterator __last,
char8_t)
626 return path{ __first, __last };
631 template<
typename _InputIterator,
632 typename _Require = __detail::_Path<_InputIterator, _InputIterator>,
634 __detail::__value_type_is_char_or_char8_t<_InputIterator>>
636 u8path(_InputIterator __first, _InputIterator __last)
638#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
639 return __u8path(__first, __last, _CharT{});
641 return path{ __first, __last };
646#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
648 __u8path(
const string& __s,
char)
650 return filesystem::u8path(__s.data(), __s.data() + __s.size());
653 template<
typename _Source>
654 inline __enable_if_t<is_convertible<const _Source&, string>::value, path>
655 __u8path(
const _Source& __source,
char)
658 return filesystem::u8path(__s.
data(), __s.
data() + __s.
size());
661 template<
typename _Source>
662 inline __enable_if_t<!is_convertible<const _Source&, string>::value, path>
663 __u8path(
const _Source& __source,
char)
665 std::string __s = path::_S_string_from_iter(__source);
666 return filesystem::u8path(__s.
data(), __s.
data() + __s.
size());
669#ifdef _GLIBCXX_USE_CHAR8_T
670 template<
typename _Source>
672 __u8path(
const _Source& __source,
char8_t)
674 return path{ __source };
679 template<
typename _Source,
680 typename _Require = __detail::_Path<_Source>,
682 __detail::__value_type_is_char_or_char8_t<_Source>>
684 u8path(
const _Source& __source)
686#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
687 return __u8path(__source, _CharT{});
689 return path{ __source };
713 const path& path1()
const noexcept {
return _M_path1; }
714 const path& path2()
const noexcept {
return _M_path2; }
726 struct path::_Cmpt :
path
731 _Cmpt() : _M_pos(-1) { }
738 struct path::_Cvt<path::value_type>
740 template<
typename _Iter>
742 _S_convert(_Iter __first, _Iter __last)
743 {
return string_type{__first, __last}; }
746 template<
typename _CharT>
749#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
750#ifdef _GLIBCXX_USE_CHAR8_T
752 _S_wconvert(
const char8_t* __f,
const char8_t* __l,
const char8_t*)
754 const char* __f2 = (
const char*)__f;
755 const char* __l2 = (
const char*)__l;
758 if (__str_codecvt_in_all(__f2, __l2, __wstr, __wcvt))
764 _S_wconvert(
const char* __f,
const char* __l,
const char*)
769 if (__str_codecvt_in_all(__f, __l, __wstr, __cvt))
771 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
772 "Cannot convert character sequence",
773 std::make_error_code(errc::illegal_byte_sequence)));
777 _S_wconvert(
const _CharT* __f,
const _CharT* __l,
const void*)
779 struct _UCvt :
std::codecvt<_CharT, char, std::mbstate_t>
782 if (__str_codecvt_out_all(__f, __l, __str, __cvt))
784 const char* __f2 = __str.
data();
785 const char* __l2 = __f2 + __str.
size();
788 if (__str_codecvt_in_all(__f2, __l2, __wstr, __wcvt))
791 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
792 "Cannot convert character sequence",
793 std::make_error_code(errc::illegal_byte_sequence)));
797 _S_convert(
const _CharT* __f,
const _CharT* __l)
799 return _S_wconvert(__f, __l, (
const _CharT*)
nullptr);
803 _S_convert(
const _CharT* __f,
const _CharT* __l)
805#ifdef _GLIBCXX_USE_CHAR8_T
806 if constexpr (is_same<_CharT, char8_t>::value)
807 return string_type(__f, __l);
811 struct _UCvt :
std::codecvt<_CharT, char, std::mbstate_t>
814 if (__str_codecvt_out_all(__f, __l, __str, __cvt))
816 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
817 "Cannot convert character sequence",
818 std::make_error_code(errc::illegal_byte_sequence)));
824 _S_convert(_CharT* __f, _CharT* __l)
826 return _S_convert(
const_cast<const _CharT*
>(__f),
827 const_cast<const _CharT*
>(__l));
830 template<
typename _Iter>
832 _S_convert(_Iter __first, _Iter __last)
835 return _S_convert(__str.
data(), __str.
data() + __str.
size());
838 template<
typename _Iter,
typename _Cont>
840 _S_convert(__gnu_cxx::__normal_iterator<_Iter, _Cont> __first,
841 __gnu_cxx::__normal_iterator<_Iter, _Cont> __last)
842 {
return _S_convert(__first.base(), __last.base()); }
856 iterator() : _M_path(
nullptr), _M_cur(), _M_at_end() { }
880 : _M_path(
__path), _M_cur(__iter), _M_at_end()
890 path::_List::const_iterator _M_cur;
896 path::operator=(
path&& __p)
noexcept
898 _M_pathname =
std::move(__p._M_pathname);
900 _M_type = __p._M_type;
906 path::operator=(string_type&&
__source)
910 path::assign(string_type&&
__source)
914 path::operator+=(
const path& __p)
916 return operator+=(__p.native());
920 path::operator+=(
const string_type& __x)
928 path::operator+=(
const value_type* __x)
936 path::operator+=(value_type __x)
943#if __cplusplus >= 201402L
945 path::operator+=(basic_string_view<value_type> __x)
947 _M_pathname.
append(__x.data(), __x.size());
953 template<
typename _CharT>
954 inline __detail::_Path<_CharT*, _CharT*>&
955 path::operator+=(_CharT __x)
958 return concat(__addr, __addr + 1);
962 path::make_preferred()
964#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
965 std::replace(_M_pathname.
begin(), _M_pathname.
end(), L
'/',
966 preferred_separator);
971 inline void path::swap(path& __rhs)
noexcept
973 _M_pathname.swap(__rhs._M_pathname);
974 _M_cmpts.swap(__rhs._M_cmpts);
975 std::swap(_M_type, __rhs._M_type);
978 template<
typename _CharT,
typename _Traits,
typename _Allocator>
980 path::string(
const _Allocator& __a)
const
982 if (is_same<_CharT, value_type>::value)
983 return { _M_pathname.
begin(), _M_pathname.
end(), __a };
985 using _WString = basic_string<_CharT, _Traits, _Allocator>;
987 const value_type* __first = _M_pathname.
data();
988 const value_type* __last = __first + _M_pathname.
size();
990#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
991 using _CharAlloc = __alloc_rebind<_Allocator, char>;
992 using _String = basic_string<char, char_traits<char>, _CharAlloc>;
996 codecvt_utf8_utf16<value_type> __cvt;
997 _String __u8str{_CharAlloc{__a}};
998 if (__str_codecvt_out_all(__first, __last, __u8str, __cvt))
1003 operator()(
const _String& __from, _String&,
true_type)
1007 operator()(
const _String& __from, _WString& __to,
false_type)
1009#ifdef _GLIBCXX_USE_CHAR8_T
1010 if constexpr (is_same<_CharT, char8_t>::value)
1012 __to.assign(__from.begin(), __from.end());
1019 struct _UCvt :
std::codecvt<_CharT, char, std::mbstate_t>
1021 const char* __f = __from.data();
1022 const char* __l = __f + __from.size();
1023 if (__str_codecvt_in_all(__f, __l, __to, __cvt))
1029 _WString __wstr(__a);
1030 if (
auto* __p = __dispatch(__u8str, __wstr, is_same<_CharT, char>{}))
1034#ifdef _GLIBCXX_USE_CHAR8_T
1035 if constexpr (is_same<_CharT, char8_t>::value)
1036 return _WString(__first, __last, __a);
1040 struct _UCvt :
std::codecvt<_CharT, char, std::mbstate_t> { } __cvt;
1041 _WString __wstr(__a);
1042 if (__str_codecvt_in_all(__first, __last, __wstr, __cvt))
1046 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
1047 "Cannot convert character sequence",
1048 std::make_error_code(errc::illegal_byte_sequence)));
1052 path::string()
const {
return string<char>(); }
1054#if _GLIBCXX_USE_WCHAR_T
1056 path::wstring()
const {
return string<wchar_t>(); }
1059#ifdef _GLIBCXX_USE_CHAR8_T
1060 inline std::u8string
1061 path::u8string()
const {
return string<char8_t>(); }
1064 path::u8string()
const
1066#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
1070 const value_type* __first = _M_pathname.
data();
1071 const value_type* __last = __first + _M_pathname.
size();
1072 if (__str_codecvt_out_all(__first, __last, __str, __cvt))
1074 _GLIBCXX_THROW_OR_ABORT(filesystem_error(
1075 "Cannot convert character sequence",
1076 std::make_error_code(errc::illegal_byte_sequence)));
1084 path::u16string()
const {
return string<char16_t>(); }
1087 path::u32string()
const {
return string<char32_t>(); }
1089 template<
typename _CharT,
typename _Traits,
typename _Allocator>
1091 path::generic_string(
const _Allocator& __a)
const
1093#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
1094 const _CharT __slash = is_same<_CharT, wchar_t>::value
1098 const _CharT __slash = _CharT(
'/');
1100 basic_string<_CharT, _Traits, _Allocator> __str(__a);
1102 bool __add_slash =
false;
1103 for (
auto& __elem : *this)
1105 if (__elem._M_type == _Type::_Root_dir)
1112 __str += __elem.string<_CharT, _Traits, _Allocator>(__a);
1113 __add_slash = __elem._M_type == _Type::_Filename;
1119 path::generic_string()
const {
return generic_string<char>(); }
1121#if _GLIBCXX_USE_WCHAR_T
1123 path::generic_wstring()
const {
return generic_string<wchar_t>(); }
1126#ifdef _GLIBCXX_USE_CHAR8_T
1127 inline std::u8string
1128 path::generic_u8string()
const {
return generic_string<char8_t>(); }
1131 path::generic_u8string()
const {
return generic_string<char>(); }
1135 path::generic_u16string()
const {
return generic_string<char16_t>(); }
1138 path::generic_u32string()
const {
return generic_string<char32_t>(); }
1141 path::compare(
const string_type& __s)
const {
return compare(path(__s)); }
1144 path::compare(
const value_type* __s)
const {
return compare(path(__s)); }
1146#if __cplusplus >= 201402L
1148 path::compare(basic_string_view<value_type> __s)
const
1149 {
return compare(path(__s)); }
1153 path::filename()
const {
return empty() ? path() : *--end(); }
1158 auto ext = _M_find_extension();
1159 if (ext.first && ext.second != 0)
1160 return path{ext.first->substr(0, ext.second)};
1165 path::extension()
const
1167 auto ext = _M_find_extension();
1169 return path{ext.first->substr(ext.second)};
1174 path::has_stem()
const
1176 auto ext = _M_find_extension();
1177 return ext.first && ext.second != 0;
1181 path::has_extension()
const
1183 auto ext = _M_find_extension();
1188 path::is_absolute()
const
1190#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
1191 return has_root_name() && has_root_directory();
1193 return has_root_directory();
1197 inline path::iterator
1200 if (_M_type == _Type::_Multi)
1201 return iterator(
this, _M_cmpts.
begin());
1202 return iterator(
this,
false);
1205 inline path::iterator
1208 if (_M_type == _Type::_Multi)
1209 return iterator(
this, _M_cmpts.
end());
1210 return iterator(
this,
true);
1213 inline path::iterator&
1214 path::iterator::operator++()
1216 __glibcxx_assert(_M_path !=
nullptr);
1217 if (_M_path->_M_type == _Type::_Multi)
1219 __glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
1224 __glibcxx_assert(!_M_at_end);
1230 inline path::iterator&
1231 path::iterator::operator--()
1233 __glibcxx_assert(_M_path !=
nullptr);
1234 if (_M_path->_M_type == _Type::_Multi)
1236 __glibcxx_assert(_M_cur != _M_path->_M_cmpts.begin());
1241 __glibcxx_assert(_M_at_end);
1247 inline path::iterator::reference
1248 path::iterator::operator*()
const
1250 __glibcxx_assert(_M_path !=
nullptr);
1251 if (_M_path->_M_type == _Type::_Multi)
1253 __glibcxx_assert(_M_cur != _M_path->_M_cmpts.end());
1260 path::iterator::_M_equals(iterator __rhs)
const
1262 if (_M_path != __rhs._M_path)
1264 if (_M_path ==
nullptr)
1266 if (_M_path->_M_type == path::_Type::_Multi)
1267 return _M_cur == __rhs._M_cur;
1268 return _M_at_end == __rhs._M_at_end;
1272_GLIBCXX_END_NAMESPACE_CXX11
1277_GLIBCXX_END_NAMESPACE_VERSION
constexpr complex< _Tp > operator/(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x divided by y.
integral_constant< bool, true > true_type
The type used as a compile-time boolean with true value.
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
_Tp * end(valarray< _Tp > &__va) noexcept
Return an iterator pointing to one past the last element of the valarray.
_Tp * begin(valarray< _Tp > &__va) noexcept
Return an iterator pointing to the first element of the valarray.
basic_string< char > string
A string of char.
basic_string< char32_t > u32string
A string of char32_t.
basic_string< char16_t > u16string
A string of char16_t.
basic_string< wchar_t > wstring
A string of wchar_t.
ISO C++ entities toplevel namespace is std.
std::basic_istream< _CharT, _Traits > & operator>>(std::basic_istream< _CharT, _Traits > &__is, bitset< _Nb > &__x)
Global I/O operators for bitsets.
std::basic_ostream< _CharT, _Traits > & operator<<(std::basic_ostream< _CharT, _Traits > &__os, const bitset< _Nb > &__x)
Global I/O operators for bitsets.
An exception type that includes an error_code value.
Define a member typedef type only if a boolean constant is true.
const _CharT * data() const noexcept
Return const pointer to contents.
void reserve(size_type __res_arg=0)
Attempt to preallocate enough memory for specified number of characters.
size_type size() const noexcept
Returns the number of characters in the string, not including any null-termination.
basic_string & append(const basic_string &__str)
Append a string to this string.
const _CharT * c_str() const noexcept
Return const pointer to null-terminated contents.
static const size_type npos
Value returned by various member functions when they fail.
Primary class template codecvt.
Traits class for iterators.
Container class for localization functionality.
Struct for delimited strings.
Bidirectional iterators support a superset of forward iterator operations.
iterator begin() noexcept
Exception type thrown by the Filesystem TS library.
const char * what() const noexcept
An iterator for the components of a path.
A non-owning reference to a string.