fs/Traits: add Relative() overload with std::string_view
This commit is contained in:
parent
2429cc8778
commit
0080eee857
@ -117,6 +117,37 @@ RelativePathImpl(typename Traits::string_view base,
|
|||||||
return other;
|
return other;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Traits>
|
||||||
|
typename Traits::string_view
|
||||||
|
RelativePathImpl(typename Traits::string_view base,
|
||||||
|
typename Traits::string_view _other) noexcept
|
||||||
|
{
|
||||||
|
BasicStringView<typename Traits::value_type> other(_other);
|
||||||
|
|
||||||
|
if (!other.SkipPrefix(base))
|
||||||
|
/* mismatch */
|
||||||
|
return {};
|
||||||
|
|
||||||
|
if (!other.empty()) {
|
||||||
|
if (!Traits::IsSeparator(other.front())) {
|
||||||
|
if (!base.empty() && Traits::IsSeparator(other.data[-1]))
|
||||||
|
/* "other" has no more slash, but the
|
||||||
|
matching base ended with a slash:
|
||||||
|
enough to detect a match */
|
||||||
|
return other;
|
||||||
|
|
||||||
|
/* mismatch */
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* skip remaining path separators */
|
||||||
|
while (!other.empty() && Traits::IsSeparator(other.front()))
|
||||||
|
other.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
return other;
|
||||||
|
}
|
||||||
|
|
||||||
PathTraitsFS::string
|
PathTraitsFS::string
|
||||||
PathTraitsFS::Build(string_view a, string_view b) noexcept
|
PathTraitsFS::Build(string_view a, string_view b) noexcept
|
||||||
{
|
{
|
||||||
@ -141,6 +172,12 @@ PathTraitsFS::Relative(string_view base, const_pointer other) noexcept
|
|||||||
return RelativePathImpl<PathTraitsFS>(base, other);
|
return RelativePathImpl<PathTraitsFS>(base, other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PathTraitsFS::string_view
|
||||||
|
PathTraitsFS::Relative(string_view base, string_view other) noexcept
|
||||||
|
{
|
||||||
|
return RelativePathImpl<PathTraitsFS>(base, other);
|
||||||
|
}
|
||||||
|
|
||||||
PathTraitsFS::string
|
PathTraitsFS::string
|
||||||
PathTraitsFS::Apply(const_pointer base, const_pointer path) noexcept
|
PathTraitsFS::Apply(const_pointer base, const_pointer path) noexcept
|
||||||
{
|
{
|
||||||
@ -178,3 +215,9 @@ PathTraitsUTF8::Relative(string_view base, const_pointer other) noexcept
|
|||||||
{
|
{
|
||||||
return RelativePathImpl<PathTraitsUTF8>(base, other);
|
return RelativePathImpl<PathTraitsUTF8>(base, other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PathTraitsUTF8::string_view
|
||||||
|
PathTraitsUTF8::Relative(string_view base, string_view other) noexcept
|
||||||
|
{
|
||||||
|
return RelativePathImpl<PathTraitsUTF8>(base, other);
|
||||||
|
}
|
||||||
|
@ -149,6 +149,9 @@ struct PathTraitsFS {
|
|||||||
gcc_pure gcc_nonnull_all
|
gcc_pure gcc_nonnull_all
|
||||||
static const_pointer Relative(string_view base, const_pointer other) noexcept;
|
static const_pointer Relative(string_view base, const_pointer other) noexcept;
|
||||||
|
|
||||||
|
gcc_pure
|
||||||
|
static string_view Relative(string_view base, string_view other) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the path from the given components.
|
* Constructs the path from the given components.
|
||||||
* If either of the components is empty string,
|
* If either of the components is empty string,
|
||||||
@ -257,6 +260,9 @@ struct PathTraitsUTF8 {
|
|||||||
gcc_pure gcc_nonnull_all
|
gcc_pure gcc_nonnull_all
|
||||||
static const_pointer Relative(string_view base, const_pointer other) noexcept;
|
static const_pointer Relative(string_view base, const_pointer other) noexcept;
|
||||||
|
|
||||||
|
gcc_pure
|
||||||
|
static string_view Relative(string_view base, string_view other) noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the path from the given components.
|
* Constructs the path from the given components.
|
||||||
* If either of the components is empty string,
|
* If either of the components is empty string,
|
||||||
|
Loading…
Reference in New Issue
Block a user