LLFIO v2.00
Loading...
Searching...
No Matches
llfio_v2_xxx::path_view Class Reference

A borrowed view of a path. A lightweight trivial-type alternative to std::filesystem::path. More...

#include "path_view.hpp"

Inheritance diagram for llfio_v2_xxx::path_view:
llfio_v2_xxx::path_view_component

Public Types

using const_iterator = detail::path_view_iterator
 Const iterator type.
 
using iterator = const_iterator
 iterator type
 
using reverse_iterator = std::reverse_iterator< iterator >
 Reverse iterator.
 
using const_reverse_iterator = std::reverse_iterator< const_iterator >
 Const reverse iterator.
 
using size_type = path_view_component::size_type
 Size type.
 
using difference_type = std::ptrdiff_t
 Difference type.
 
enum  format : uint8_t {
  unknown , native_format , generic_format , auto_format ,
  binary_format
}
 How to interpret separators. More...
 
enum  termination { zero_terminated , not_zero_terminated }
 The zero termination to use. More...
 
using byte = llfio_v2_xxx ::byte
 Character type for passthrough input.
 
using char16_t = detail::char16_t
 
template<class T >
using default_rendered_path_deleter = std::default_delete< T >
 The default deleter to use.
 
template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size>
using zero_terminated_rendered_path = rendered_path< termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size >
 Convenience type alias.
 
template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size>
using not_zero_terminated_rendered_path = rendered_path< termination::not_zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size >
 Convenience type alias.
 

Public Member Functions

constexpr path_view ()
 Constructs an empty path view.
 
constexpr path_view (path_view_component p, format fmt=auto_format) noexcept
 Constructs a path view component identical to the input, except with different format interpretation.
 
 path_view (const filesystem::path &v, format fmt=auto_format) noexcept
 
template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr path_view (const std::basic_string< Char > &v, format fmt=auto_format) noexcept
 
constexpr path_view (const char *b, size_t l, enum termination zt, format fmt=auto_format) noexcept
 
constexpr path_view (const wchar_t *b, size_t l, enum termination zt, format fmt=auto_format) noexcept
 
constexpr path_view (const char8_t *b, size_t l, enum termination zt, format fmt=auto_format) noexcept
 
constexpr path_view (const char16_t *b, size_t l, enum termination zt, format fmt=auto_format) noexcept
 
constexpr path_view (const byte *b, size_t l, enum termination zt) noexcept
 
template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr path_view (const Char *s, format fmt=auto_format) noexcept
 
constexpr path_view (const byte *s) noexcept
 
template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr path_view (basic_string_view< Char > v, enum termination zt, format fmt=auto_format) noexcept
 
constexpr path_view (span< const byte > v, enum termination zt) noexcept
 
template<class It , class End , typename std::enable_if<(is_source_chartype_acceptable< typename It::value_type >), bool >::type = true, typename std::enable_if<(is_source_chartype_acceptable< typename End::value_type >), bool >::type = true>
constexpr path_view (It b, End e, enum termination zt, format fmt=auto_format) noexcept
 
template<class It , class End , typename std::enable_if<(is_source_chartype_acceptable< std::decay_t< It > >), bool >::type = true, typename std::enable_if<(is_source_chartype_acceptable< std::decay_t< End > >), bool >::type = true>
constexpr path_view (It *b, End *e, enum termination zt, format fmt=auto_format) noexcept
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 
template<class It , class End , typename std::enable_if<(std::is_same< typename It::value_type, byte >::value), bool >::type = true, typename std::enable_if<(std::is_same< typename End::value_type, byte >::value), bool >::type = true>
constexpr path_view (It b, End e, enum termination zt) noexcept
 
template<class It , class End , typename std::enable_if<(std::is_same< std::decay_t< It >, byte >::value), bool >::type = true, typename std::enable_if<(std::is_same< std::decay_t< End >, byte >::value), bool >::type = true>
constexpr path_view (It *b, End *e, enum termination zt) noexcept
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 
 path_view (const path_view &)=default
 Default copy constructor.
 
 path_view (path_view &&o) noexcept=default
 Default move constructor.
 
path_viewoperator= (const path_view &p)=default
 Default copy assignment.
 
path_viewoperator= (path_view &&p) noexcept=default
 Default move assignment.
 
constexpr bool has_root_path () const noexcept
 True if has root path.
 
constexpr bool has_root_name () const noexcept
 True if has root name.
 
constexpr bool has_root_directory () const noexcept
 True if has root directory.
 
constexpr bool has_relative_path () const noexcept
 True if has relative path.
 
constexpr bool has_parent_path () const noexcept
 True if has parent path.
 
constexpr bool has_filename () const noexcept
 True if has filename.
 
constexpr bool is_absolute () const noexcept
 True if absolute.
 
constexpr bool is_relative () const noexcept
 True if relative.
 
constexpr const_iterator cbegin () const noexcept
 Returns an iterator to the first path component.
 
constexpr const_iterator begin () const noexcept
 Returns an iterator to the first path component.
 
constexpr iterator begin () noexcept
 Returns an iterator to the first path component.
 
constexpr const_iterator cend () const noexcept
 Returns an iterator to after the last path component.
 
constexpr const_iterator end () const noexcept
 Returns an iterator to after the last path component.
 
constexpr iterator end () noexcept
 Returns an iterator to after the last path component.
 
constexpr path_view remove_filename () const noexcept
 Returns a copy of this view with the end adjusted to match the final separator.
 
constexpr path_view root_name () const noexcept
 Returns a view of the root name part of this view e.g. C:
 
