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 5d54d99..78907da 100644 Binary files a/Release/Jupiter.lib and b/Release/Jupiter.lib differ