From f12b36f3506a4c8aa7f6e7b1a1046e238ba4a024 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Sat, 14 Jun 2014 13:41:18 -0400 Subject: [PATCH] added getToken() and gotoToken(). --- Jupiter/Readable_String.h | 26 ++++++++++ Jupiter/Readable_String_Imp.h | 90 +++++++++++++++++++++++++++++++++ Jupiter/Reference_String.h | 42 +++++++++++++++ Jupiter/Reference_String_Imp.h | 40 +++++++++++++++ Jupiter/String.h | 84 ++++++++++++++++++++++++++++++ Jupiter/String_Imp.h | 80 +++++++++++++++++++++++++++++ Release/Jupiter.lib | Bin 232600 -> 240288 bytes 7 files changed, 362 insertions(+) diff --git a/Jupiter/Readable_String.h b/Jupiter/Readable_String.h index 46e2038..bf90aad 100644 --- a/Jupiter/Readable_String.h +++ b/Jupiter/Readable_String.h @@ -246,6 +246,19 @@ namespace Jupiter template class R> static R getWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); template class R> static R getWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Copies a the elements between two tokens from an input string and returns it in an output type. + * + * @param R Type to return. Must be a subclass of String_Type. + * + * @param in String to get a partial copy of. + * @param pos Index of the token to copy. + * @param token Token to scan for. + * @return Copy of the token at the specified index on success, an empty string otherwise. + */ + template class R> static R getToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + template class R> static R getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** * @brief Copies a part of an input string starting at a specified "word" and returns it in an output type. * @@ -259,6 +272,19 @@ namespace Jupiter template class R> static R gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); template class R> static R gotoWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Copies a part of an input string starting at a specified token and returns it in an output type. + * + * @param R Type to return. Must be a subclass of String_Type. + * + * @param in String to get a partial copy of. + * @param pos Index of the word to start copying from. + * @param token Token to scan for. + * @return Copy of the string starting at the specified word on success, an empty string otherwise. + */ + template class R> static R gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + template class R> static R gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** Access operator */ inline const T &operator[](size_t index) const { return this->get(index); }; diff --git a/Jupiter/Readable_String_Imp.h b/Jupiter/Readable_String_Imp.h index 545bc4f..0425cde 100644 --- a/Jupiter/Readable_String_Imp.h +++ b/Jupiter/Readable_String_Imp.h @@ -983,6 +983,59 @@ template template class R> R Jupiter::Readable return R::substring(in, x, y - x); } +// getToken + +template template class R> R Jupiter::Readable_String::getToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + size_t x, y; + for (x = 0; x != in.size() && pos != 0; x++) + if (in.get(x) == token) + pos--; + for (y = x; y != in.size() && in.get(y) != token; y++); + return R::substring(in, x, y - x); +} + +template template class R> R Jupiter::Readable_String::getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + if (token.size() == 0) + return R(in); + if (token.size() == 1) + return Jupiter::Readable_String::getToken(in, pos, token.get(0)); + if (pos == 0) + return R::substring(in, 0, in.find(token)); + + size_t i, j; + for (i = 0; i != in.size(); i++) + { + Jupiter_Readable_String_getToken_skip_increment: + j = 0; + while (in.get(i + j) == token.get(j)) + { + if (++j == token.size()) + { + i += j; + if (--pos == 0) + { + size_t k; + for (j = i; j != in.size(); j++) + { + k = 0; + while (in.get(j + k) == token.get(k)) + if (++k == token.size()) + return R::substring(in, i, j - i); + } + return R::substring(in, i); + } + else + goto Jupiter_Readable_String_getToken_skip_increment; + break; + } + } + } + + return R(); +} + // gotoWord template template class R> R Jupiter::Readable_String::gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace) @@ -1033,4 +1086,41 @@ template template class R> R Jupiter::Readable return R::substring(in, x); } +// gotoToken + +template template class R> R Jupiter::Readable_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + size_t i; + for (i = 0; i != in.size() && pos != 0; i++) + if (in.get(i) == token) + pos--; + + return R::substring(in, i); +} + +template template class R> R Jupiter::Readable_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + if (pos == 0 || token.size() == 0) + return R(in); + if (token.size() == 1) + return Jupiter::Readable_String::gotoToken(in, pos, token.get(0)); + + size_t i, j; + for (i = 0; i != in.size(); i++) + { + j = 0; + while (in.get(i + j) == token.get(j)) + { + if (++j == token.size()) + { + if (pos-- == 0) + return R::substring(in, i); + break; + } + } + } + + return R(); +} + #endif // _READABLE_STRING_IMP_H_HEADER \ No newline at end of file diff --git a/Jupiter/Reference_String.h b/Jupiter/Reference_String.h index 8a18f2d..4751245 100644 --- a/Jupiter/Reference_String.h +++ b/Jupiter/Reference_String.h @@ -163,6 +163,27 @@ namespace Jupiter */ static Reference_String getWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + Reference_String getToken(size_t pos, const T &token); + Reference_String getToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of an input string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static Reference_String getToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static Reference_String getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** * @brief Creates a partial copy of the string, based on a set of tokens. * @@ -192,6 +213,27 @@ namespace Jupiter */ static Reference_String gotoWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + Reference_String gotoToken(size_t pos, const T &token); + Reference_String gotoToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static Reference_String gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static Reference_String gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** * @brief Default constructor for the Reference_String class. */ diff --git a/Jupiter/Reference_String_Imp.h b/Jupiter/Reference_String_Imp.h index cfd5bc1..befae3a 100644 --- a/Jupiter/Reference_String_Imp.h +++ b/Jupiter/Reference_String_Imp.h @@ -176,6 +176,26 @@ template Jupiter::Reference_String Jupiter::Reference_String:: return Jupiter::Readable_String::getWord(in, pos, whitespace); } +template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const T &token) +{ + return Jupiter::Reference_String::getToken(*this, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Reference_String::getToken(*this, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(size_t pos, const T *whitespace) const { return Jupiter::Reference_String::gotoWord(*this, pos, whitespace); @@ -191,6 +211,26 @@ template Jupiter::Reference_String Jupiter::Reference_String:: return Jupiter::Readable_String::gotoWord(in, pos, whitespace); } +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const T &token) +{ + return Jupiter::Reference_String::gotoToken(*this, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Reference_String::gotoToken(*this, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + template const Jupiter::Reference_String Jupiter::Reference_String::empty = Jupiter::Reference_String(); #endif // _REFERENCE_STRING_IMP \ No newline at end of file diff --git a/Jupiter/String.h b/Jupiter/String.h index a1c2bfd..fd0eed9 100644 --- a/Jupiter/String.h +++ b/Jupiter/String.h @@ -136,6 +136,27 @@ namespace Jupiter */ static String_Strict getWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + String_Strict getToken(size_t pos, const T &token); + String_Strict getToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of an input string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static String_Strict getToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static String_Strict getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** * @brief Creates a partial copy of the string, based on a set of tokens. * @@ -155,6 +176,27 @@ namespace Jupiter */ static String_Strict gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + String_Strict gotoToken(size_t pos, const T &token); + String_Strict gotoToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static String_Strict gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static String_Strict gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** Assignment Operators */ inline String_Strict &operator=(const String_Strict &right) { this->set(right); return *this; }; inline String_Strict &operator=(const Readable_String &right) { this->set(right); return *this; }; @@ -300,6 +342,27 @@ namespace Jupiter */ static String_Loose getWord(const T *in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + String_Loose getToken(size_t pos, const T &token); + String_Loose getToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of an input string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position of the token in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static String_Loose getToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static String_Loose getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** * @brief Creates a partial copy of the string, based on a set of tokens. * @@ -319,6 +382,27 @@ namespace Jupiter */ static String_Loose gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + String_Loose gotoToken(size_t pos, const T &token); + String_Loose gotoToken(size_t pos, const Jupiter::Readable_String &token); + + /** + * @brief Creates a partial copy of the string, based on a token. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param token Token to scan for. + * @return String containing a partial copy of the original string. + */ + static String_Loose gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token); + static String_Loose gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token); + /** Default constructor */ String_Loose(); diff --git a/Jupiter/String_Imp.h b/Jupiter/String_Imp.h index 99ed623..8ce7169 100644 --- a/Jupiter/String_Imp.h +++ b/Jupiter/String_Imp.h @@ -216,6 +216,26 @@ template Jupiter::String_Strict Jupiter::String_Strict::getWor return Jupiter::Readable_String::getWord(in, pos, whitespace); } +template Jupiter::String_Strict Jupiter::String_Strict::getToken(size_t pos, const T &token) +{ + return Jupiter::String_Strict::getToken(*this, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::getToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::String_Strict::getToken(*this, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::getToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + template Jupiter::String_Strict Jupiter::String_Strict::gotoWord(size_t pos, const T *whitespace) const { return Jupiter::String_Strict::gotoWord(*this, pos, whitespace); @@ -226,6 +246,26 @@ template Jupiter::String_Strict Jupiter::String_Strict::gotoWo return Jupiter::Readable_String::gotoWord(in, pos, whitespace); } +template Jupiter::String_Strict Jupiter::String_Strict::gotoToken(size_t pos, const T &token) +{ + return Jupiter::String_Strict::gotoToken(*this, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::gotoToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::String_Strict::gotoToken(*this, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + +template Jupiter::String_Strict Jupiter::String_Strict::gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + template const Jupiter::String_Strict Jupiter::String_Strict::empty = Jupiter::String_Strict(); /** @@ -443,6 +483,26 @@ template Jupiter::String_Loose Jupiter::String_Loose::getWord( return Jupiter::Readable_String::getWord(in, pos, whitespace); } +template Jupiter::String_Loose Jupiter::String_Loose::getToken(size_t pos, const T &token) +{ + return Jupiter::String_Loose::getToken(*this, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::getToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::String_Loose::getToken(*this, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::getToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::getToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::getToken(in, pos, token); +} + template Jupiter::String_Loose Jupiter::String_Loose::gotoWord(size_t pos, const T *whitespace) const { return Jupiter::String_Loose::gotoWord(*this, pos, whitespace); @@ -453,6 +513,26 @@ template Jupiter::String_Loose Jupiter::String_Loose::gotoWord return Jupiter::Readable_String::gotoWord(in, pos, whitespace); } +template Jupiter::String_Loose Jupiter::String_Loose::gotoToken(size_t pos, const T &token) +{ + return Jupiter::String_Loose::gotoToken(*this, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::gotoToken(size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::String_Loose::gotoToken(*this, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + +template Jupiter::String_Loose Jupiter::String_Loose::gotoToken(const Jupiter::Readable_String &in, size_t pos, const Jupiter::Readable_String &token) +{ + return Jupiter::Readable_String::gotoToken(in, pos, token); +} + template const Jupiter::String_Loose Jupiter::String_Loose::empty = Jupiter::String_Loose(); #endif // _STRING_IMP_H_HEADER \ No newline at end of file diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 5d54d99d745983f433f623cd23461c26fcbebc6c..78907da19e41c570f6764c9b792b40f8f0bd4c48 100644 GIT binary patch delta 32680 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 delta 29698 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