constexpr path_view root_directory () const noexcept
 Returns a view of the root directory, if there is one e.g. /.
 
constexpr path_view root_path () const noexcept
 Returns, if any, a view of the root path part of this view e.g. C:/.
 
constexpr path_view relative_path () const noexcept
 Returns a view of everything after the root path.
 
constexpr path_view parent_path () const noexcept
 Returns a view of the everything apart from the filename part of this view.
 
constexpr path_view filename () const noexcept
 Returns a view of the filename part of this view.
 
constexpr path_view without_trailing_separator () const noexcept
 Returns a view of this view without a trailing separator, if there is one, unless the input is '/'.
 
template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(path_view::is_source_acceptable< T >), bool >::type = true>
constexpr int compare (path_view p, const std::locale &loc) const
 
template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(path_view::is_source_acceptable< T >), bool >::type = true>
constexpr int compare (path_view p) const
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 
constexpr enum termination termination () const noexcept
 The zero termination during construction.
 
const byte_raw_data () const noexcept
 
constexpr void swap (path_view_component &o) noexcept
 Swap the view with another.
 
constexpr bool empty () const noexcept
 True if empty.
 
constexpr size_t native_size () const noexcept
 Returns the size of the view in characters.
 
constexpr format formatting () const noexcept
 How path separators shall be interpreted.
 
constexpr bool has_null_termination () const noexcept
 True if input is declared to be null terminated.
 
constexpr bool has_stem () const noexcept
 True if stem() returns a non-empty path.
 
constexpr bool has_extension () const noexcept
 True if extension() returns a non-empty path.
 
constexpr bool contains_glob () const noexcept
 True if the view contains any of the characters *, ?, (POSIX only: [ or ]).
 
constexpr path_view_component stem () const noexcept
 Returns a view of the filename without any file extension.
 
constexpr path_view_component extension () const noexcept
 Returns a view of the file extension part of this view.
 
filesystem::path path () const
 Return the path view as a path. Allocates and copies memory!
 
template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true>
constexpr int compare (path_view_component p, const std::locale &loc) const
 
template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true>
constexpr int compare (path_view_component p) const
 This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
 
template<enum path_view_component::termination ZeroTermination, class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<ZeroTermination, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< ZeroTermination, T, AllocatorOrDeleter, _internal_buffer_size > render (path_view_component view, Args &&...args) const
 Convenience function.
 
template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size > render_null_terminated (Args &&...args) const
 Convenience function.
 
template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< termination::not_zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size > render_unterminated (Args &&...args) const
 Convenience function.
 

Static Public Attributes

static constexpr auto preferred_separator = filesystem::path::preferred_separator
 The preferred separator type.
 
template<class Char >
static constexpr bool is_source_chartype_acceptable = detail::is_source_chartype_acceptable<Char>::value
 
template<class Char >
static constexpr bool is_source_acceptable = detail::is_source_acceptable<Char>::value
 
static constexpr size_t default_internal_buffer_size = 1024
 The default internal buffer size used by rendered_path.
 

Friends

constexpr bool llfio_v2_xxx::operator== (path_view x, path_view y) noexcept
 
constexpr bool llfio_v2_xxx::operator!= (path_view x, path_view y) noexcept
 
constexpr bool llfio_v2_xxx ::operator< (path_view x, path_view y) noexcept
 
constexpr size_t hash_value (path_view x) noexcept
 Return the combined hash of individual path components.
 

Detailed Description

A borrowed view of a path. A lightweight trivial-type alternative to std::filesystem::path.

LLFIO is sufficiently fast that std::filesystem::path as a wrapper of an underlying std::basic_string<> can be problematically expensive for some filing system operations due to the potential memory allocation. LLFIO therefore works exclusively with borrowed views of other path storage.

Some of the API for std::filesystem::path is replicated here, however any APIs which modify the path other than taking subsets are obviously not possible with borrowed views.

Each consumer of path_view defines what the "native platform transport" and "native platform encoding" is. For LLFIO, the native platform transport is defined to be std::filesystem::path::value_type, which is as follows:

  • POSIX: The native platform transport is char.
  • Microsoft Windows: The native platform transport is wchar_t.

    If** the input to path_view equals the native platform transport, the bits supplied will be passed through to the operating system without translation (see below). If* the consuming API expects null termination, and the input to path_view is null terminated, then you are guaranteed that the originally supplied buffer is passed through. If the input is not null terminated, a bitwise identical copy is made into temporary storage (which will be the stack for smaller strings), which is then null terminated before passing to the consuming API.

If the input to path_view does NOT equal the native platform transport, then a translation of the input bits will be performed into temporary storage just before calling the consuming API. The rules are as follows:

  • POSIX: The native platform encoding is assumed to be UTF-8. If the input is char8_t or char, it is not translated. If the input is char16_t, a UTF-16 to UTF-8 translation is performed.
  • Microsoft Windows: The native platform encoding is assumed to be UTF-16. If the input is char16_t or wchar_t, it is not translated. If the input is char8_t, a UTF-8 to UTF-16 translation is performed. If the input is char, the Microsoft Windows API for ANSI to UTF-16 translation is invoked in order to match how Windows ANSI APIs are mapped onto the Windows Unicode APIs (be aware this is very slow).

Windows specific notes:

On Microsoft Windows, filesystem paths may require to be zero terminated, or they may not. Which is the case depends on whether LLFIO calls the NT kernel API directly rather than the Win32 API. As a general rule as to when which is used, the NT kernel API is called instead of the Win32 API when:

  • For any paths relative to a path_handle (the Win32 API does not provide a race free file system API).
  • For any paths beginning with \!!\, we pass the path + 3 characters directly through. This prefix is a pure LLFIO extension, and will not be recognised by other code.
  • For any paths beginning with \??\, we pass the path + 0 characters directly through. Note the NT kernel keeps a symlink at \??\ which refers to the DosDevices namespace for the current login, so as an incorrect relation which you should not rely on, the Win32 path C:\foo probably will appear at \??\C:\foo.

