summaryrefslogtreecommitdiff
path: root/src/shared_string.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2016-12-03 12:32:16 +0000
committerMaxime Coste <mawww@kakoune.org>2016-12-03 12:32:16 +0000
commit75986911f88b78b54811db6a19f8009c6f9c41a3 (patch)
treee78711a767282cdfa06a735189463f9dd99a5043 /src/shared_string.hh
parent5ff8245cc84a15d6a48bd2e19e4c70d4f8ae3f77 (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.hh13
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>
{