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