These prefixes are still passed to the Win32 API:

  • \\?\ which is used to tell a Win32 API that the remaining path is longer than a DOS path.
  • \\.\ which since Windows 7 is treated exactly like \\?\.

If the NT kernel API is used directly then:

  • If the calling thread has the ThreadExplicitCaseSensitivity privilege, or the system registry has enabled case sensitive lookup for NTFS, paths are matched case sensitively as raw bytes via memcmp(), not case insensitively (requires slow locale conversion).
  • If the NTFS directory has its case sensitive lookup bit set (see handle::flag
  • The path limit is 32,767 characters.

If you really care about performance, you are very strongly recommended to use the NT kernel API wherever possible. Where paths are involved, it is often three to five times faster due to the multiple memory allocations and string translations that the Win32 functions perform before calling the NT kernel routine.

If however you are taking input from some external piece of code, then for maximum compatibility you should still use the Win32 API.

Member Enumeration Documentation

◆ format

How to interpret separators.

Enumerator
native_format 

Separate at the native path separator only.

generic_format 

Separate at the generic path separator only.

auto_format 

Separate at both the native and generic path separators.

binary_format 

Do not separate at any path separator.

290 {
291 unknown,
292 native_format, //!< Separate at the native path separator only.
293 generic_format, //!< Separate at the generic path separator only.
294 auto_format, //!< Separate at both the native and generic path separators.
295 binary_format //!< Do not separate at any path separator.
296 };
@ generic_format
Separate at the generic path separator only.
Definition path_view.hpp:293
@ binary_format
Do not separate at any path separator.
Definition path_view.hpp:295
@ auto_format
Separate at both the native and generic path separators.
Definition path_view.hpp:294
@ native_format
Separate at the native path separator only.
Definition path_view.hpp:292

◆ termination

The zero termination to use.

Enumerator
zero_terminated 

The input is zero terminated, or requested output ought to be zero terminated.

not_zero_terminated 

The input is not zero terminated, or requested output ought to not be zero terminated.

300 {
301 zero_terminated, //!< The input is zero terminated, or requested output ought to be zero terminated.
302 not_zero_terminated, //!< The input is not zero terminated, or requested output ought to not be zero terminated.
303 };
@ not_zero_terminated
The input is not zero terminated, or requested output ought to not be zero terminated.
Definition path_view.hpp:302
@ zero_terminated
The input is zero terminated, or requested output ought to be zero terminated.
Definition path_view.hpp:301

Constructor & Destructor Documentation

◆ path_view() [1/17]

constexpr llfio_v2_xxx::path_view::path_view ( )
inlineconstexpr

Constructs an empty path view.

1994{} // NOLINT

◆ path_view() [2/17]

constexpr llfio_v2_xxx::path_view::path_view ( path_view_component  p,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs a path view component identical to the input, except with different format interpretation.

1999 : path_view_component(p, fmt)
2000 {
2001 }
constexpr path_view_component() noexcept
Constructs an empty path view component (DEVIATES from P1030, is not trivial due to C++ 14 compatibil...
Definition path_view.hpp:331

◆ path_view() [3/17]

llfio_v2_xxx::path_view::path_view ( const filesystem::path &  v,
format  fmt = auto_format 
)
inlinenoexcept

Implicitly constructs a path view from a path. The input path MUST continue to exist for this view to be valid (DEVIATES from P1030 due to filesystem::path not exposing its path formatting).

2006 : path_view_component(v, fmt)
2007 {
2008 }

◆ path_view() [4/17]

template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( const std::basic_string< Char > &  v,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a basic string if the character type is one of char, wchar_t, char8_t or char16_t.

2016 : path_view_component(v.data(), v.size(), zero_terminated, fmt)
2017 {
2018 }

◆ path_view() [5/17]

constexpr llfio_v2_xxx::path_view::path_view ( const char *  b,
size_t  l,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a lengthed array of one of char, wchar_t, char8_t or char16_t. The input string MUST continue to exist for this view to be valid.

2023 : path_view_component(b, l, zt, fmt)
2024 {
2025 }

◆ path_view() [6/17]

constexpr llfio_v2_xxx::path_view::path_view ( const wchar_t *  b,
size_t  l,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a lengthed array of one of char, wchar_t, char8_t or char16_t. The input string MUST continue to exist for this view to be valid.

2030 : path_view_component(b, l, zt, fmt)
2031 {
2032 }

◆ path_view() [7/17]

constexpr llfio_v2_xxx::path_view::path_view ( const char8_t *  b,
size_t  l,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a lengthed array of one of char, wchar_t, char8_t or char16_t. The input string MUST continue to exist for this view to be valid.

2037 : path_view_component(b, l, zt, fmt)
2038 {
2039 }

◆ path_view() [8/17]

constexpr llfio_v2_xxx::path_view::path_view ( const char16_t *  b,
size_t  l,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a lengthed array of one of char, wchar_t, char8_t or char16_t. The input string MUST continue to exist for this view to be valid.

2044 : path_view_component(b, l, zt, fmt)
2045 {
2046 }

◆ path_view() [9/17]

constexpr llfio_v2_xxx::path_view::path_view ( const byte b,
size_t  l,
enum termination  zt 
)
inlineconstexprnoexcept

Constructs from a lengthed array of byte. The input array MUST continue to exist for this view to be valid.

2051 : path_view_component(b, l, zt)
2052 {
2053 }

◆ path_view() [10/17]

template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( const Char *  s,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Implicitly constructs a path view from a zero terminated pointer to a character array, which must be one of char, wchar_t, char8_t or char16_t. The input string MUST continue to exist for this view to be valid.

2062 : path_view_component(s, detail::constexpr_strlen(s), zero_terminated, fmt)
2063 {
2064 }

◆ path_view() [11/17]

constexpr llfio_v2_xxx::path_view::path_view ( const byte s)
inlineconstexprnoexcept

Implicitly constructs a path view from a zero terminated pointer to byte array. The input array MUST continue to exist for this view to be valid.

2070 {
2071 }

◆ path_view() [12/17]

template<class Char , typename std::enable_if<(is_source_chartype_acceptable< Char >), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( basic_string_view< Char >  v,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from a basic string view if the character type is one of char, wchar_t, char8_t or char16_t.

2079 : path_view_component(v.data(), v.size(), zt, fmt)
2080 {
2081 }

◆ path_view() [13/17]

constexpr llfio_v2_xxx::path_view::path_view ( span< const byte v,
enum termination  zt 
)
inlineconstexprnoexcept

Constructs from a span<const byte>.

2085 : path_view_component(v, zt)
2086 {
2087 }

◆ path_view() [14/17]

template<class It , class End , typename std::enable_if<(is_source_chartype_acceptable< typename It::value_type >), bool >::type = true, typename std::enable_if<(is_source_chartype_acceptable< typename End::value_type >), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( It  b,
End  e,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

Constructs from an iterator sequence if the iterator is contiguous, if its value type is one of char, wchar_t, char8_t or char16_t.

(DEVIATES from P1030, cannot detect contiguous iterator in SFINAE in C++ 14)

2097 : path_view_component(addressof(*b), e - b, zt, fmt)
2098 {
2099 }

◆ path_view() [15/17]

template<class It , class End , typename std::enable_if<(is_source_chartype_acceptable< std::decay_t< It > >), bool >::type = true, typename std::enable_if<(is_source_chartype_acceptable< std::decay_t< End > >), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( It *  b,
End *  e,
enum termination  zt,
format  fmt = auto_format 
)
inlineconstexprnoexcept

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

2104 : path_view_component(b, e - b, zt, fmt)
2105 {
2106 }

◆ path_view() [16/17]

template<class It , class End , typename std::enable_if<(std::is_same< typename It::value_type, byte >::value), bool >::type = true, typename std::enable_if<(std::is_same< typename End::value_type, byte >::value), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( It  b,
End  e,
enum termination  zt 
)
inlineconstexprnoexcept

Constructs from an iterator sequence if the iterator is contiguous, if its value type is byte.

(DEVIATES from P1030, cannot detect contiguous iterator in SFINAE in C++ 14)

2115 : path_view_component(addressof(*b), e - b, zt, binary_format)
2116 {
2117 }

◆ path_view() [17/17]

template<class It , class End , typename std::enable_if<(std::is_same< std::decay_t< It >, byte >::value), bool >::type = true, typename std::enable_if<(std::is_same< std::decay_t< End >, byte >::value), bool >::type = true>
constexpr llfio_v2_xxx::path_view::path_view ( It *  b,
End *  e,
enum termination  zt 
)
inlineconstexprnoexcept

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

2122 : path_view_component(b, e - b, zt, binary_format)
2123 {
2124 }

Member Function Documentation

◆ _raw_data()

const byte * llfio_v2_xxx::path_view_component::_raw_data ( ) const
inlinenoexceptinherited
640{ return _bytestr; }

◆ begin() [1/2]

constexpr path_view::const_iterator llfio_v2_xxx::path_view::begin ( ) const
inlineconstexprnoexcept

Returns an iterator to the first path component.

2850{
2851 return cbegin();
2852}
constexpr const_iterator cbegin() const noexcept
Returns an iterator to the first path component.
Definition path_view.hpp:2841

◆ begin() [2/2]

constexpr path_view::iterator llfio_v2_xxx::path_view::begin ( )
inlineconstexprnoexcept

Returns an iterator to the first path component.

2854{
2855 return cbegin();
2856}

◆ cbegin()

constexpr path_view::const_iterator llfio_v2_xxx::path_view::cbegin ( ) const
inlineconstexprnoexcept

Returns an iterator to the first path component.

2842{
2843 return const_iterator(this, false);
2844}
detail::path_view_iterator const_iterator
Const iterator type.
Definition path_view.hpp:1980

◆ cend()

constexpr path_view::const_iterator llfio_v2_xxx::path_view::cend ( ) const
inlineconstexprnoexcept

Returns an iterator to after the last path component.

2846{
2847 return const_iterator(this, true);
2848}

◆ compare() [1/4]

template<class T , class Deleter , size_t _internal_buffer_size, typename std::enable_if<(path_view::is_source_acceptable< T >), bool >::type >
constexpr int llfio_v2_xxx::path_view::compare ( path_view  p) const
inlineconstexpr

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

3046{
3047 auto it1 = begin(), it2 = o.begin();
3048 for(; it1 != end() && it2 != o.end(); ++it1, ++it2)
3049 {
3050 int res = it1->compare<T, Deleter, _internal_buffer_size>(*it2);
3051 if(res != 0)
3052 {
3053 return res;
3054 }
3055 }
3056 if(it1 == end() && it2 != o.end())
3057 {
3058 return -1;
3059 }
3060 if(it1 != end() && it2 == o.end())
3061 {
3062 return 1;
3063 }
3064 return 0; // identical
3065}
constexpr const_iterator end() const noexcept
Returns an iterator to after the last path component.
Definition path_view.hpp:2857
constexpr const_iterator begin() const noexcept
Returns an iterator to the first path component.
Definition path_view.hpp:2849

◆ compare() [2/4]

template<class T , class Deleter , size_t _internal_buffer_size, typename std::enable_if<(path_view::is_source_acceptable< T >), bool >::type >
constexpr int llfio_v2_xxx::path_view::compare ( path_view  p,
const std::locale &  loc 
) const
inlineconstexpr

Compares the two path views for equivalence or ordering using T as the destination encoding, if necessary.

If the source encodings of the two path views are compatible, a lexicographical comparison is performed. If they are incompatible, either or both views are converted to the destination encoding using rendered_path<T, Delete, _internal_buffer_size>, and then a lexicographical comparison is performed.

This can, for obvious reasons, be expensive. It can also throw exceptions, as rendered_path does.

If the destination encoding is byte, memcmp() is used, and rendered_path is never invoked as the two sources are byte compared directly.

3017{
3018 auto it1 = begin(), it2 = o.begin();
3019 for(; it1 != end() && it2 != o.end(); ++it1, ++it2)
3020 {
3021 int res = it1->compare<T, Deleter, _internal_buffer_size>(*it2, loc);
3022 if(res != 0)
3023 {
3024 return res;
3025 }
3026 }
3027 if(it1 == end() && it2 != o.end())
3028 {
3029 return -1;
3030 }
3031 if(it1 != end() && it2 == o.end())
3032 {
3033 return 1;
3034 }
3035 return 0; // identical
3036}

◆ compare() [3/4]

template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true>
constexpr int llfio_v2_xxx::path_view_component::compare ( path_view_component  p) const
inlineconstexprinherited

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

834 {
835 return _invoke(
836 [&](const auto &self) {
837 return p._invoke([&](const auto &other) { return _compare<T, Deleter, _internal_buffer_size>(self, termination(), other, p.termination(), nullptr); });
838 });
839 }
termination
The zero termination to use.
Definition path_view.hpp:300

◆ compare() [4/4]

template<class T = typename filesystem::path::value_type, class Deleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true>
constexpr int llfio_v2_xxx::path_view_component::compare ( path_view_component  p,
const std::locale &  loc 
) const
inlineconstexprinherited

Compares the two path views for equivalence or ordering using T as the destination encoding, if necessary.

If the source encodings of the two path views are compatible, a lexicographical comparison is performed. If they are incompatible, either or both views are converted to the destination encoding using rendered_path<T, Delete, _internal_buffer_size>, and then a lexicographical comparison is performed.

This can, for obvious reasons, be expensive. It can also throw exceptions, as rendered_path does.

If the destination encoding is byte, memcmp() is used, and rendered_path is never invoked as the two sources are byte compared directly.

824 {
825 return _invoke(
826 [&](const auto &self)
827 { return p._invoke([&](const auto &other) { return _compare<T, Deleter, _internal_buffer_size>(self, termination(), other, p.termination(), &loc); }); });
828 }

◆ contains_glob()

constexpr bool llfio_v2_xxx::path_view_component::contains_glob ( ) const
inlineconstexprnoexceptinherited

True if the view contains any of the characters *, ?, (POSIX only: [ or ]).

674 {
675 return _invoke(
676 [](const auto &v)
677 {
678 using value_type = typename std::remove_reference<decltype(*v.data())>::type;
679#ifdef _WIN32
680 const value_type *tofind = (sizeof(value_type) > 1) ? (const value_type *) L"*?" : (const value_type *) "*?";
681#else
682 const value_type *tofind = (sizeof(value_type) > 1) ? (const value_type *) L"*?[]" : (const value_type *) "*?[]";
683#endif
684 return string_view::npos != v.find_first_of(tofind);
685 });
686 }

◆ empty()

constexpr bool llfio_v2_xxx::path_view_component::empty ( ) const
inlineconstexprnoexceptinherited

True if empty.

651{ return _length == 0; }

◆ end() [1/2]

constexpr path_view::const_iterator llfio_v2_xxx::path_view::end ( ) const
inlineconstexprnoexcept

Returns an iterator to after the last path component.

2858{
2859 return cend();
2860}
constexpr const_iterator cend() const noexcept
Returns an iterator to after the last path component.
Definition path_view.hpp:2845

◆ end() [2/2]

constexpr path_view::iterator llfio_v2_xxx::path_view::end ( )
inlineconstexprnoexcept

Returns an iterator to after the last path component.

2862{
2863 return cend();
2864}

◆ extension()

constexpr path_view_component llfio_v2_xxx::path_view_component::extension ( ) const
inlineconstexprnoexceptinherited

Returns a view of the file extension part of this view.

705 {
706 auto self = _filename();
707 return self._invoke(
708 [this](const auto &v)
709 {
710 auto dot_idx = v.rfind('.');
711 if(_npos == dot_idx || dot_idx == 0 || (dot_idx == 1 && v[dot_idx - 1] == '.'))
712 {
713 return path_view_component();
714 }
715 return path_view_component(v.data() + dot_idx, v.size() - dot_idx, termination());
716 });
717 }

◆ filename()

constexpr path_view llfio_v2_xxx::path_view::filename ( ) const
inlineconstexprnoexcept

Returns a view of the filename part of this view.

2423{ return this->_filename(); }

◆ formatting()

constexpr format llfio_v2_xxx::path_view_component::formatting ( ) const
inlineconstexprnoexceptinherited

How path separators shall be interpreted.

660{ return _format; }

◆ has_extension()

constexpr bool llfio_v2_xxx::path_view_component::has_extension ( ) const
inlineconstexprnoexceptinherited

True if extension() returns a non-empty path.

670{ return !extension().empty(); }
constexpr path_view_component extension() const noexcept
Returns a view of the file extension part of this view.
Definition path_view.hpp:704
constexpr bool empty() const noexcept
True if empty.
Definition path_view.hpp:651

◆ has_filename()

constexpr bool llfio_v2_xxx::path_view::has_filename ( ) const
inlineconstexprnoexcept

True if has filename.

2146{ return !filename().empty(); }
constexpr path_view filename() const noexcept
Returns a view of the filename part of this view.
Definition path_view.hpp:2423

◆ has_null_termination()

constexpr bool llfio_v2_xxx::path_view_component::has_null_termination ( ) const
inlineconstexprnoexceptinherited

True if input is declared to be null terminated.

663{ return _zero_terminated; }

◆ has_parent_path()

constexpr bool llfio_v2_xxx::path_view::has_parent_path ( ) const
inlineconstexprnoexcept

True if has parent path.

2144{ return !parent_path().empty(); }
constexpr path_view parent_path() const noexcept
Returns a view of the everything apart from the filename part of this view.
Definition path_view.hpp:2390

◆ has_relative_path()

constexpr bool llfio_v2_xxx::path_view::has_relative_path ( ) const
inlineconstexprnoexcept

True if has relative path.

2142{ return !relative_path().empty(); }
constexpr path_view relative_path() const noexcept
Returns a view of everything after the root path.
Definition path_view.hpp:2345

◆ has_root_directory()

constexpr bool llfio_v2_xxx::path_view::has_root_directory ( ) const
inlineconstexprnoexcept

True if has root directory.

2140{ return !root_directory().empty(); }
constexpr path_view root_directory() const noexcept
Returns a view of the root directory, if there is one e.g. /.
Definition path_view.hpp:2275

◆ has_root_name()

constexpr bool llfio_v2_xxx::path_view::has_root_name ( ) const
inlineconstexprnoexcept

True if has root name.

2138{ return !root_name().empty(); }
constexpr path_view root_name() const noexcept
Returns a view of the root name part of this view e.g. C:
Definition path_view.hpp:2265

◆ has_root_path()

constexpr bool llfio_v2_xxx::path_view::has_root_path ( ) const
inlineconstexprnoexcept

True if has root path.

2136{ return !root_path().empty(); }
constexpr path_view root_path() const noexcept
Returns, if any, a view of the root path part of this view e.g. C:/.
Definition path_view.hpp:2300

◆ has_stem()

constexpr bool llfio_v2_xxx::path_view_component::has_stem ( ) const
inlineconstexprnoexceptinherited

True if stem() returns a non-empty path.

668{ return !stem().empty(); }
constexpr path_view_component stem() const noexcept
Returns a view of the filename without any file extension.
Definition path_view.hpp:689

◆ is_absolute()

constexpr bool llfio_v2_xxx::path_view::is_absolute ( ) const
inlineconstexprnoexcept

True if absolute.

2149 {
2150 auto sep_idx = this->_find_first_sep();
2151 if(_npos == sep_idx)
2152 {
2153 return false;
2154 }
2155#ifdef _WIN32
2156 if(is_ntpath())
2157 return true;
2158 return this->_invoke(
2159 [sep_idx](const auto &v)
2160 {
2161 if(sep_idx == 0)
2162 {
2163 if(v[sep_idx + 1] == preferred_separator) // double separator at front
2164 return true;
2165 }
2166 auto colon_idx = v.find(':');
2167 return colon_idx < sep_idx; // colon before first separator
2168 });
2169#else
2170 return sep_idx == 0;
2171#endif
2172 }
static constexpr auto preferred_separator
The preferred separator type.
Definition path_view.hpp:266

◆ is_relative()

constexpr bool llfio_v2_xxx::path_view::is_relative ( ) const
inlineconstexprnoexcept

True if relative.

2174{ return !is_absolute(); }
constexpr bool is_absolute() const noexcept
True if absolute.
Definition path_view.hpp:2148

◆ native_size()

constexpr size_t llfio_v2_xxx::path_view_component::native_size ( ) const
inlineconstexprnoexceptinherited

Returns the size of the view in characters.

655 {
656 return _invoke([](const auto &v) { return v.size(); });
657 }

◆ parent_path()

constexpr path_view llfio_v2_xxx::path_view::parent_path ( ) const
inlineconstexprnoexcept

Returns a view of the everything apart from the filename part of this view.

2391 {
2392 auto sep_idx = this->_find_last_sep();
2393 if(_npos == sep_idx)
2394 {
2395 return path_view();
2396 }
2397#ifdef _WIN32
2398 return this->_invoke(
2399 [this, sep_idx](const auto &v)
2400 {
2401 // UNC paths return a trailing slash if the parent path is the server name
2402 if(is_uncpath())
2403 {
2404 auto sep_idx2 = this->_find_first_sep(2);
2405 if(sep_idx2 == sep_idx)
2406 {
2407 return path_view(v.data(), sep_idx + 1, not_zero_terminated, formatting());
2408 }
2409 }
2410 // If a C:\ or whatever, return exactly that.
2411 auto rp = root_path();
2412 if(rp.native_size() == native_size())
2413 {
2414 return *this;
2415 }
2416 return path_view(v.data(), (sep_idx == 0) ? 1 : sep_idx, not_zero_terminated, formatting());
2417 });
2418#else
2419 return this->_invoke([this, sep_idx](const auto &v) { return path_view(v.data(), (sep_idx == 0) ? 1 : sep_idx, not_zero_terminated, formatting()); });
2420#endif
2421 }
constexpr format formatting() const noexcept
How path separators shall be interpreted.
Definition path_view.hpp:660
constexpr size_t native_size() const noexcept
Returns the size of the view in characters.
Definition path_view.hpp:654
constexpr path_view()
Constructs an empty path view.
Definition path_view.hpp:1994

◆ path()

filesystem::path llfio_v2_xxx::path_view_component::path ( ) const
inlineinherited

Return the path view as a path. Allocates and copies memory!

784 {
785 return _invoke(
786 [&](const auto &v)
787 {
788 return _path_from_char_array(v,
789 [](format f) -> filesystem::path::format
790 {
791 switch(f)
792 {
794 return filesystem::path::format::generic_format;
796 return filesystem::path::format::native_format;
797 default:
798 return filesystem::path::format::auto_format;
799 }
800 }(formatting()));
801 });
802 }
format
How to interpret separators.
Definition path_view.hpp:290

◆ relative_path()

constexpr path_view llfio_v2_xxx::path_view::relative_path ( ) const
inlineconstexprnoexcept

Returns a view of everything after the root path.

2346 {
2347 auto sep_idx = this->_find_first_sep();
2348 if(_npos == sep_idx)
2349 {
2350 return *this;
2351 }
2352#ifdef _WIN32
2353 return this->_invoke(
2354 [this, sep_idx](const auto &v) mutable
2355 {
2356 // Special case \\.\ and \\?\ to match filesystem::path
2357 if(is_ntpath() || (v.size() >= 4 && sep_idx == 0 && v[1] == '\\' && (v[2] == '.' || v[2] == '?') && v[3] == '\\'))
2358 {
2359 return path_view(v.data() + 4, v.size() - 4, this->termination(), formatting());
2360 }
2361 // Is there a drive letter before the first separator?
2362 auto colon_idx = v.find(':');
2363 if(colon_idx < sep_idx)
2364 {
2365 return path_view(v.data() + sep_idx + 1, v.size() - sep_idx - 1, this->termination(), formatting());
2366 }
2367 // UNC paths return the server name as the root path
2368 if(is_uncpath())
2369 {
2370 sep_idx = this->_find_first_sep(2);
2371 if(_npos == sep_idx)
2372 {
2373 return path_view();
2374 }
2375 return path_view(v.data() + sep_idx + 1, v.size() - sep_idx - 1, this->termination(), formatting());
2376 }
2377#else
2378 return this->_invoke(
2379 [this, sep_idx](const auto &v)
2380 {
2381#endif
2382 if(sep_idx == 0)
2383 {
2384 return path_view(v.data() + 1, v.size() - 1, this->termination(), formatting());
2385 }
2386 return *this;
2387 });
2388 }

◆ remove_filename()

constexpr path_view llfio_v2_xxx::path_view::remove_filename ( ) const
inlineconstexprnoexcept

Returns a copy of this view with the end adjusted to match the final separator.

2255 {
2256 auto sep_idx = this->_find_last_sep();
2257 if(_npos == sep_idx)
2258 {
2259 // Sorry, this semantic is so broken that it's unwise to emulate!
2260 return path_view();
2261 }
2262 return this->_invoke([sep_idx, this](auto v) { return path_view(v.data(), (sep_idx + 1), not_zero_terminated, formatting()); });
2263 }

◆ render()

template<enum path_view_component::termination ZeroTermination, class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<ZeroTermination, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< ZeroTermination, T, AllocatorOrDeleter, _internal_buffer_size > llfio_v2_xxx::path_view_component::render ( path_view_component  view,
Args &&...  args 
) const
inlineinherited

Convenience function.

1513 {
1514 return rendered_path<ZeroTermination, T, AllocatorOrDeleter, _internal_buffer_size>(view, std::forward<Args>(args)...);
1515 }

◆ render_null_terminated()

template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size > llfio_v2_xxx::path_view_component::render_null_terminated ( Args &&...  args) const
inlineinherited

Convenience function.

1523 {
1524 return rendered_path<termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>(*this, std::forward<Args>(args)...);
1525 }

◆ render_unterminated()

template<class T = typename filesystem::path::value_type, class AllocatorOrDeleter = default_rendered_path_deleter<T[]>, size_t _internal_buffer_size = default_internal_buffer_size, class... Args, typename std::enable_if<(is_source_acceptable< T >), bool >::type = true, typename = decltype( std::is_constructible<rendered_path<termination::zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>, path_view_component, Args...>::value )>
rendered_path< termination::not_zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size > llfio_v2_xxx::path_view_component::render_unterminated ( Args &&...  args) const
inlineinherited

Convenience function.

1533 {
1534 return rendered_path<termination::not_zero_terminated, T, AllocatorOrDeleter, _internal_buffer_size>(*this, std::forward<Args>(args)...);
1535 }

◆ root_directory()

constexpr path_view llfio_v2_xxx::path_view::root_directory ( ) const
inlineconstexprnoexcept

Returns a view of the root directory, if there is one e.g. /.

2276 {
2277 auto sep_idx = this->_find_first_sep();
2278 if(_npos == sep_idx)
2279 {
2280 return path_view();
2281 }
2282 return this->_invoke(
2283 [sep_idx, this](const auto &v)
2284 {
2285#ifdef _WIN32
2286 auto colon_idx = v.find(':');
2287 if(colon_idx < sep_idx)
2288 {
2289 return path_view(v.data() + sep_idx, 1, not_zero_terminated, formatting());
2290 }
2291#endif
2292 if(sep_idx == 0)
2293 {
2294 return path_view(v.data(), 1, not_zero_terminated, formatting());
2295 }
2296 return path_view();
2297 });
2298 }

◆ root_name()

constexpr path_view llfio_v2_xxx::path_view::root_name ( ) const
inlineconstexprnoexcept

Returns a view of the root name part of this view e.g. C:

2266 {
2267 auto sep_idx = this->_find_first_sep();
2268 if(_npos == sep_idx)
2269 {
2270 return path_view();
2271 }
2272 return this->_invoke([sep_idx, this](const auto &v) { return path_view(v.data(), sep_idx, not_zero_terminated, formatting()); });
2273 }

◆ root_path()

constexpr path_view llfio_v2_xxx::path_view::root_path ( ) const
inlineconstexprnoexcept

Returns, if any, a view of the root path part of this view e.g. C:/.

2301 {
2302 auto sep_idx = this->_find_first_sep();
2303 if(_npos == sep_idx)
2304 {
2305 return path_view();
2306 }
2307#ifdef _WIN32
2308 return this->_invoke(
2309 [this, sep_idx](const auto &v) mutable
2310 {
2311 // Special case \\.\ and \\?\ to match filesystem::path
2312 if(is_ntpath() || (v.size() >= 4 && sep_idx == 0 && v[1] == '\\' && (v[2] == '.' || v[2] == '?') && v[3] == '\\'))
2313 {
2314 return path_view(v.data() + 0, 4, not_zero_terminated, formatting());
2315 }
2316 // Is there a drive letter before the first separator?
2317 auto colon_idx = v.find(':');
2318 if(colon_idx < sep_idx)
2319 {
2320 return path_view(v.data(), sep_idx + 1, not_zero_terminated, formatting());
2321 }
2322 // UNC paths return the server name as the root path
2323 if(is_uncpath())
2324 {
2325 sep_idx = this->_find_first_sep(2);
2326 if(_npos == sep_idx)
2327 {
2328 return *this;
2329 }
2330 return path_view(v.data(), sep_idx + 1, not_zero_terminated, formatting());
2331 }
2332#else
2333 return this->_invoke(
2334 [this, sep_idx](const auto &v)
2335 {
2336#endif
2337 if(sep_idx == 0)
2338 {
2339 return path_view(v.data(), 1, not_zero_terminated, formatting());
2340 }
2341 return path_view();
2342 });
2343 }

◆ stem()

constexpr path_view_component llfio_v2_xxx::path_view_component::stem ( ) const
inlineconstexprnoexceptinherited

Returns a view of the filename without any file extension.

690 {
691 auto self = _filename();
692 return self._invoke(
693 [self](const auto &v)
694 {
695 auto dot_idx = v.rfind('.');
696 if(_npos == dot_idx || dot_idx == 0 || (dot_idx == 1 && v[dot_idx - 1] == '.'))
697 {
698 return self;
699 }
700 return path_view_component(v.data(), dot_idx, not_zero_terminated);
701 });
702 }

◆ swap()

constexpr void llfio_v2_xxx::path_view_component::swap ( path_view_component o)
inlineconstexprnoexceptinherited

Swap the view with another.

644 {
645 path_view_component x = *this;
646 *this = o;
647 o = x;
648 }

◆ termination()

constexpr enum termination llfio_v2_xxx::path_view_component::termination ( ) const
inlineconstexprnoexceptinherited

The zero termination during construction.

665{ return _zero_terminated ? zero_terminated : not_zero_terminated; }

◆ without_trailing_separator()

constexpr path_view llfio_v2_xxx::path_view::without_trailing_separator ( ) const
inlineconstexprnoexcept

Returns a view of this view without a trailing separator, if there is one, unless the input is '/'.

2426 {
2427 auto sep_idx = this->_find_last_sep();
2428 return this->_invoke(
2429 [this, sep_idx](const auto &v)
2430 {
2431 if(sep_idx > 0 && v.size() - 1 == sep_idx)
2432 {
2433 return path_view(v.data(), sep_idx, not_zero_terminated, formatting());
2434 }
2435 else
2436 {
2437 return *this;
2438 }
2439 });
2440 }

Friends And Related Symbol Documentation

◆ hash_value

constexpr size_t hash_value ( path_view  x)
friend

Return the combined hash of individual path components.

3000{
3001 size_t ret = 0;
3002 for(auto component : x)
3003 {
3004 ret ^= hash_value(component) + 0x9e3779b9 + (ret << 6) + (ret >> 2);
3005 }
3006 return ret;
3007}
friend constexpr size_t hash_value(path_view x) noexcept
Return the combined hash of individual path components.
Definition path_view.hpp:2999

Member Data Documentation

◆ _bytestr

const byte* llfio_v2_xxx::path_view_component::_bytestr {nullptr}
inherited
312{nullptr};

◆ is_source_acceptable

template<class Char >
constexpr bool llfio_v2_xxx::path_view_component::is_source_acceptable = detail::is_source_acceptable<Char>::value
staticconstexprinherited

True if path views can be constructed from this source. i.e. is_source_chartype_acceptable, or is byte

◆ is_source_chartype_acceptable

template<class Char >
constexpr bool llfio_v2_xxx::path_view_component::is_source_chartype_acceptable = detail::is_source_chartype_acceptable<Char>::value
staticconstexprinherited

True if path views can be constructed from this character type. i.e. is one of char, wchar_t, char8_t, char16_t


The documentation for this class was generated from the following file: