Get rid of SharedString

This commit is contained in:
Maxime Coste 2016-02-05 09:36:07 +00:00
parent 94cbd5a837
commit 263ef0b149
3 changed files with 23 additions and 57 deletions

View File

@ -56,48 +56,6 @@ struct StringData : UseMemoryDomain<MemoryDomain::SharedString>
using StringDataPtr = RefPtr<StringData>; using StringDataPtr = RefPtr<StringData>;
class SharedString : public StringView
{
public:
SharedString() = default;
SharedString(StringView str)
{
if (not str.empty())
{
m_storage = StringData::create(str);
StringView::operator=(m_storage->strview());
}
}
struct NoCopy{};
SharedString(StringView str, NoCopy) : StringView(str) {}
SharedString(const char* str) : SharedString(StringView{str}) {}
SharedString acquire_substr(ByteCount from, ByteCount length = INT_MAX) const
{
return SharedString{StringView::substr(from, length), m_storage};
}
SharedString acquire_substr(CharCount from, CharCount length = INT_MAX) const
{
return SharedString{StringView::substr(from, length), m_storage};
}
explicit SharedString(StringDataPtr storage)
: StringView{storage->strview()}, m_storage(std::move(storage)) {}
friend size_t hash_value(const SharedString& str)
{
return str.m_storage ? str.m_storage->hash : hash_data(str.data(), (int)str.length());
}
private:
SharedString(StringView str, StringDataPtr storage)
: StringView{str}, m_storage(std::move(storage)) {}
friend class StringRegistry;
StringDataPtr m_storage;
};
class StringRegistry : public Singleton<StringRegistry> class StringRegistry : public Singleton<StringRegistry>
{ {
public: public:

View File

@ -37,7 +37,7 @@ UsedLetters to_lower(UsedLetters letters)
using WordList = Vector<StringView>; using WordList = Vector<StringView>;
static WordList get_words(const SharedString& content) static WordList get_words(StringView content)
{ {
WordList res; WordList res;
using Utf8It = utf8::iterator<const char*, utf8::InvalidPolicy::Pass>; using Utf8It = utf8::iterator<const char*, utf8::InvalidPolicy::Pass>;
@ -56,29 +56,36 @@ static WordList get_words(const SharedString& content)
{ {
const ByteCount start = word_start - content.begin(); const ByteCount start = word_start - content.begin();
const ByteCount length = it.base() - word_start; const ByteCount length = it.base() - word_start;
res.push_back(content.acquire_substr(start, length)); res.push_back(content.substr(start, length));
in_word = false; in_word = false;
} }
} }
return res; return res;
} }
void WordDB::add_words(const SharedString& line) void WordDB::add_words(StringView line)
{ {
for (auto& w : get_words(line)) for (auto& w : get_words(line))
{ {
WordDB::WordInfo& info = m_words[SharedString{intern(w)}]; auto it = m_words.find(w);
++info.refcount; if (it == m_words.end())
if (info.letters.none()) {
auto word = intern(w);
WordDB::WordInfo& info = m_words[word->strview()];
info.word = word;
info.letters = used_letters(w); info.letters = used_letters(w);
++info.refcount;
}
else
++ it->second.refcount;
} }
} }
void WordDB::remove_words(const SharedString& line) void WordDB::remove_words(StringView line)
{ {
for (auto& w : get_words(line)) for (auto& w : get_words(line))
{ {
auto it = m_words.find({w, SharedString::NoCopy()}); auto it = m_words.find(w);
kak_assert(it != m_words.end() and it->second.refcount > 0); kak_assert(it != m_words.end() and it->second.refcount > 0);
if (--it->second.refcount == 0) if (--it->second.refcount == 0)
m_words.erase(it); m_words.erase(it);
@ -92,7 +99,7 @@ WordDB::WordDB(const Buffer& buffer)
for (auto line = 0_line, end = buffer.line_count(); line < end; ++line) for (auto line = 0_line, end = buffer.line_count(); line < end; ++line)
{ {
m_lines.push_back(buffer.line_storage(line)); m_lines.push_back(buffer.line_storage(line));
add_words(SharedString{m_lines.back()}); add_words(m_lines.back()->strview());
} }
} }
@ -123,13 +130,13 @@ void WordDB::update_db()
while (old_line < modif.old_line + modif.num_removed) while (old_line < modif.old_line + modif.num_removed)
{ {
kak_assert(old_line < m_lines.size()); kak_assert(old_line < m_lines.size());
remove_words(SharedString{m_lines[(int)old_line++]}); remove_words(m_lines[(int)old_line++]->strview());
} }
for (auto l = 0_line; l < modif.num_added; ++l) for (auto l = 0_line; l < modif.num_added; ++l)
{ {
new_lines.push_back(buffer.line_storage(modif.new_line + l)); new_lines.push_back(buffer.line_storage(modif.new_line + l));
add_words(SharedString{new_lines.back()}); add_words(new_lines.back()->strview());
} }
} }
while (old_line != (int)m_lines.size()) while (old_line != (int)m_lines.size())
@ -140,7 +147,7 @@ void WordDB::update_db()
int WordDB::get_word_occurences(StringView word) const int WordDB::get_word_occurences(StringView word) const
{ {
auto it = m_words.find({word, SharedString::NoCopy()}); auto it = m_words.find(word);
if (it != m_words.end()) if (it != m_words.end())
return it->second.refcount; return it->second.refcount;
return 0; return 0;

View File

@ -30,15 +30,16 @@ public:
int get_word_occurences(StringView word) const; int get_word_occurences(StringView word) const;
private: private:
void update_db(); void update_db();
void add_words(const SharedString& line); void add_words(StringView line);
void remove_words(const SharedString& line); void remove_words(StringView line);
struct WordInfo struct WordInfo
{ {
StringDataPtr word;
UsedLetters letters; UsedLetters letters;
int refcount; int refcount;
}; };
using WordToInfo = UnorderedMap<SharedString, WordInfo, MemoryDomain::WordDB>; using WordToInfo = UnorderedMap<StringView, WordInfo, MemoryDomain::WordDB>;
using Lines = Vector<StringDataPtr, MemoryDomain::WordDB>; using Lines = Vector<StringDataPtr, MemoryDomain::WordDB>;
SafePtr<const Buffer> m_buffer; SafePtr<const Buffer> m_buffer;