Add util::hstring - both owning & not owning string - for use to emulate heterogeneous containers
This commit is contained in:
parent
f0ae57a378
commit
9146c19ccd
1 changed files with 80 additions and 0 deletions
80
libs/util/include/psemek/util/hstring.hpp
Normal file
80
libs/util/include/psemek/util/hstring.hpp
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <functional>
|
||||
|
||||
namespace psemek::util
|
||||
{
|
||||
|
||||
struct hstring
|
||||
{
|
||||
hstring(std::string string)
|
||||
: string_(std::move(string))
|
||||
, view_(string_)
|
||||
{}
|
||||
|
||||
hstring(std::string_view const & view)
|
||||
: view_(view)
|
||||
{}
|
||||
|
||||
hstring(hstring const & other)
|
||||
: string_(other.string_)
|
||||
, view_(other.owns() ? std::string_view(string_) : other.view_)
|
||||
{}
|
||||
|
||||
hstring(hstring && other)
|
||||
{
|
||||
if (other.owns())
|
||||
{
|
||||
string_ = std::move(other.string_);
|
||||
view_ = string_;
|
||||
}
|
||||
else
|
||||
{
|
||||
view_ = other.view_;
|
||||
}
|
||||
|
||||
other.view_ = std::string_view();
|
||||
}
|
||||
|
||||
std::string_view view() const
|
||||
{
|
||||
return view_;
|
||||
}
|
||||
|
||||
bool owns() const
|
||||
{
|
||||
return view_.data() == string_.data();
|
||||
}
|
||||
|
||||
private:
|
||||
std::string string_;
|
||||
std::string_view view_;
|
||||
};
|
||||
|
||||
inline auto operator == (hstring const & str1, hstring const & str2)
|
||||
{
|
||||
return str1.view() == str2.view();
|
||||
}
|
||||
|
||||
inline auto operator <=> (hstring const & str1, hstring const & str2)
|
||||
{
|
||||
return str1.view() <=> str2.view();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace std
|
||||
{
|
||||
|
||||
template <>
|
||||
struct hash<::psemek::util::hstring>
|
||||
{
|
||||
std::size_t operator()(::psemek::util::hstring const & str) const
|
||||
{
|
||||
return std::hash<std::string_view>()(str.view());
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue