Repository: lucy-clownfish Updated Branches: refs/heads/master 0adb5d68c -> 9baec9f6d
Eliminate StackStringIterator Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/9baec9f6 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/9baec9f6 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/9baec9f6 Branch: refs/heads/master Commit: 9baec9f6d49b860ca85cad2a5d2c6f444e80724c Parents: 0adb5d6 Author: Nick Wellnhofer <[email protected]> Authored: Sat May 9 21:27:05 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Sat May 9 22:59:46 2015 +0200 ---------------------------------------------------------------------- runtime/core/Clownfish/String.c | 112 ++++++++++++++------------------- runtime/core/Clownfish/String.cfh | 20 ------ 2 files changed, 46 insertions(+), 86 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9baec9f6/runtime/core/Clownfish/String.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/String.c b/runtime/core/Clownfish/String.c index 776d708..8764c1d 100644 --- a/runtime/core/Clownfish/String.c +++ b/runtime/core/Clownfish/String.c @@ -17,7 +17,6 @@ #define C_CFISH_STRING #define C_CFISH_STACKSTRING #define C_CFISH_STRINGITERATOR -#define C_CFISH_STACKSTRINGITERATOR #define CFISH_USE_SHORT_NAMES #include <string.h> @@ -33,10 +32,8 @@ #include "Clownfish/Util/Memory.h" #include "Clownfish/Util/StringHelper.h" -#define STR_STACKTOP(string) \ - Str_StackTop(string, alloca(sizeof(StackStringIterator))) -#define STR_STACKTAIL(string) \ - Str_StackTail(string, alloca(sizeof(StackStringIterator))) +#define STACK_ITER(string, byte_offset) \ + S_new_stack_iter(alloca(sizeof(StringIterator)), string, byte_offset) // Helper function for throwing invalid UTF-8 error. Since THROW uses // a String internally, calling THROW with invalid UTF-8 would create an @@ -48,6 +45,9 @@ static void S_die_invalid_utf8(const char *text, size_t size, const char *file, int line, const char *func); +static StringIterator* +S_new_stack_iter(void *allocation, String *string, size_t byte_offset); + String* Str_new_from_utf8(const char *utf8, size_t size) { if (!StrHelp_utf8_valid(utf8, size)) { @@ -188,10 +188,9 @@ Str_Destroy_IMP(String *self) { size_t Str_Hash_Sum_IMP(String *self) { size_t hashvalue = 5381; - StackStringIterator *iter = STR_STACKTOP(self); + StringIterator *iter = STACK_ITER(self, 0); - const SStrIter_Next_t next - = METHOD_PTR(STACKSTRINGITERATOR, CFISH_SStrIter_Next); + const StrIter_Next_t next = METHOD_PTR(STRINGITERATOR, CFISH_StrIter_Next); int32_t code_point; while (STRITER_DONE != (code_point = next(iter))) { hashvalue = ((hashvalue << 5) + hashvalue) ^ code_point; @@ -218,10 +217,10 @@ Str_To_String_IMP(String *self) { String* Str_Swap_Chars_IMP(String *self, int32_t match, int32_t replacement) { CharBuf *charbuf = CB_new(self->size); - StackStringIterator *iter = STR_STACKTOP(self); + StringIterator *iter = STACK_ITER(self, 0); int32_t code_point; - while (STRITER_DONE != (code_point = SStrIter_Next(iter))) { + while (STRITER_DONE != (code_point = StrIter_Next(iter))) { if (code_point == match) { code_point = replacement; } CB_Cat_Char(charbuf, code_point); } @@ -238,14 +237,14 @@ Str_To_I64_IMP(String *self) { int64_t Str_BaseX_To_I64_IMP(String *self, uint32_t base) { - StackStringIterator *iter = STR_STACKTOP(self); + StringIterator *iter = STACK_ITER(self, 0); int64_t retval = 0; bool is_negative = false; - int32_t code_point = SStrIter_Next(iter); + int32_t code_point = StrIter_Next(iter); // Advance past minus sign. if (code_point == '-') { - code_point = SStrIter_Next(iter); + code_point = StrIter_Next(iter); is_negative = true; } @@ -262,7 +261,7 @@ Str_BaseX_To_I64_IMP(String *self, uint32_t base) { else { break; } - code_point = SStrIter_Next(iter); + code_point = StrIter_Next(iter); } // Apply minus sign. @@ -391,14 +390,14 @@ Str_Find_IMP(String *self, String *substring) { int64_t Str_Find_Utf8_IMP(String *self, const char *ptr, size_t size) { - StackStringIterator *iter = STR_STACKTOP(self); + StringIterator *iter = STACK_ITER(self, 0); int64_t location = 0; while (iter->byte_offset + size <= self->size) { if (memcmp(self->ptr + iter->byte_offset, ptr, size) == 0) { return location; } - SStrIter_Advance(iter, 1); + StrIter_Advance(iter, 1); location++; } @@ -407,13 +406,13 @@ Str_Find_Utf8_IMP(String *self, const char *ptr, size_t size) { String* Str_Trim_IMP(String *self) { - StackStringIterator *top = STR_STACKTOP(self); - SStrIter_Skip_Next_Whitespace(top); + StringIterator *top = STACK_ITER(self, 0); + StrIter_Skip_Next_Whitespace(top); - StackStringIterator *tail = NULL; + StringIterator *tail = NULL; if (top->byte_offset < self->size) { - tail = STR_STACKTAIL(self); - SStrIter_Skip_Prev_Whitespace(tail); + tail = STACK_ITER(self, self->size); + StrIter_Skip_Prev_Whitespace(tail); } return StrIter_substring((StringIterator*)top, (StringIterator*)tail); @@ -421,49 +420,49 @@ Str_Trim_IMP(String *self) { String* Str_Trim_Top_IMP(String *self) { - StackStringIterator *top = STR_STACKTOP(self); - SStrIter_Skip_Next_Whitespace(top); + StringIterator *top = STACK_ITER(self, 0); + StrIter_Skip_Next_Whitespace(top); return StrIter_substring((StringIterator*)top, NULL); } String* Str_Trim_Tail_IMP(String *self) { - StackStringIterator *tail = STR_STACKTAIL(self); - SStrIter_Skip_Prev_Whitespace(tail); + StringIterator *tail = STACK_ITER(self, self->size); + StrIter_Skip_Prev_Whitespace(tail); return StrIter_substring(NULL, (StringIterator*)tail); } size_t Str_Length_IMP(String *self) { - StackStringIterator *iter = STR_STACKTOP(self); - return SStrIter_Advance(iter, SIZE_MAX); + StringIterator *iter = STACK_ITER(self, 0); + return StrIter_Advance(iter, SIZE_MAX); } int32_t Str_Code_Point_At_IMP(String *self, size_t tick) { - StackStringIterator *iter = STR_STACKTOP(self); - SStrIter_Advance(iter, tick); - int32_t code_point = SStrIter_Next(iter); + StringIterator *iter = STACK_ITER(self, 0); + StrIter_Advance(iter, tick); + int32_t code_point = StrIter_Next(iter); return code_point == STRITER_DONE ? 0 : code_point; } int32_t Str_Code_Point_From_IMP(String *self, size_t tick) { if (tick == 0) { return 0; } - StackStringIterator *iter = STR_STACKTAIL(self); - SStrIter_Recede(iter, tick - 1); - int32_t code_point = SStrIter_Prev(iter); + StringIterator *iter = STACK_ITER(self, self->size); + StrIter_Recede(iter, tick - 1); + int32_t code_point = StrIter_Prev(iter); return code_point == STRITER_DONE ? 0 : code_point; } String* Str_SubString_IMP(String *self, size_t offset, size_t len) { - StackStringIterator *iter = STR_STACKTOP(self); + StringIterator *iter = STACK_ITER(self, 0); - SStrIter_Advance(iter, offset); + StrIter_Advance(iter, offset); size_t start_offset = iter->byte_offset; - SStrIter_Advance(iter, len); + StrIter_Advance(iter, len); size_t size = iter->byte_offset - start_offset; return S_new_substring(self, start_offset, size); @@ -517,16 +516,6 @@ Str_Tail_IMP(String *self) { return StrIter_new(self, self->size); } -StackStringIterator* -Str_StackTop_IMP(String *self, void *allocation) { - return SStrIter_new(allocation, self, 0); -} - -StackStringIterator* -Str_StackTail_IMP(String *self, void *allocation) { - return SStrIter_new(allocation, self, self->size); -} - /*****************************************************************/ StackString* @@ -564,6 +553,17 @@ StrIter_new(String *string, size_t byte_offset) { return self; } +static StringIterator* +S_new_stack_iter(void *allocation, String *string, size_t byte_offset) { + StringIterator *self + = (StringIterator*)Class_Init_Obj(STRINGITERATOR, allocation); + // Assume that the string will be available for the lifetime of the + // iterator and don't increase its refcount. + self->string = string; + self->byte_offset = byte_offset; + return self; +} + String* StrIter_substring(StringIterator *top, StringIterator *tail) { String *string; @@ -879,24 +879,4 @@ StrIter_Destroy_IMP(StringIterator *self) { SUPER_DESTROY(self, STRINGITERATOR); } -/*****************************************************************/ - -StackStringIterator* -SStrIter_new(void *allocation, String *string, size_t byte_offset) { - StackStringIterator *self - = (StackStringIterator*)Class_Init_Obj(STACKSTRINGITERATOR, - allocation); - // Assume that the string will be available for the lifetime of the - // iterator and don't increase its refcount. - self->string = string; - self->byte_offset = byte_offset; - return self; -} - -void -SStrIter_Destroy_IMP(StackStringIterator *self) { - UNUSED_VAR(self); - THROW(ERR, "Can't destroy a StackStringIterator"); -} - http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9baec9f6/runtime/core/Clownfish/String.cfh ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/String.cfh b/runtime/core/Clownfish/String.cfh index b797c40..bf2ce7f 100644 --- a/runtime/core/Clownfish/String.cfh +++ b/runtime/core/Clownfish/String.cfh @@ -270,16 +270,6 @@ class Clownfish::String nickname Str */ incremented StringIterator* Tail(String *self); - - /** Return a stack iterator to the start of the string. - */ - incremented StackStringIterator* - StackTop(String *self, void *allocation); - - /** Return a stack iterator to the end of the string. - */ - incremented StackStringIterator* - StackTail(String *self, void *allocation); } class Clownfish::StackString nickname SStr @@ -408,16 +398,6 @@ class Clownfish::StringIterator nickname StrIter Destroy(StringIterator *self); } -class Clownfish::StackStringIterator nickname SStrIter - inherits Clownfish::StringIterator { - - inert incremented StackStringIterator* - new(void *allocation, String *string, size_t byte_offset); - - public void - Destroy(StackStringIterator *self); -} - __C__ #define CFISH_SSTR_BLANK() \
