Replace StringView with shared_ptr.
continuous-integration/drone/push Build is failing Details

This commit is contained in:
Deukhoofd 2020-07-04 14:59:56 +02:00
parent 5994299baa
commit d3aacee0ef
Signed by: Deukhoofd
GPG Key ID: ADF2E9256009EDCE
2 changed files with 18 additions and 31 deletions

View File

@ -1,3 +1,7 @@
#include "StringView.hpp" #include "StringView.hpp"
#include <memory>
ArbUt::__ConstStringCharHolder* ArbUt::StringView::__emptyString = new __ConstStringCharHolder("", 0); namespace ArbUt {
std::shared_ptr<__ConstStringCharHolder> StringView::__emptyString =
std::make_shared<__ConstStringCharHolder>("", 0);
}

View File

@ -5,6 +5,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include <cstring> #include <cstring>
#include <memory>
#include <string> #include <string>
#include "BasicStringView.hpp" #include "BasicStringView.hpp"
@ -17,26 +18,15 @@
namespace ArbUt { namespace ArbUt {
class __ConstStringCharHolder { class __ConstStringCharHolder {
char* _value; char* _value;
std::atomic<size_t> _references;
__ConstStringCharHolder(const __ConstStringCharHolder& o) = delete; __ConstStringCharHolder(const __ConstStringCharHolder& o) = delete;
__ConstStringCharHolder& operator=(const __ConstStringCharHolder& other) = delete; __ConstStringCharHolder& operator=(const __ConstStringCharHolder& other) = delete;
public: public:
__ConstStringCharHolder(const char* value, size_t length) noexcept __ConstStringCharHolder(const char* value, size_t length) noexcept : _value(new char[length + 1]) {
: _value(new char[length + 1]), _references(1) {
strncpy(_value, value, length + 1); strncpy(_value, value, length + 1);
} }
~__ConstStringCharHolder() noexcept { delete[] _value; } ~__ConstStringCharHolder() noexcept { delete[] _value; }
inline void RemoveReference() noexcept {
if (--_references <= 0) {
delete this;
}
}
inline void AddReference() noexcept { _references++; }
inline constexpr const char* GetValue() const noexcept { return _value; } inline constexpr const char* GetValue() const noexcept { return _value; }
}; };
} }
@ -50,43 +40,33 @@ static int constexpr CalcLength(const char* str) { return *str ? 1 + CalcLength(
namespace ArbUt { namespace ArbUt {
class StringView final : public BasicStringView { class StringView final : public BasicStringView {
private: private:
static __ConstStringCharHolder* __emptyString; static std::shared_ptr<__ConstStringCharHolder> __emptyString;
static inline __ConstStringCharHolder* GetEmptyString() { return __emptyString; } static inline const std::shared_ptr<__ConstStringCharHolder>& GetEmptyString() { return __emptyString; }
__ConstStringCharHolder* _str; std::shared_ptr<__ConstStringCharHolder> _str;
inline __ConstStringCharHolder* CloneHolder() const noexcept {
_str->AddReference();
return _str;
}
public: public:
StringView(const char* str) noexcept StringView(const char* str) noexcept
: BasicStringView(CalcLength(str), Hash(str)), _str(new __ConstStringCharHolder(str, CalcLength(str))) {} : BasicStringView(CalcLength(str), Hash(str)), _str(new __ConstStringCharHolder(str, CalcLength(str))) {}
StringView(const char* str, size_t length) noexcept StringView(const char* str, size_t length) noexcept
: BasicStringView(length, Hash(str)), _str(new __ConstStringCharHolder(str, length)) {} : BasicStringView(length, Hash(str)), _str(new __ConstStringCharHolder(str, length)) {}
StringView() noexcept : BasicStringView(0, Hash("")), _str(GetEmptyString()) { _str->AddReference(); } StringView() noexcept : BasicStringView(0, Hash("")), _str(GetEmptyString()) {}
/* Copy operators */ /* Copy operators */
StringView(const StringView& other) noexcept StringView(const StringView& other) noexcept : BasicStringView(other._length, other._hash), _str(other._str) {}
: BasicStringView(other._length, other._hash), _str(other.CloneHolder()) {}
StringView(const BasicStringView& other, const char* c, size_t length) noexcept StringView(const BasicStringView& other, const char* c, size_t length) noexcept
: BasicStringView(length, other.GetHash()), _str(new __ConstStringCharHolder(c, length)) {} : BasicStringView(length, other.GetHash()), _str(new __ConstStringCharHolder(c, length)) {}
StringView& operator=(const StringView& other) noexcept { StringView& operator=(const StringView& other) noexcept {
if (_str == other._str) { if (_str == other._str) {
_str->AddReference();
return *this; return *this;
} }
_str->RemoveReference(); _str = other._str;
_str = other.CloneHolder();
_length = other._length; _length = other._length;
_hash = other._hash; _hash = other._hash;
return *this; return *this;
} }
~StringView() noexcept { _str->RemoveReference(); }
[[nodiscard]] inline constexpr const char* c_str() const noexcept override { return _str->GetValue(); } [[nodiscard]] inline constexpr const char* c_str() const noexcept override { return _str->GetValue(); }
[[nodiscard]] inline std::string_view std_str() const noexcept override { return _str->GetValue(); } [[nodiscard]] inline std::string_view std_str() const noexcept override { return _str->GetValue(); }
@ -99,8 +79,11 @@ namespace ArbUt {
inline constexpr bool operator==(const char* rhs) const noexcept override { return _hash == Hash(rhs); } inline constexpr bool operator==(const char* rhs) const noexcept override { return _hash == Hash(rhs); }
inline constexpr bool operator!=(const char* rhs) const noexcept override { return _hash != Hash(rhs); } inline constexpr bool operator!=(const char* rhs) const noexcept override { return _hash != Hash(rhs); }
inline static constexpr uint32_t CalculateHash(const char* val) noexcept { return Hash(val); } [[maybe_unused]] [[nodiscard]] inline static constexpr uint32_t CalculateHash(const char* val) noexcept {
inline static constexpr uint32_t CalculateHash(const std::string_view& val) noexcept { return Hash(val);
}
[[maybe_unused]] [[nodiscard]] inline static constexpr uint32_t
CalculateHash(const std::string_view& val) noexcept {
return Hash(val.data()); return Hash(val.data());
} }
}; };