diff options
| author | Maxime Coste <mawww@kakoune.org> | 2016-12-03 12:32:16 +0000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2016-12-03 12:32:16 +0000 |
| commit | 75986911f88b78b54811db6a19f8009c6f9c41a3 (patch) | |
| tree | e78711a767282cdfa06a735189463f9dd99a5043 /src/shared_string.hh | |
| parent | 5ff8245cc84a15d6a48bd2e19e4c70d4f8ae3f77 (diff) | |
Refactor RefPtr handling to use a policy class
THe previous overload based system was pretty complex for no good
reason.
Diffstat (limited to 'src/shared_string.hh')
| -rw-r--r-- | src/shared_string.hh | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/shared_string.hh b/src/shared_string.hh index 112b67f2..49bbdb4c 100644 --- a/src/shared_string.hh +++ b/src/shared_string.hh @@ -24,7 +24,14 @@ struct StringData : UseMemoryDomain<MemoryDomain::SharedString> [[gnu::always_inline]] StringView strview() const { return {data(), length}; } - static RefPtr<StringData> create(StringView str, char back = 0) + struct PtrPolicy + { + static void inc_ref(StringData* r, void*) { ++r->refcount; } + static void dec_ref(StringData* r, void*) { if (--r->refcount == 0) delete r; } + static void ptr_moved(StringData*, void*, void*) noexcept {} + }; + + static RefPtr<StringData, PtrPolicy> create(StringView str, char back = 0) { const int len = (int)str.length() + (back != 0 ? 1 : 0); void* ptr = StringData::operator new(sizeof(StringData) + len + 1); @@ -34,7 +41,7 @@ struct StringData : UseMemoryDomain<MemoryDomain::SharedString> res->data()[len-1] = back; res->data()[len] = 0; res->hash = hash_data(res->data(), res->length); - return RefPtr<StringData>(res); + return RefPtr<StringData, PtrPolicy>{res}; } static void destroy(StringData* s) @@ -54,7 +61,7 @@ struct StringData : UseMemoryDomain<MemoryDomain::SharedString> } }; -using StringDataPtr = RefPtr<StringData>; +using StringDataPtr = RefPtr<StringData, StringData::PtrPolicy>; class StringRegistry : public Singleton<StringRegistry> { |
