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_U8PATH_H 117056250fSNikolas Klauser #define _LIBCPP___FILESYSTEM_U8PATH_H 127056250fSNikolas Klauser 13643df8faSLouis Dionne #include <__algorithm/unwrap_iter.h> 147056250fSNikolas Klauser #include <__config> 157056250fSNikolas Klauser #include <__filesystem/path.h> 16643df8faSLouis Dionne #include <string> 177056250fSNikolas Klauser 18643df8faSLouis Dionne // Only required on Windows for __widen_from_utf8, and included conservatively 19643df8faSLouis Dionne // because it requires support for localization. 20643df8faSLouis Dionne #if defined(_LIBCPP_WIN32API) 21643df8faSLouis Dionne # include <locale> 22643df8faSLouis Dionne #endif 23643df8faSLouis Dionne 24fa6b9e40SArthur O'Dwyer #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25fa6b9e40SArthur O'Dwyer # pragma GCC system_header 26fa6b9e40SArthur O'Dwyer #endif 27fa6b9e40SArthur O'Dwyer 28ac8c9f1eSLouis Dionne #if _LIBCPP_STD_VER >= 17 297056250fSNikolas Klauser 307056250fSNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 317056250fSNikolas Klauser 32dd72b813SLouis Dionne _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_PUSH 337056250fSNikolas Klauser 34475bd19eSNikolas Klauser template <class _InputIt, __enable_if_t<__is_pathable<_InputIt>::value, int> = 0> 359783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_WITH_CHAR8_T path u8path(_InputIt __f, _InputIt __l) { 367056250fSNikolas Klauser static_assert( 37*ba87515fSNikolas Klauser # if _LIBCPP_HAS_CHAR8_T 387056250fSNikolas Klauser is_same<typename __is_pathable<_InputIt>::__char_type, char8_t>::value || 397056250fSNikolas Klauser # endif 407056250fSNikolas Klauser is_same<typename __is_pathable<_InputIt>::__char_type, char>::value, 417056250fSNikolas Klauser "u8path(Iter, Iter) requires Iter have a value_type of type 'char'" 427056250fSNikolas Klauser " or 'char8_t'"); 437056250fSNikolas Klauser # if defined(_LIBCPP_WIN32API) 447056250fSNikolas Klauser string __tmp(__f, __l); 457056250fSNikolas Klauser using _CVT = __widen_from_utf8<sizeof(wchar_t) * __CHAR_BIT__>; 4677a00c0dSLouis Dionne std::wstring __w; 477056250fSNikolas Klauser __w.reserve(__tmp.size()); 487056250fSNikolas Klauser _CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size()); 497056250fSNikolas Klauser return path(__w); 507056250fSNikolas Klauser # else 517056250fSNikolas Klauser return path(__f, __l); 527056250fSNikolas Klauser # endif /* !_LIBCPP_WIN32API */ 537056250fSNikolas Klauser } 547056250fSNikolas Klauser 557056250fSNikolas Klauser # if defined(_LIBCPP_WIN32API) 56475bd19eSNikolas Klauser template <class _InputIt, __enable_if_t<__is_pathable<_InputIt>::value, int> = 0> 579783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_WITH_CHAR8_T path u8path(_InputIt __f, _NullSentinel) { 587056250fSNikolas Klauser static_assert( 59*ba87515fSNikolas Klauser # if _LIBCPP_HAS_CHAR8_T 607056250fSNikolas Klauser is_same<typename __is_pathable<_InputIt>::__char_type, char8_t>::value || 617056250fSNikolas Klauser # endif 627056250fSNikolas Klauser is_same<typename __is_pathable<_InputIt>::__char_type, char>::value, 637056250fSNikolas Klauser "u8path(Iter, Iter) requires Iter have a value_type of type 'char'" 647056250fSNikolas Klauser " or 'char8_t'"); 657056250fSNikolas Klauser string __tmp; 667056250fSNikolas Klauser const char __sentinel = char{}; 677056250fSNikolas Klauser for (; *__f != __sentinel; ++__f) 687056250fSNikolas Klauser __tmp.push_back(*__f); 697056250fSNikolas Klauser using _CVT = __widen_from_utf8<sizeof(wchar_t) * __CHAR_BIT__>; 7077a00c0dSLouis Dionne std::wstring __w; 717056250fSNikolas Klauser __w.reserve(__tmp.size()); 727056250fSNikolas Klauser _CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size()); 737056250fSNikolas Klauser return path(__w); 747056250fSNikolas Klauser } 757056250fSNikolas Klauser # endif /* _LIBCPP_WIN32API */ 767056250fSNikolas Klauser 77475bd19eSNikolas Klauser template <class _Source, __enable_if_t<__is_pathable<_Source>::value, int> = 0> 789783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_WITH_CHAR8_T path u8path(const _Source& __s) { 797056250fSNikolas Klauser static_assert( 80*ba87515fSNikolas Klauser # if _LIBCPP_HAS_CHAR8_T 817056250fSNikolas Klauser is_same<typename __is_pathable<_Source>::__char_type, char8_t>::value || 827056250fSNikolas Klauser # endif 837056250fSNikolas Klauser is_same<typename __is_pathable<_Source>::__char_type, char>::value, 847056250fSNikolas Klauser "u8path(Source const&) requires Source have a character type of type " 857056250fSNikolas Klauser "'char' or 'char8_t'"); 867056250fSNikolas Klauser # if defined(_LIBCPP_WIN32API) 877056250fSNikolas Klauser using _Traits = __is_pathable<_Source>; 8877a00c0dSLouis Dionne return u8path(std::__unwrap_iter(_Traits::__range_begin(__s)), std::__unwrap_iter(_Traits::__range_end(__s))); 897056250fSNikolas Klauser # else 907056250fSNikolas Klauser return path(__s); 917056250fSNikolas Klauser # endif 927056250fSNikolas Klauser } 937056250fSNikolas Klauser 94dd72b813SLouis Dionne _LIBCPP_AVAILABILITY_FILESYSTEM_LIBRARY_POP 957056250fSNikolas Klauser 967056250fSNikolas Klauser _LIBCPP_END_NAMESPACE_FILESYSTEM 977056250fSNikolas Klauser 98ac8c9f1eSLouis Dionne #endif // _LIBCPP_STD_VER >= 17 997056250fSNikolas Klauser 1007056250fSNikolas Klauser #endif // _LIBCPP___FILESYSTEM_U8PATH_H 101