3#include "MemoryContext.h"
5#include "Foundation/Memory/Allocator.h"
6#include "Foundation/Memory/MemoryBuffer.h"
7#include "Foundation/Platform/Threads.h"
11#include <unordered_map>
24 StringStorage() : strings(
Cogs::MemBlockType::Strings)
26 StringData& null = strings.grow();
31 std::unordered_map<size_t, Cogs::Core::StringRef> stringsByHash;
32 Cogs::Mutex stringMutex;
35 StringStorage& getStorage()
37 static StringStorage storage;
44void Cogs::Core::Strings::cleanup()
46 auto& storage = getStorage();
49 LockGuard lock(storage.stringMutex);
50 strings = std::move(storage.strings);
51 storage.strings.clear();
52 storage.stringsByHash.clear();
55#if defined(__has_feature)
56#if __has_feature(address_sanitizer)
61#if defined(DEBUG) || defined(COGS_PARANOIA) || defined(ASAN) || defined(OSOMP_EnableProfiler)
63 for (
auto& str : strings) {
64 MemoryContext::getStringsAllocator()->deallocate(
const_cast<char*
>(str.str.data()), str.str.size() + 1, MemBlockType::Strings);
72 size_t hash = str.hash();
74 StringStorage& storage = getStorage();
75 LockGuard lock(storage.stringMutex);
76 assert(storage.strings.byteSize() != 0);
78 StringRef head = NoString;
83 if (
auto it = storage.stringsByHash.find(hash); it != storage.stringsByHash.end()) {
87 while (ref != NoString) {
88 const StringData& stringData = storage.strings[ref.value];
89 if (stringData.str == str) {
93 ref = stringData.next;
101 StringRef ref = StringRef{
static_cast<uint32_t
>(storage.strings.size()) };
102 char* strData = (
char*)MemoryContext::getStringsAllocator()->allocate(str.size() + 1, 0, MemBlockType::Strings);
104 ::strncpy_s(strData, str.size() + 1, str.data(), str.size());
105 strData[str.size()] =
'\0';
107 strncpy(strData, str.data(), str.size());
108 strData[str.size()] =
'\0';
110 StringData& stringData = storage.strings.grow();
111 stringData.str = StringView(strData, str.size());
114 stringData.next = head;
115 storage.stringsByHash[hash] = ref;
122 StringStorage& storage = getStorage();
123 LockGuard lock(storage.stringMutex);
124 assert(storage.strings.byteSize() != 0);
126 return storage.strings[ref.value].str;
129const char* Cogs::Core::Strings::getC(StringRef ref)
131 StringStorage& storage = getStorage();
132 LockGuard lock(storage.stringMutex);
133 assert(storage.strings.byteSize() != 0);
135 return storage.strings[ref.value].str.data();
Provides a weakly referenced view over the contents of a string.
Contains all Cogs related functionality.