From 510ac72c562ef043d6c87ac613f281b7cccf0ec9 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Wed, 3 Sep 2014 21:08:27 -0400 Subject: [PATCH] Finished some more replace() functions for String_Type. --- Jupiter/String_Type.h | 8 +-- Jupiter/String_Type_Imp.h | 111 ++++++++++++++++++++++++++++++++++++++ Release/Jupiter.lib | Bin 242782 -> 242782 bytes 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/Jupiter/String_Type.h b/Jupiter/String_Type.h index 5a9a1ea..3ca600f 100644 --- a/Jupiter/String_Type.h +++ b/Jupiter/String_Type.h @@ -136,10 +136,10 @@ namespace Jupiter //virtual size_t replace(const T &target, const T *value, size_t valueSize); //virtual size_t replace(const T &target, const Jupiter::Readable_String &value); - //virtual size_t replace(const T *target, size_t targetSize, const T *value, size_t valueSize); - //virtual size_t replace(const T *target, size_t targetSize, const Jupiter::Readable_String &value); - //virtual size_t replace(const Jupiter::Readable_String &target, const T *value, size_t valueSize); - //virtual size_t replace(const Jupiter::Readable_String &target, const Jupiter::Readable_String &value); + virtual size_t replace(const T *target, size_t targetSize, const T *value, size_t valueSize); + virtual size_t replace(const T *target, size_t targetSize, const Jupiter::Readable_String &value); + virtual size_t replace(const Jupiter::Readable_String &target, const T *value, size_t valueSize); + virtual size_t replace(const Jupiter::Readable_String &target, const Jupiter::Readable_String &value); /** * @brief Copies the data from the input string and concatenates it to the end of String. diff --git a/Jupiter/String_Type_Imp.h b/Jupiter/String_Type_Imp.h index bfad1d7..b0eec2d 100644 --- a/Jupiter/String_Type_Imp.h +++ b/Jupiter/String_Type_Imp.h @@ -258,6 +258,117 @@ template size_t Jupiter::String_Type::replace(const Jupiter::Read return this->replace(target.ptr(), target.size(), value); } +template size_t Jupiter::String_Type::replace(const T *target, size_t targetSize, const T *value, size_t valueSize) +{ + if (valueSize == 1) + return this->replace(target, targetSize, *value); + + if (targetSize != 0) + { + //if (targetSize == 1) + // return this->replace(*target, value, valueSize); + + if (targetSize < this->size()) + { + if (valueSize > targetSize) + { + size_t instancesSize = 4; + size_t *instances = new size_t[instancesSize]; + // pass 1 (count instances) + size_t instanceCount = 0, i = 0, j; + while (i <= this->size() - targetSize) + { + j = 0; + while (this->get(i + j) == target[j]) + { + if (++j == targetSize) + { + i += targetSize; + if (instanceCount == instancesSize) + { + size_t *tInstances = new size_t[instancesSize * 2]; + for (instanceCount = 0; instanceCount != instancesSize; instanceCount++) + tInstances[instanceCount] = instances[instanceCount]; + instancesSize *= 2; + } + instances[instanceCount] = i; + instanceCount++; + break; + } + } + if (j != targetSize) + i++; + } + + if (instanceCount != 0) + { + // pass 2 (adjust string and replace values) + size_t endSize = this->size() + (valueSize - targetSize) * instanceCount; + this->setBufferSize(endSize); + instancesSize = endSize; // Repurposing. Now used as just another index. + j = Jupiter::String_Type::length; + while (instanceCount != 0) + { + i = instances[--instanceCount]; + while (j != i) + Jupiter::String_Type::str[--instancesSize] = Jupiter::String_Type::str[--j]; + + j = valueSize; + while (j != 0) + Jupiter::String_Type::str[--instancesSize] = value[--j]; + j = i - targetSize; + } + Jupiter::String_Type::length = endSize; + } + delete[] instances; + } + else + { + size_t i = 0, j = 0, k, l; + while (j <= this->size() - targetSize) + { + k = 0; + while (this->get(j + k) == target[k]) + { + if (++k == targetSize) // match found + { + for (l = 0; l != valueSize; l++) + Jupiter::String_Type::str[i + l] = value[l]; + i += valueSize; + j += k; + break; + } + } + if (k != targetSize) + Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; + } + while (j < this->size()) + Jupiter::String_Type::str[i++] = Jupiter::String_Type::str[j++]; + + Jupiter::String_Type::length = i; + } + } + else if (targetSize == this->size() && this->equals(target, targetSize)) + return this->set(value); + } + return Jupiter::String_Type::length; +} + +template size_t Jupiter::String_Type::replace(const T *target, size_t targetSize, const Jupiter::Readable_String &value) +{ + return this->replace(target, targetSize, value.ptr(), value.size()); +} + +template size_t Jupiter::String_Type::replace(const Jupiter::Readable_String &target, const T *value, size_t valueSize) +{ + return this->replace(target.ptr(), target.size(), value, valueSize); +} + +template size_t Jupiter::String_Type::replace(const Jupiter::Readable_String &target, const Jupiter::Readable_String &value) +{ + return this->replace(target.ptr(), target.size(), value.ptr(), value.size()); +} + // concat template size_t Jupiter::String_Type::concat(const Jupiter::Readable_String &in) diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 918c4802cbcd1d836543c338eaa9537dfc84e41f..2591e79338231d968131ebfa97601d67d660d4a1 100644 GIT binary patch delta 18045 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 pSyMQ)%Dv7s}KiwJmd;B!v={{!FAVCw(? delta 17967 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