From f4d900dfb64d95f121dd8565dd269be061ef8509 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Thu, 29 Jun 2017 11:50:55 -0700 Subject: Overhaul `RefPtr` and `String` - `RefPtr` no longer tries to have distinct cases for interal-vs-external reference counts. Instead we always require an internal reference count. - Types the used `RefPtr` but weren't `RefObject` were made to inherit `RefObject` - The `ReferenceCounted` base class was removed, so that only `RefObject` remains - Implicit conversion from `RefPtr` to `T*` added - This created some complicates for other types that relied on implicit conversions, so this isn't a net cleanup right now - The main type that got messed up by the above was `String`, which previously held a `RefPtr`. This change thus *also* includes a major overhaul of `String`: - `String` now holds all its data via indirection, using a `StringRepresentation` that is a `RefObject`. This object holds a length, capacity, and directly stores the character data in its allocation. This means that `sizeof(String)==sizeof(void*)` - It is now possible to directly mutate a `String` by appending to its representation (we just need to ensure it has a reference count of `1`, possibly by cloning it). This means that `StringBuilder` is now basically just an idomatic use of `String` - A couple operations that just return sub-ranges of a `String` now return `StringSlice` to avoid allocation when it isn't needed. This required more work. - Indices into strings changed from `int` to `UInt` (which is pointer-sized). This had a bunch of follow-on changes because the value `-1` sometimes needs to be special-cased in code that uses indices. Further cleanups are probably needed here. --- source/core/text-io.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source/core/text-io.cpp') diff --git a/source/core/text-io.cpp b/source/core/text-io.cpp index 3e5013cf3..7815d7422 100644 --- a/source/core/text-io.cpp +++ b/source/core/text-io.cpp @@ -28,7 +28,7 @@ namespace Slang public: virtual void GetBytes(List & result, const String & str) override { - int ptr = 0; + UInt ptr = 0; while (ptr < str.Length()) { int codePoint = GetUnicodePointFromUTF8([&](int) @@ -66,7 +66,7 @@ namespace Slang {} virtual void GetBytes(List & result, const String & str) override { - int ptr = 0; + UInt ptr = 0; while (ptr < str.Length()) { int codePoint = GetUnicodePointFromUTF8([&](int) @@ -156,7 +156,7 @@ namespace Slang #else newLine = "\n"; #endif - for (int i = 0; i < str.Length(); i++) + for (UInt i = 0; i < str.Length(); i++) { if (str[i] == '\r') sb << newLine; -- cgit v1.2.3