summaryrefslogtreecommitdiffstats
path: root/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'source/core')
-rw-r--r--source/core/slang-string.cpp45
-rw-r--r--source/core/slang-string.h4
2 files changed, 48 insertions, 1 deletions
diff --git a/source/core/slang-string.cpp b/source/core/slang-string.cpp
index a7374d8ba..62bc19754 100644
--- a/source/core/slang-string.cpp
+++ b/source/core/slang-string.cpp
@@ -340,6 +340,51 @@ namespace Slang
}
}
+ void String::reduceLength(Index newLength)
+ {
+ Index oldLength = getLength();
+ SLANG_ASSERT(newLength <= oldLength);
+ if (oldLength == newLength)
+ {
+ return;
+ }
+
+ // It must have a buffer, because only 0 length allows for nullptr
+ // and being 0 sized is already covered
+ SLANG_ASSERT(m_buffer);
+
+ if (m_buffer->isUniquelyReferenced())
+ {
+ m_buffer->length = newLength;
+ m_buffer->getData()[newLength] = 0;
+ }
+ else
+ {
+ // If 0 length is wanted we can just free
+ if (newLength == 0)
+ {
+ m_buffer.setNull();
+ }
+ else
+ {
+ // We need to make a new copy, that we will shrink
+
+ // We'll just go with capacity enough for the new length
+ const Index newCapacity = newLength;
+ StringRepresentation* newRepresentation = StringRepresentation::createWithCapacityAndLength(newCapacity, newLength);
+
+ // Copy
+ char* dst = newRepresentation->getData();
+ memcpy(dst, m_buffer->getData(), sizeof(char) * newLength);
+ // Zero terminate
+ dst[newLength] = 0;
+
+ // Set the new rep
+ m_buffer = newRepresentation;
+ }
+ }
+ }
+
void String::append(const char* textBegin, char const* textEnd)
{
auto oldLength = getLength();
diff --git a/source/core/slang-string.h b/source/core/slang-string.h
index 2312c0439..f42e78ac4 100644
--- a/source/core/slang-string.h
+++ b/source/core/slang-string.h
@@ -559,7 +559,9 @@ namespace Slang
{
return m_buffer ? m_buffer->getLength() : 0;
}
-
+ /// Make the length of the string the amount specified. Must be less than current size
+ void reduceLength(Index length);
+
friend String operator+(const char*op1, const String & op2);
friend String operator+(const String & op1, const char * op2);
friend String operator+(const String & op1, const String & op2);