summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-01-25 22:36:05 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-01-25 22:36:05 +0000
commit42966317b8c91f907a681dabdce2d0fdb17bbbd9 (patch)
treeec534f5c2886480f87ed19c3f2d41a6ba4d18a1b /src
parent79954e89ab1bb41295501159c72708b24303eb77 (diff)
Tweak SharedString
Diffstat (limited to 'src')
-rw-r--r--src/buffer.cc4
-rw-r--r--src/shared_string.hh15
2 files changed, 10 insertions, 9 deletions
diff --git a/src/buffer.cc b/src/buffer.cc
index 629842e2..5677bf35 100644
--- a/src/buffer.cc
+++ b/src/buffer.cc
@@ -32,7 +32,7 @@ Buffer::Buffer(String name, Flags flags, BufferLines lines,
for (auto& line : lines)
{
- kak_assert(not line->length == 0 and line->data[line->length-1] == '\n');
+ kak_assert(not line->length == 0 and line->data()[line->length-1] == '\n');
}
static_cast<BufferLines&>(m_lines) = std::move(lines);
@@ -173,7 +173,7 @@ void Buffer::reload(BufferLines lines, time_t fs_timestamp)
for (auto& line : lines)
{
- kak_assert(not line->length == 0 and line->data[line->length-1] == '\n');
+ kak_assert(not line->length == 0 and line->data()[line->length-1] == '\n');
if (not (m_flags & Flags::NoUndo))
m_current_undo_group.emplace_back(
Modification::Insert, line_count()-1, m_lines.back());
diff --git a/src/shared_string.hh b/src/shared_string.hh
index 3ed571e8..a3ffcd92 100644
--- a/src/shared_string.hh
+++ b/src/shared_string.hh
@@ -13,27 +13,28 @@ struct StringStorage : UseMemoryDomain<MemoryDomain::SharedString>
{
int refcount;
int length;
- char data[1];
- StringView strview() const { return {data, length}; }
+ char* data() { return reinterpret_cast<char*>(this + 1); }
+ const char* data() const { return reinterpret_cast<const char*>(this + 1); }
+ StringView strview() const { return {data(), length}; }
static StringStorage* create(StringView str, char back = 0)
{
const int len = (int)str.length() + (back != 0 ? 1 : 0);
- void* ptr = StringStorage::operator new(sizeof(StringStorage) + len);
+ void* ptr = StringStorage::operator new(sizeof(StringStorage) + len + 1);
StringStorage* res = reinterpret_cast<StringStorage*>(ptr);
- memcpy(res->data, str.data(), (int)str.length());
+ memcpy(res->data(), str.data(), (int)str.length());
res->refcount = 0;
res->length = len;
if (back != 0)
- res->data[len-1] = back;
- res->data[len] = 0;
+ res->data()[len-1] = back;
+ res->data()[len] = 0;
return res;
}
static void destroy(StringStorage* s)
{
- StringStorage::operator delete(s, sizeof(StringStorage) + s->length);
+ StringStorage::operator delete(s, sizeof(StringStorage) + s->length + 1);
}
friend void inc_ref_count(StringStorage* s) { ++s->refcount; }