diff --git a/Jupiter/CString.h b/Jupiter/CString.h index 2eb9cd5..78f5d5a 100644 --- a/Jupiter/CString.h +++ b/Jupiter/CString.h @@ -183,16 +183,38 @@ namespace Jupiter */ static CString_Type gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + TokenizeResult tokenize(const T &separator) const; + TokenizeResult tokenize(const Jupiter::Readable_String &separator) const; + TokenizeResult tokenize(const T *separator, size_t separator_size) const; + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** * @brief Copies the data from the input string to the CString. * * @param in String containing the data to be copied. * @return New size of the CString. */ - size_t set(const Readable_String &in); - size_t set(const std::basic_string &in); - size_t set(const T *in); - size_t set(const T in); + size_t set(const T *in, size_t inSize) override; + size_t set(const Jupiter::Readable_String &in) override; + size_t set(const std::basic_string &in) override; + size_t set(const T *in) override; + size_t set(const T &in) override; /** * @brief Copies the data from the input string and concatenates it to the end of CString. @@ -200,10 +222,11 @@ namespace Jupiter * @param in String containing the data to be concatenated. * @return New size of the CString. */ - size_t concat(const Readable_String &in); - size_t concat(const std::basic_string &in); - size_t concat(const T *in); - size_t concat(const T in); + size_t concat(const T *in, size_t inSize) override; + size_t concat(const Readable_String &in) override; + size_t concat(const std::basic_string &in) override; + size_t concat(const T *in) override; + size_t concat(const T &in) override; /** Default Constructor */ CString_Type(); @@ -380,6 +403,27 @@ namespace Jupiter */ static CString_Loose gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + TokenizeResult tokenize(const T &separator); + TokenizeResult tokenize(const Jupiter::Readable_String &separator); + TokenizeResult tokenize(const T *separator, size_t separator_size); + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** Default constructor */ CString_Loose(); diff --git a/Jupiter/CString_Imp.h b/Jupiter/CString_Imp.h index 71a3c00..36dfba2 100644 --- a/Jupiter/CString_Imp.h +++ b/Jupiter/CString_Imp.h @@ -264,6 +264,8 @@ template Jupiter::CString_Type Jupiter::CString_Type::Format(c return r; } +// substring + template Jupiter::CString_Type Jupiter::CString_Type::substring(size_t pos) const { return Jupiter::CString_Type::substring(*this, pos); @@ -306,6 +308,8 @@ template Jupiter::CString_Type Jupiter::CString_Type::substrin return r; } +// getWord + template Jupiter::CString_Type Jupiter::CString_Type::getWord(size_t pos, const T *whitespace) const { return Jupiter::CString_Type::getWord(*this, pos, whitespace); @@ -321,6 +325,8 @@ template Jupiter::CString_Type Jupiter::CString_Type::getWord( return Jupiter::Readable_String::getWord(in, pos, whitespace); } +// gotoWord + template Jupiter::CString_Type Jupiter::CString_Type::gotoWord(size_t pos, const T *whitespace) const { return Jupiter::CString_Type::gotoWord(*this, pos, whitespace); @@ -331,22 +337,54 @@ template Jupiter::CString_Type Jupiter::CString_Type::gotoWord return Jupiter::Readable_String::gotoWord(in, pos, whitespace); } -template size_t Jupiter::CString_Type::set(const Jupiter::Readable_String &in) +// tokenize + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const T &separator) const { - this->setBufferSizeNoCopy(in.size()); - for (Jupiter::String_Type::length = 0; Jupiter::String_Type::length != in.size() && in.get(Jupiter::String_Type::length) != 0; Jupiter::String_Type::length++) - Jupiter::String_Type::str[Jupiter::String_Type::length] = in.get(Jupiter::String_Type::length); - Jupiter::String_Type::str[Jupiter::String_Type::length] = 0; + return Jupiter::CString_Type::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const Jupiter::Readable_String &separator) const +{ + return Jupiter::CString_Type::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const T *separator, size_t separator_size) const +{ + return Jupiter::CString_Type::tokenize(*this, separator, separator_size); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const Jupiter::Readable_String &in, const T &token) +{ + return Jupiter::Readable_String::tokenize(in, token); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Type::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + return Jupiter::Readable_String::tokenize(in, separator, separator_size); +} + +// set + +template size_t Jupiter::CString_Type::set(const T *in, size_t in_size) +{ + Jupiter::String_Type::str[Jupiter::String_Type::set(in, in_size)] = 0; return Jupiter::String_Type::length; } +template size_t Jupiter::CString_Type::set(const Jupiter::Readable_String &in) +{ + return this->set(in.ptr(), in.size()); +} + template size_t Jupiter::CString_Type::set(const std::basic_string &in) { - this->setBufferSizeNoCopy(in.size()); - for (Jupiter::String_Type::length = 0; Jupiter::String_Type::length != in.size() && in.at(Jupiter::String_Type::length) != 0; Jupiter::String_Type::length++) - Jupiter::String_Type::str[Jupiter::String_Type::length] = in.at(Jupiter::String_Type::length); - Jupiter::String_Type::str[Jupiter::String_Type::length]; - return Jupiter::String_Type::length; + return this->set(in.data(), in.size()); } template size_t Jupiter::CString_Type::set(const T *in) @@ -355,7 +393,7 @@ template size_t Jupiter::CString_Type::set(const T *in) return Jupiter::String_Type::length; } -template size_t Jupiter::CString_Type::set(const T in) +template size_t Jupiter::CString_Type::set(const T &in) { if (in == 0) { @@ -369,34 +407,22 @@ template size_t Jupiter::CString_Type::set(const T in) return Jupiter::String_Type::length = 1; } -template size_t Jupiter::CString_Type::concat(const Jupiter::Readable_String &in) +// concat + +template size_t Jupiter::CString_Type::concat(const T *in, size_t in_size) { - size_t nSize = Jupiter::String_Type::length + in.size(); - const T *inData = in.ptr(); - this->setBufferSize(nSize); - while (Jupiter::String_Type::length != nSize && *inData != 0) - { - Jupiter::String_Type::str[Jupiter::String_Type::length] = *inData; - Jupiter::String_Type::length++; - inData++; - } - Jupiter::String_Type::str[Jupiter::String_Type::length] = 0; + Jupiter::String_Type::str[Jupiter::String_Type::concat(in, in_size)] = 0; return Jupiter::String_Type::length; } +template size_t Jupiter::CString_Type::concat(const Jupiter::Readable_String &in) +{ + return this->concat(in.ptr(), in.size()); +} + template size_t Jupiter::CString_Type::concat(const std::basic_string &in) { - size_t nSize = Jupiter::String_Type::length + in.size(); - const T *inData = in.data(); - this->setBufferSize(nSize); - while (Jupiter::String_Type::length != nSize && *inData != 0) - { - Jupiter::String_Type::str[Jupiter::String_Type::length] = *inData; - Jupiter::String_Type::length++; - inData++; - } - Jupiter::String_Type::str[Jupiter::String_Type::length] = 0; - return Jupiter::String_Type::length; + return this->concat(in.data(), in.size()); } template size_t Jupiter::CString_Type::concat(const T *in) @@ -407,15 +433,16 @@ template size_t Jupiter::CString_Type::concat(const T *in) return Jupiter::String_Type::length = nSize; } -template size_t Jupiter::CString_Type::concat(const T c) +template size_t Jupiter::CString_Type::concat(const T &in) { this->setBufferSize(Jupiter::String_Type::length + 1); - Jupiter::String_Type::str[Jupiter::String_Type::length] = c; + Jupiter::String_Type::str[Jupiter::String_Type::length] = in; Jupiter::String_Type::str[++Jupiter::String_Type::length] = 0; return Jupiter::String_Type::length; } // Operators + template inline Jupiter::CString_Type Jupiter::CString_Type::operator+(const Jupiter::CString_Type &rhs) const { return Jupiter::CString_Type::operator+(reinterpret_cast &>(rhs)); @@ -668,7 +695,40 @@ template Jupiter::CString_Loose Jupiter::CString_Loose::gotoWo return Jupiter::Readable_String::gotoWord(in, pos, whitespace); } +// tokenize + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const T &token) +{ + return Jupiter::CString_Loose::tokenize(*this, token); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const Jupiter::Readable_String &separator) +{ + return Jupiter::CString_Loose::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const T *separator, size_t separator_size) +{ + return Jupiter::CString_Loose::tokenize(*this, separator, separator_size); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const Jupiter::Readable_String &in, const T &token) +{ + return Jupiter::Readable_String::tokenize(in, token); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::CString_Loose::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + return Jupiter::Readable_String::tokenize(in, separator, separator_size); +} + // Operators + template inline Jupiter::CString_Loose Jupiter::CString_Loose::operator+(const Jupiter::CString_Loose &rhs) const { return Jupiter::CString_Loose::operator+(reinterpret_cast &>(rhs)); diff --git a/Jupiter/Jupiter.h b/Jupiter/Jupiter.h index c878171..474c2b7 100644 --- a/Jupiter/Jupiter.h +++ b/Jupiter/Jupiter.h @@ -35,7 +35,7 @@ #define JUPITER_API #endif // _WIN32 -#define JUPITER_VERSION "Jupiter 0.16" /** Version of this program at compile time. */ +#define JUPITER_VERSION "Jupiter 0.17-dev" /** Version of this program at compile time. */ #if defined __cplusplus extern "C" diff --git a/Jupiter/Readable_String.h b/Jupiter/Readable_String.h index bb5fb0f..e13d654 100644 --- a/Jupiter/Readable_String.h +++ b/Jupiter/Readable_String.h @@ -315,6 +315,65 @@ namespace Jupiter 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); + /** + * @brief Contains the results from a call to tokenize(). + */ + template class R> struct TokenizeResult + { + /** Underlying type used to represent each token */ + typedef R token_type; + + /** Array of tokens, with a length of 'token_count' */ + R *tokens; + + /** Length of 'tokens' array */ + size_t token_count; + + /** + * @brief Default constructor for the TokenizeResult class. + * Note: 'tokens' assigned nullptr, and 'token_count' is assigned 0. + */ + TokenizeResult(); + + /** + * @brief Allocation constructor for the TokenizeResult class. + */ + TokenizeResult(size_t in_token_count); + + /** + * @brief Capture constructor for the TokenizeResult class. + */ + TokenizeResult(R *in_tokens, size_t in_token_count); + + /** + * @brief Copy constructor for the TokenizeResult class. + */ + TokenizeResult(const TokenizeResult &source); + + /** + * @brief Move constructor for the TokenizeResult class. + */ + TokenizeResult(const TokenizeResult &&source); + + /** + * @brief Destructor for the TokenizeResult class. + */ + ~TokenizeResult(); + }; + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param R String type to use when constructing results + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + template class R> static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + template class R> static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + template class R> static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** 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 29b7f1f..5b4f1f0 100644 --- a/Jupiter/Readable_String_Imp.h +++ b/Jupiter/Readable_String_Imp.h @@ -1301,6 +1301,199 @@ template template class R> R Jupiter::Readable return R(); } +/** tokenization */ + +template template class R> Jupiter::Readable_String::TokenizeResult::TokenizeResult() +{ + Jupiter::Readable_String::TokenizeResult::tokens = nullptr; + Jupiter::Readable_String::TokenizeResult::token_count = 0; +} + +template template class R> Jupiter::Readable_String::TokenizeResult::TokenizeResult(size_t in_token_count) +{ + Jupiter::Readable_String::TokenizeResult::token_count = in_token_count; + Jupiter::Readable_String::TokenizeResult::tokens = new R[Jupiter::Readable_String::TokenizeResult::token_count]; +} + +template template class R> Jupiter::Readable_String::TokenizeResult::TokenizeResult(R *in_tokens, size_t in_token_count) +{ + Jupiter::Readable_String::TokenizeResult::tokens = in_tokens; + Jupiter::Readable_String::TokenizeResult::token_count = in_token_count; +} + +template template class R> Jupiter::Readable_String::TokenizeResult::TokenizeResult(const TokenizeResult &source) +{ + Jupiter::Readable_String::TokenizeResult::tokens = new R[source.token_count]; + Jupiter::Readable_String::TokenizeResult::token_count = 0; + while (Jupiter::Readable_String::TokenizeResult::token_count != source.token_count) + { + Jupiter::Readable_String::TokenizeResult::tokens[Jupiter::Readable_String::TokenizeResult::token_count] = source.tokens[Jupiter::Readable_String::TokenizeResult::token_count]; + ++Jupiter::Readable_String::TokenizeResult::token_count; + } +} + +template template class R> Jupiter::Readable_String::TokenizeResult::TokenizeResult(const TokenizeResult &&source) +{ + Jupiter::Readable_String::TokenizeResult::tokens = source.tokens; + Jupiter::Readable_String::TokenizeResult::token_count = source.token_count; + source.tokens = nullptr; + source.token_count = 0; +} + +template template class R> Jupiter::Readable_String::TokenizeResult::~TokenizeResult() +{ + if (Jupiter::Readable_String::TokenizeResult::tokens != nullptr) + delete[] Jupiter::Readable_String::TokenizeResult::tokens; +} + +// tokenize + +template template class R> typename Jupiter::Readable_String::TokenizeResult Jupiter::Readable_String::tokenize(const Jupiter::Readable_String &in, const T &token) +{ + // special case: no input + if (in.isEmpty()) + return TokenizeResult(); + + size_t length = in.tokenCount(token); + R *tokens = new R[length]; + + // special case: only 1 token + if (length == 1) + { + *tokens = in; + return TokenizeResult(tokens, length); + } + + R *itr = tokens; + + const T *in_itr = in.ptr(); + const T *in_end = in.ptr() + in.size(); + const T *token_start = in_itr; + + while (in_itr != in_end) + { + loop_start: + if (*in_itr == token) + { + // push token to output + itr->set(token_start, in_itr - token_start); + ++itr; + + // increment over separator + ++in_itr; + + // iterator is at end of string + if (in_itr == in_end) + return TokenizeResult(tokens, length); + + // start reading new token + token_start = in_itr; + goto loop_start; + } + ++in_itr; + } + + itr->set(token_start, in_end - token_start); + return TokenizeResult(tokens, length); +} + +template template class R> typename Jupiter::Readable_String::TokenizeResult Jupiter::Readable_String::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator.ptr(), separator.size()); +} + +template template class R> typename Jupiter::Readable_String::TokenizeResult Jupiter::Readable_String::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + // special case: separator is a single element + if (separator_size == 1) + return Jupiter::Readable_String::tokenize(in, *separator); + + // special case: no input + if (in.isEmpty()) + return TokenizeResult(); + + R *tokens; + + // special case: no separator + if (separator_size == 0) + { + tokens = new R[1]; + *tokens = in; + return TokenizeResult(tokens, 1); + } + + // special case: only enough space for 1 token, or 2 empty tokens + if (separator_size >= in.size()) + { + if (in.equals(separator, separator_size)) + return TokenizeResult(2); + + tokens = new R[1]; + *tokens = in; + return TokenizeResult(tokens, 1); + } + + size_t length = in.tokenCount(separator); + tokens = new R[length]; + + // special case: only 1 token + if (length == 1) + { + *tokens = in; + return TokenizeResult(tokens, length); + } + + R *itr = tokens; + + const T *in_itr = in.ptr(); + const T *in_end = in.ptr() + in.size(); + const T *token_start = in_itr; + + auto is_separator = [](const T *sep, size_t sep_size, const T *ptr) + { + while (*sep == *ptr) + { + if (--sep_size == 0) + return true; + + ++sep, ++ptr; + } + return false; + }; + + while (in_itr + separator_size - 1 != in_end) + { + loop_start: + if (is_separator(separator, separator_size, in_itr)) + { + // push token to output + itr->set(token_start, in_itr - token_start); + ++itr; + + in_itr += separator_size; + token_start = in_itr; + + // not enough room for another separator + if (in_itr + separator_size > in_end) + break; + + // only enough room for 1 separator (empty token), or 1 token + if (in_itr + separator_size == in_end) + { + if (is_separator(separator, separator_size, in_itr)) + return TokenizeResult(tokens, length); + break; + } + + goto loop_start; + } + ++in_itr; + } + + itr->set(token_start, in_end - token_start); + return TokenizeResult(tokens, length); +} + // Jupiter::DataBuffer specialization template<> struct _Jupiter_DataBuffer_partial_specialization_impl diff --git a/Jupiter/Reference_String.h b/Jupiter/Reference_String.h index 1c6e8bd..749a87e 100644 --- a/Jupiter/Reference_String.h +++ b/Jupiter/Reference_String.h @@ -234,6 +234,27 @@ namespace Jupiter 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 Tokenizes a string, based on an input token separator + * + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + TokenizeResult tokenize(const T &separator) const; + TokenizeResult tokenize(const Jupiter::Readable_String &separator) const; + TokenizeResult tokenize(const T *separator, size_t separator_size) const; + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** Mutative operators */ inline Readable_String &operator-=(size_t right) { this->truncate(right); return *this; }; inline Readable_String &operator=(const Readable_String &right) { this->set(right); return *this; }; diff --git a/Jupiter/Reference_String_Imp.h b/Jupiter/Reference_String_Imp.h index 3cb4b21..98a8ab8 100644 --- a/Jupiter/Reference_String_Imp.h +++ b/Jupiter/Reference_String_Imp.h @@ -237,6 +237,38 @@ template Jupiter::Reference_String Jupiter::Reference_String:: template const Jupiter::Reference_String Jupiter::Reference_String::empty = Jupiter::Reference_String(); +// tokenize + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const T &separator) const +{ + return Jupiter::Reference_String::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &separator) const +{ + return Jupiter::Reference_String::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const T *separator, size_t separator_size) const +{ + return Jupiter::Reference_String::tokenize(*this, separator, separator_size); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T &token) +{ + return Jupiter::Readable_String::tokenize(in, token); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + return Jupiter::Readable_String::tokenize(in, separator, separator_size); +} + // Jupiter::DataBuffer specialization template<> struct _Jupiter_DataBuffer_partial_specialization_impl diff --git a/Jupiter/String.h b/Jupiter/String.h index e0a592a..655a38f 100644 --- a/Jupiter/String.h +++ b/Jupiter/String.h @@ -203,6 +203,27 @@ namespace Jupiter 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); + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + TokenizeResult tokenize(const T &separator) const; + TokenizeResult tokenize(const Jupiter::Readable_String &separator) const; + TokenizeResult tokenize(const T *separator, size_t separator_size) const; + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** Default Constructor */ String_Strict(); @@ -422,6 +443,27 @@ namespace Jupiter 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); + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + TokenizeResult tokenize(const T &separator); + TokenizeResult tokenize(const Jupiter::Readable_String &separator); + TokenizeResult tokenize(const T *separator, size_t separator_size); + + /** + * @brief Tokenizes a string, based on an input token separator + * + * @param in String to split into tokens + * @param separator Separator to split tokens by + * @return TokenizeResult containing the results of the tokenization process. + */ + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); + static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** Default constructor */ String_Loose(); diff --git a/Jupiter/String_Imp.h b/Jupiter/String_Imp.h index 5b87dcd..fbd3d2e 100644 --- a/Jupiter/String_Imp.h +++ b/Jupiter/String_Imp.h @@ -315,7 +315,40 @@ template Jupiter::String_Strict Jupiter::String_Strict::gotoTo return Jupiter::Readable_String::gotoToken(in, pos, token); } +// tokenize + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const T &separator) const +{ + return Jupiter::String_Strict::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const Jupiter::Readable_String &separator) const +{ + return Jupiter::String_Strict::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const T *separator, size_t separator_size) const +{ + return Jupiter::String_Strict::tokenize(*this, separator, separator_size); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const Jupiter::Readable_String &in, const T &token) +{ + return Jupiter::Readable_String::tokenize(in, token); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Strict::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + return Jupiter::Readable_String::tokenize(in, separator, separator_size); +} + // Operators + template inline Jupiter::String_Strict Jupiter::String_Strict::operator+(const Jupiter::String_Strict &rhs) const { return Jupiter::String_Strict::operator+(reinterpret_cast &>(rhs)); @@ -653,6 +686,7 @@ template Jupiter::String_Loose Jupiter::String_Loose::gotoToke } // Operators + template inline Jupiter::String_Loose Jupiter::String_Loose::operator+(const Jupiter::String_Loose &rhs) const { return Jupiter::String_Loose::operator+(reinterpret_cast &>(rhs)); @@ -663,6 +697,38 @@ template inline Jupiter::String_Loose Jupiter::String_Loose::o return Jupiter::operator+(*this, rhs); } +// tokenize + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const T &separator) +{ + return Jupiter::String_Loose::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const Jupiter::Readable_String &separator) +{ + return Jupiter::String_Loose::tokenize(*this, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const T *separator, size_t separator_size) +{ + return Jupiter::String_Loose::tokenize(*this, separator, separator_size); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const Jupiter::Readable_String &in, const T &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) +{ + return Jupiter::Readable_String::tokenize(in, separator); +} + +template typename Jupiter::Readable_String::TokenizeResult Jupiter::String_Loose::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) +{ + return Jupiter::Readable_String::tokenize(in, separator, separator_size); +} + #if !defined JUPITER_STRING_STRICT_OPERATOR_PLUS #if !defined DISABLE_DEFAULT_JUPITER_STRING_OPERATOR_PLUS template static inline Jupiter::String_Loose Jupiter::operator+(const Jupiter::Readable_String &lhs, const Jupiter::Readable_String &rhs) diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 3805a6f..d01bfca 100644 Binary files a/Release/Jupiter.lib and b/Release/Jupiter.lib differ