Move codePointAt() to separate CodePointSequence class.
This commit is contained in:
+14
-1
@@ -144,6 +144,7 @@ static const char* coreLibSource =
|
||||
"\n"
|
||||
"class String is Sequence {\n"
|
||||
" bytes { StringByteSequence.new(this) }\n"
|
||||
" codePoints { StringCodePointSequence.new(this) }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class StringByteSequence is Sequence {\n"
|
||||
@@ -158,6 +159,18 @@ static const char* coreLibSource =
|
||||
" count { _string.byteCount_ }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class StringCodePointSequence is Sequence {\n"
|
||||
" construct new(string) {\n"
|
||||
" _string = string\n"
|
||||
" }\n"
|
||||
"\n"
|
||||
" [index] { _string.codePointAt_(index) }\n"
|
||||
" iterate(iterator) { _string.iterate(iterator) }\n"
|
||||
" iteratorValue(iterator) { _string.codePointAt_(iterator) }\n"
|
||||
"\n"
|
||||
" count { _string.count }\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"class List is Sequence {\n"
|
||||
" addAll(other) {\n"
|
||||
" for (element in other) {\n"
|
||||
@@ -1418,7 +1431,7 @@ void wrenInitializeCore(WrenVM* vm)
|
||||
PRIMITIVE(vm->stringClass, "[_]", string_subscript);
|
||||
PRIMITIVE(vm->stringClass, "byteAt_(_)", string_byteAt);
|
||||
PRIMITIVE(vm->stringClass, "byteCount_", string_byteCount);
|
||||
PRIMITIVE(vm->stringClass, "codePointAt(_)", string_codePointAt);
|
||||
PRIMITIVE(vm->stringClass, "codePointAt_(_)", string_codePointAt);
|
||||
PRIMITIVE(vm->stringClass, "contains(_)", string_contains);
|
||||
PRIMITIVE(vm->stringClass, "count", string_count);
|
||||
PRIMITIVE(vm->stringClass, "endsWith(_)", string_endsWith);
|
||||
|
||||
+12
-2
@@ -772,8 +772,18 @@ Value wrenStringCodePointAt(WrenVM* vm, ObjString* string, uint32_t index)
|
||||
{
|
||||
ASSERT(index < string->length, "Index out of bounds.");
|
||||
|
||||
int numBytes = wrenUtf8DecodeNumBytes(string->value[index]);
|
||||
return wrenNewString(vm, string->value + index, numBytes);
|
||||
int codePoint = wrenUtf8Decode((uint8_t*)string->value + index,
|
||||
string->length - index);
|
||||
if (codePoint == -1)
|
||||
{
|
||||
// If it isn't a valid UTF-8 sequence, treat it as a single raw byte.
|
||||
char bytes[2];
|
||||
bytes[0] = string->value[index];
|
||||
bytes[1] = '\0';
|
||||
return wrenNewString(vm, bytes, 1);
|
||||
}
|
||||
|
||||
return wrenStringFromCodePoint(vm, codePoint);
|
||||
}
|
||||
|
||||
// Uses the Boyer-Moore-Horspool string matching algorithm.
|
||||
|
||||
Reference in New Issue
Block a user