From f7bd819e5f3f61e3695e9a1dcd106ef3c438efc4 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sun, 17 May 2015 03:37:21 -0400 Subject: [PATCH] Jupiter::String_Type: * Added more replace() functions * Added another remove() function * Added a processEscapeSequences() function Jupiter::Shift_String_Type: * Added slight optimization for new remove() function --- Jupiter/Shift_String.h | 10 +- Jupiter/Shift_String_Imp.h | 8 + Jupiter/String_Type.h | 26 +++ Jupiter/String_Type_Imp.h | 317 ++++++++++++++++++++++++++++++++++--- Release/Jupiter.lib | Bin 260138 -> 259348 bytes 5 files changed, 338 insertions(+), 23 deletions(-) diff --git a/Jupiter/Shift_String.h b/Jupiter/Shift_String.h index c030286..03882dd 100644 --- a/Jupiter/Shift_String.h +++ b/Jupiter/Shift_String.h @@ -60,7 +60,15 @@ namespace Jupiter * @param value Value of the element to remove. * @return True if an element was removed, false otherwise. */ - virtual bool remove(const T &value); + virtual bool remove(const T &value) override; + + /** + * @brief Removes a number of elements starting at an index. + * + * @param index Index to start removing elements at. + * @param length Number of elements to remove. + */ + virtual void remove(size_t index, size_t length) override; /** * @brief Default constructor for the Shift_String_Type class. diff --git a/Jupiter/Shift_String_Imp.h b/Jupiter/Shift_String_Imp.h index 6fda85b..7a88645 100644 --- a/Jupiter/Shift_String_Imp.h +++ b/Jupiter/Shift_String_Imp.h @@ -64,6 +64,14 @@ template bool Jupiter::Shift_String_Type::remove(const T &value) return Jupiter::String_Type::remove(value); } +template void Jupiter::Shift_String_Type::remove(size_t index, size_t length) +{ + if (index == 0) + this->shiftRight(length); + else + Jupiter::String_Type::remove(index, length); +} + template bool Jupiter::Shift_String_Type::setBufferSize(size_t len) { if (len > Jupiter::String_Type::length) diff --git a/Jupiter/String_Type.h b/Jupiter/String_Type.h index 27a6401..2e31cbd 100644 --- a/Jupiter/String_Type.h +++ b/Jupiter/String_Type.h @@ -102,6 +102,20 @@ namespace Jupiter */ virtual bool remove(const T &value); + /** + * @brief Removes a number of elements starting at an index. + * + * @param index Index to start removing elements at. + * @param length Number of elements to remove. + */ + virtual void remove(size_t index, size_t length); + + /** + * @brief Processes escape sequences in a string. + * Source reference: http://en.cppreference.com/w/cpp/language/escape + */ + virtual void processEscapeSequences(); + /** * @brief Sets the value of an element at the specified index. * Note: If the index is not in the string, it will be added. @@ -137,6 +151,18 @@ namespace Jupiter virtual size_t insert(size_t index, const T &value); virtual size_t insert(size_t index, const Jupiter::Readable_String &value); + /** + * @brief Replaces data at an index with a specified value. + * + * @param index Index to start replacing at. + * @param length Number of elements to replace. + * @param value Value to write over the elements. + * @return New size of the string. + */ + virtual size_t replace(size_t index, size_t length, const T &value); + virtual size_t replace(size_t index, size_t length, const T *value, size_t valueSize); + virtual size_t replace(size_t index, size_t length, const Jupiter::Readable_String &value); + /** * @brief Replaces all instances of one value with another value. * diff --git a/Jupiter/String_Type_Imp.h b/Jupiter/String_Type_Imp.h index 4b91d87..910732b 100644 --- a/Jupiter/String_Type_Imp.h +++ b/Jupiter/String_Type_Imp.h @@ -132,14 +132,197 @@ template bool Jupiter::String_Type::remove(const T &value) return false; } +template void Jupiter::String_Type::remove(size_t index, size_t length) +{ + if (index >= Jupiter::String_Type::length) + return; + + if (index + length >= Jupiter::String_Type::length) + Jupiter::String_Type::length = index; + else + { + Jupiter::String_Type::length -= length; + length += index; + + Jupiter::String_Type::str[index] = Jupiter::String_Type::str[length]; + while (++index != Jupiter::String_Type::length) + Jupiter::String_Type::str[index] = Jupiter::String_Type::str[++length]; + } +} + +// processEscapeSequences + +template void Jupiter::String_Type::processEscapeSequences() +{ +} + +template<> inline void Jupiter::String_Type::processEscapeSequences() +{ + if (Jupiter::String_Type::length == 0) + return; + + size_t index = 0; + while (index + 1 != Jupiter::String_Type::length) + { + printf("Processing: %c (%u) @ %u" ENDL, this->get(index), this->get(index), index); + if (this->get(index) == '\\') + { + switch (this->get(++index)) + { + case '0': + case '1': + case '2': + case '3': + if (index + 1 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 1), 8)) + { + if (index + 2 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 2), 8)) + this->replace(index - 1, 4, static_cast(Jupiter_getBase(this->get(index), 8)) << 6 | static_cast(Jupiter_getBase(this->get(index + 1), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 2), 8))); + else + this->replace(index - 1, 3, static_cast(Jupiter_getBase(this->get(index), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 1), 8))); + } + else + this->replace(index - 1, 2, static_cast(Jupiter_getBase(this->get(index), 8))); + break; + case '4': + case '5': + case '6': + case '7': + if (index + 1 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 1), 8)) + this->replace(index - 1, 3, static_cast(Jupiter_getBase(this->get(index), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 1), 8))); + else + this->replace(index - 1, 2, static_cast(Jupiter_getBase(this->get(index), 8))); + break; + case 'a': + this->replace(index - 1, 2, '\a'); + break; + case 'b': + this->replace(index - 1, 2, '\b'); + break; + case 'f': + this->replace(index - 1, 2, '\f'); + break; + case 'n': + this->replace(index - 1, 2, '\n'); + break; + case 'r': + this->replace(index - 1, 2, '\r'); + break; + case 't': + this->replace(index - 1, 2, '\t'); + break; + case 'v': + this->replace(index - 1, 2, '\v'); + break; + case '?': + this->replace(index - 1, 2, '\?'); + break; + case '\'': + this->replace(index - 1, 2, '\''); + break; + case '\"': + this->replace(index - 1, 2, '\"'); + break; + case '\\': + this->replace(index - 1, 2, '\\'); + break; + case 'x': + if (Jupiter::String_Type::length >= index + 2 + && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16)) + this->replace(index - 1, 4, static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16))); + break; + case 'U': + if (Jupiter::String_Type::length >= index + 8 + && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16) && Jupiter_isBase(this->get(index + 3), 16) && Jupiter_isBase(this->get(index + 4), 16) && Jupiter_isBase(this->get(index + 5), 16) && Jupiter_isBase(this->get(index + 6), 16) && Jupiter_isBase(this->get(index + 7), 16) && Jupiter_isBase(this->get(index + 8), 16)) + { + uint32_t codepoint = static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16)); + codepoint <<= 8; + codepoint |= static_cast(Jupiter_getBase(this->get(index + 3), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 4), 16)); + codepoint <<= 8; + codepoint |= static_cast(Jupiter_getBase(this->get(index + 5), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 6), 16)); + codepoint <<= 8; + codepoint |= static_cast(Jupiter_getBase(this->get(index + 7), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 8), 16)); + if (codepoint <= 0x007F) + this->replace(index - 1, 10, static_cast(codepoint)); + else if (codepoint <= 0x07FF) + { + char bytes[2]; + bytes[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + bytes[1] = 0x80 | (codepoint & 0x3F); + this->replace(index - 1, 10, bytes, sizeof(bytes)); + ++index; + } + else if (codepoint <= 0xFFFF) + { + char bytes[3]; + bytes[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + bytes[1] = 0x80 | ((codepoint >> 6) & 0x3F); + bytes[2] = 0x80 | (codepoint & 0x3F); + this->replace(index - 1, 10, bytes, sizeof(bytes)); + index += 2; + } + else if (codepoint <= 0x10FFFF) + { + char bytes[4]; + bytes[0] = 0xE0 | ((codepoint >> 18) & 0x0F); + bytes[1] = 0x80 | ((codepoint >> 12) & 0x3F); + bytes[2] = 0x80 | ((codepoint >> 6) & 0x3F); + bytes[3] = 0x80 | (codepoint & 0x3F); + this->replace(index - 1, 10, bytes, sizeof(bytes)); + index += 3; + } + } + break; + case 'u': + if (Jupiter::String_Type::length >= index + 4 + && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16) && Jupiter_isBase(this->get(index + 3), 16) && Jupiter_isBase(this->get(index + 4), 16)) + { + uint16_t codepoint = static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16)); + codepoint <<= 8; + codepoint |= static_cast(Jupiter_getBase(this->get(index + 3), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 4), 16)); + if (codepoint <= 0x007F) + this->replace(index - 1, 6, static_cast(codepoint)); + else if (codepoint <= 0x07FF) + { + char bytes[2]; + bytes[0] = 0xC0 | ((codepoint >> 6) & 0x1F); + bytes[1] = 0x80 | (codepoint & 0x3F); + this->replace(index - 1, 6, bytes, sizeof(bytes)); + ++index; + } + else if (codepoint <= 0xFFFF) + { + char bytes[3]; + bytes[0] = 0xE0 | ((codepoint >> 12) & 0x0F); + bytes[1] = 0x80 | ((codepoint >> 6) & 0x3F); + bytes[2] = 0x80 | (codepoint & 0x3F); + this->replace(index - 1, 6, bytes, sizeof(bytes)); + index += 2; + } + } + break; + default: + break; + } + if (index == Jupiter::String_Type::length) + break; + } + else + ++index; + } +} + +template<> inline void Jupiter::String_Type::processEscapeSequences() +{ +} + // set template size_t Jupiter::String_Type::set(size_t index, const T &in) { - if (index == this->size()) + if (index == Jupiter::String_Type::length) return this->concat(in); - if (index > this->size()) + if (index > Jupiter::String_Type::length) { this->setBufferSize(index + 1); while (Jupiter::String_Type::length != index) @@ -152,10 +335,10 @@ template size_t Jupiter::String_Type::set(size_t index, const T & template size_t Jupiter::String_Type::set(size_t index, const T *in, size_t inSize) { - if (index == this->size()) + if (index == Jupiter::String_Type::length) return this->concat(in); - if (index > this->size()) + if (index > Jupiter::String_Type::length) { this->setBufferSize(index + inSize); while (Jupiter::String_Type::length != index) @@ -225,15 +408,15 @@ template size_t Jupiter::String_Type::set(const T &in) return Jupiter::String_Type::length = 1; } -// replace +// insert template size_t Jupiter::String_Type::insert(size_t index, const T &value) { - if (index >= this->size()) + if (index >= Jupiter::String_Type::length) return this->concat(value); - this->setBufferSize(this->size() + 1); - for (size_t i = this->size(); i != index; i--) + this->setBufferSize(Jupiter::String_Type::length + 1); + for (size_t i = Jupiter::String_Type::length; i != index; i--) Jupiter::String_Type::str[i] = this->get(i-1); Jupiter::String_Type::str[index] = value; @@ -242,7 +425,7 @@ template size_t Jupiter::String_Type::insert(size_t index, const template size_t Jupiter::String_Type::insert(size_t index, const Jupiter::Readable_String &value) { - if (index >= this->size()) + if (index >= Jupiter::String_Type::length) return this->concat(value); if (value.size() == 0) @@ -251,9 +434,9 @@ template size_t Jupiter::String_Type::insert(size_t index, const if (value.size() == 1) return this->insert(index, value.get(0)); - this->setBufferSize(this->size() + value.size()); + this->setBufferSize(Jupiter::String_Type::length + value.size()); size_t i; - for (i = this->size() + value.size() - 1; i != index + value.size() - 1; i--) + for (i = Jupiter::String_Type::length + value.size() - 1; i != index + value.size() - 1; i--) Jupiter::String_Type::str[i] = this->get(i - value.size()); while (i != index) @@ -268,9 +451,99 @@ template size_t Jupiter::String_Type::insert(size_t index, const // replace +template size_t Jupiter::String_Type::replace(size_t index, size_t targetSize, const T &value) +{ + if (targetSize != 0) + { + if (index >= Jupiter::String_Type::length) + return this->set(index, value); + + if (index + targetSize > Jupiter::String_Type::length) + { + Jupiter::String_Type::str[index] = value; + return Jupiter::String_Type::length = index + 1; + } + + if (targetSize == 1) + return this->set(index, value); + + Jupiter::String_Type::str[index] = value; + Jupiter::String_Type::length -= targetSize - 1; + while (++index != Jupiter::String_Type::length) + Jupiter::String_Type::str[index] = Jupiter::String_Type::str[index + targetSize - 1]; + } + return Jupiter::String_Type::length; +} + +template size_t Jupiter::String_Type::replace(size_t index, size_t targetSize, const T *value, size_t valueSize) +{ + if (valueSize == 1) + return this->replace(index, targetSize, *value); + + if (valueSize == 0) + { + this->remove(index, targetSize); + return Jupiter::String_Type::length; + } + + if (targetSize != 0) + { + if (index >= Jupiter::String_Type::length) + return this->set(index, value); + + if (index + targetSize > Jupiter::String_Type::length) + { + if (index + valueSize > Jupiter::String_Type::length) + this->setBufferSize(index + valueSize); + + Jupiter::String_Type::length = index + valueSize; + Jupiter::String_Type::str[index] = *value; + while (++index != Jupiter::String_Type::length) + Jupiter::String_Type::str[index] = *++value; + return Jupiter::String_Type::length; + } + + if (targetSize == valueSize) + return this->set(index, value, valueSize); + + if (valueSize < targetSize) + { + targetSize -= valueSize; + Jupiter::String_Type::length -= targetSize; + + Jupiter::String_Type::str[index] = *value; + while (--valueSize != 0) + Jupiter::String_Type::str[++index] = *++value; + + while (++index != Jupiter::String_Type::length) + Jupiter::String_Type::str[index] = Jupiter::String_Type::str[index + targetSize]; + } + else + { + this->setBufferSize(Jupiter::String_Type::length + valueSize - targetSize); + Jupiter::String_Type::length += valueSize - targetSize; + + size_t i = Jupiter::String_Type::length; + while (--i != index + targetSize + 1) + Jupiter::String_Type::str[i] = Jupiter::String_Type::str[i - valueSize + targetSize]; + this->println(stdout); + + Jupiter::String_Type::str[index] = *value; + while (index != i) + Jupiter::String_Type::str[++index] = *++value; + } + } + return Jupiter::String_Type::length; +} + +template size_t Jupiter::String_Type::replace(size_t index, size_t targetSize, const Jupiter::Readable_String &value) +{ + return this->replace(index, targetSize, value.ptr(), value.size()); +} + template size_t Jupiter::String_Type::replace(const T &target, const T &value) { - for (size_t i = 0; i != this->size(); i++) + for (size_t i = 0; i != Jupiter::String_Type::length; i++) { if (this->get(i) == target) Jupiter::String_Type::str[i] = value; @@ -285,10 +558,10 @@ template size_t Jupiter::String_Type::replace(const T *target, si if (targetSize == 1) return this->replace(*target, value); - if (targetSize < this->size()) + if (targetSize < Jupiter::String_Type::length) { size_t i = 0, j = 0, k; - while (j <= this->size() - targetSize) + while (j <= Jupiter::String_Type::length - targetSize) { k = 0; while (this->get(j + k) == target[k]) @@ -304,12 +577,12 @@ template size_t Jupiter::String_Type::replace(const T *target, si if (k != targetSize) Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; } - while (j < this->size()) + while (j < Jupiter::String_Type::length) Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; Jupiter::String_Type::length = i; } - else if (targetSize == this->size() && this->equals(target, targetSize)) + else if (targetSize == Jupiter::String_Type::length && this->equals(target, targetSize)) return this->set(value); } return Jupiter::String_Type::length; @@ -330,7 +603,7 @@ template size_t Jupiter::String_Type::replace(const T *target, si //if (targetSize == 1) // return this->replace(*target, value, valueSize); - if (targetSize < this->size()) + if (targetSize < Jupiter::String_Type::length) { if (valueSize > targetSize) { @@ -338,7 +611,7 @@ template size_t Jupiter::String_Type::replace(const T *target, si size_t *instances = new size_t[instancesSize]; // pass 1 (count instances) size_t instanceCount = 0, i = 0, j; - while (i <= this->size() - targetSize) + while (i <= Jupiter::String_Type::length - targetSize) { j = 0; while (this->get(i + j) == target[j]) @@ -367,7 +640,7 @@ template size_t Jupiter::String_Type::replace(const T *target, si if (instanceCount != 0) { // pass 2 (adjust string and replace values) - size_t endSize = this->size() + (valueSize - targetSize) * instanceCount; + size_t endSize = Jupiter::String_Type::length + (valueSize - targetSize) * instanceCount; this->setBufferSize(endSize); instancesSize = endSize; // Repurposing. Now used as just another index. j = Jupiter::String_Type::length; @@ -389,7 +662,7 @@ template size_t Jupiter::String_Type::replace(const T *target, si else { size_t i = 0, j = 0, k, l; - while (j <= this->size() - targetSize) + while (j <= Jupiter::String_Type::length - targetSize) { k = 0; while (this->get(j + k) == target[k]) @@ -406,13 +679,13 @@ template size_t Jupiter::String_Type::replace(const T *target, si if (k != targetSize) Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; } - while (j < this->size()) + while (j < Jupiter::String_Type::length) Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; Jupiter::String_Type::length = i; } } - else if (targetSize == this->size() && this->equals(target, targetSize)) + else if (targetSize == Jupiter::String_Type::length && this->equals(target, targetSize)) return this->set(value); } return Jupiter::String_Type::length; diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 086f99eb5e086ed339eca00e69a39fb48ebbce14..276bc80d40ded4c4c5c79a1a37da810c14aac668 100644 GIT binary patch delta 33023 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 G+5ZoljmjMW delta 33019 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