summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-slice-allocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-slice-allocator.cpp')
-rw-r--r--source/compiler-core/slang-slice-allocator.cpp46
1 files changed, 38 insertions, 8 deletions
diff --git a/source/compiler-core/slang-slice-allocator.cpp b/source/compiler-core/slang-slice-allocator.cpp
index 9985f6b19..9a0620ced 100644
--- a/source/compiler-core/slang-slice-allocator.cpp
+++ b/source/compiler-core/slang-slice-allocator.cpp
@@ -5,9 +5,9 @@
namespace Slang {
-/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SliceConverter !!!!!!!!!!!!!!!!!!!!!!!!!!! */
+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SliceUtil !!!!!!!!!!!!!!!!!!!!!!!!!!! */
-/* static */ List<String> SliceConverter::toList(const Slice<TerminatedCharSlice>& in)
+/* static */ List<String> SliceUtil::toList(const Slice<TerminatedCharSlice>& in)
{
List<String> list;
const auto count = in.count;
@@ -20,20 +20,21 @@ namespace Slang {
return list;
}
-/* static */TerminatedCharSlice SliceConverter::toTerminatedCharSlice(SliceAllocator& allocator, ISlangBlob* blob)
+/* static */const char* SliceUtil::getTerminated(ISlangBlob* blob, TerminatedCharSlice& outSlice)
{
const auto size = blob->getBufferSize();
-
if (size == 0)
{
- return TerminatedCharSlice();
+ outSlice = TerminatedCharSlice();
+ return outSlice.begin();
}
// If there is a 0 at the end byte, we are zero terminated
const char* chars = (const char*)blob->getBufferPointer();
if (chars[size - 1] == 0)
{
- return TerminatedCharSlice(chars, Count(size - 1));
+ outSlice = TerminatedCharSlice(chars, Count(size - 1));
+ return chars;
}
// See if it has a castable interface
@@ -42,15 +43,44 @@ namespace Slang {
{
if (castable->castAs(SlangTerminatedChars::getTypeGuid()))
{
- return TerminatedCharSlice(chars, Count(size));
+ outSlice = TerminatedCharSlice(chars, Count(size));
+ return chars;
}
}
+ return nullptr;
+}
+
+/* static */TerminatedCharSlice SliceUtil::toTerminatedCharSlice(SliceAllocator& allocator, ISlangBlob* blob)
+{
+ TerminatedCharSlice slice;
+ if (SliceUtil::getTerminated(blob, slice))
+ {
+ return slice;
+ }
+ const auto size = blob->getBufferSize();
// We are out of options, we just have to allocate with zero termination which allocateString does
- auto dst = allocator.getArena().allocateString(chars, Count(size));
+ auto dst = allocator.getArena().allocateString((const char*)blob->getBufferPointer(), Count(size));
return TerminatedCharSlice(dst, Count(size));
}
+/* static */TerminatedCharSlice SliceUtil::toTerminatedCharSlice(StringBuilder& storage, ISlangBlob* blob)
+{
+ TerminatedCharSlice slice;
+ if (SliceUtil::getTerminated(blob, slice))
+ {
+ return slice;
+ }
+
+ const auto size = blob->getBufferSize();
+ auto chars = (const char*)blob->getBufferPointer();
+
+ storage.Clear();
+ storage.append(UnownedStringSlice(chars, size));
+
+ return TerminatedCharSlice(storage.getBuffer(), Count(size));
+}
+
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SliceAllocator !!!!!!!!!!!!!!!!!!!!!!!!!!! */
TerminatedCharSlice SliceAllocator::allocate(const char* in)