From b47fedda1c951b00aa88f97af46f402c2d80838c Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Mon, 2 Jun 2014 20:24:21 -0400 Subject: [PATCH] Added Reference_String class. --- Jupiter/Jupiter.vcxproj | 2 + Jupiter/Jupiter.vcxproj.filters | 6 + Jupiter/Reference_String.h | 211 ++++++++++++++++++++++++++++++++ Jupiter/Reference_String_Imp.h | 146 ++++++++++++++++++++++ Release/Jupiter.lib | Bin 203748 -> 205240 bytes 5 files changed, 365 insertions(+) create mode 100644 Jupiter/Reference_String.h create mode 100644 Jupiter/Reference_String_Imp.h diff --git a/Jupiter/Jupiter.vcxproj b/Jupiter/Jupiter.vcxproj index b81cc9d..b32e5a2 100644 --- a/Jupiter/Jupiter.vcxproj +++ b/Jupiter/Jupiter.vcxproj @@ -134,6 +134,8 @@ + + diff --git a/Jupiter/Jupiter.vcxproj.filters b/Jupiter/Jupiter.vcxproj.filters index fe61b68..1a6b281 100644 --- a/Jupiter/Jupiter.vcxproj.filters +++ b/Jupiter/Jupiter.vcxproj.filters @@ -209,6 +209,12 @@ Header Files\Strings + + Header Files\Strings + + + Header Files\Strings + diff --git a/Jupiter/Reference_String.h b/Jupiter/Reference_String.h new file mode 100644 index 0000000..6d01b7f --- /dev/null +++ b/Jupiter/Reference_String.h @@ -0,0 +1,211 @@ +/** + * Copyright (C) 2013-2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#if !defined _REFERENCE_STRING_H_HEADER +#define _REFERENCE_STRING_H_HEADER + +/** + * @file Reference_String.h + * @brief Provides the basis for String types, of any implementation. + * Note: Some methods are commented out. This means that they should be implemented, but could not be put declared in this template (return of abstract type). + */ + +#include "Readable_String.h" + +namespace Jupiter +{ + + /** + * @brief Provides the basis for String classes by providing implementations for operators, comparative operations, and defining abstract functions. + * Note: This is an abstract type. + * + * @param T Element type which the String will store. Defaults to char. + */ + template class Reference_String : public Jupiter::Readable_String + { + public: + + /** + * @brief Fetches an element from the string. + * + * @param index Index of the element to return. + * @return The element located at the specified index. + */ + const T &get(size_t index) const; + + /** + * @brief Returns the number of elements in the String. + * + * @return Number of elements in the string. + */ + size_t size() const; + + /** + * @brief Returns a pointer to the underlying string of elements. + * + * @return Pointer to the underlying string of elements. + */ + const T *ptr() const; + + /** + * @brief Creates a partial copy of the string. + * + * @param pos Position in the string to start copying from. + * @return String containing a partial copy of the original string. + */ + Reference_String substring(size_t pos) const; + + /** + * @brief Creates a partial copy of the string. + * + * @param pos Position in the string to start copying from. + * @param length Number of characters to copy. + * @return String containing a partial copy of the original string. + */ + Reference_String substring(size_t pos, size_t length) const; + + /** + * @brief Creates a partial copy of the string. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @return String containing a partial copy of the original string. + */ + static Reference_String substring(const Jupiter::Readable_String &in, size_t pos); + static Reference_String substring(const T *in, size_t pos); + + /** + * @brief Creates a partial copy of the string. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param length Number of characters to copy. + * @return String containing a partial copy of the original string. + */ + static Reference_String substring(const Jupiter::Readable_String &in, size_t pos, size_t length); + static Reference_String substring(const T *in, size_t pos, size_t length); + + /** + * @brief Creates a partial copy of the string, based on a set of tokens. + * + * @param pos Position of word in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + Reference_String getWord(size_t pos, const T *whitespace) const; + + /** + * @brief Creates a partial copy of an input string, based on a set of tokens. + * + * @param in String to get a partial copy of. + * @param pos Position of word in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + static Reference_String getWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + + /** + * @brief Creates a partial copy of an input string, based on a set of tokens. + * + * @param in C-Style string to get a partial copy of. + * @param pos Position of word in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + static Reference_String getWord(const T *in, size_t pos, const T *whitespace); + + /** + * @brief Creates a partial copy of the string, based on a set of tokens. + * + * @param pos Position in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + Reference_String gotoWord(size_t pos, const T *whitespace) const; + + /** + * @brief Creates a partial copy of the string, based on a set of tokens. + * + * @param in String to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + static Reference_String gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace); + + /** + * @brief Creates a partial copy of the string, based on a set of tokens. + * + * @param in C-Style string to get a partial copy of. + * @param pos Position in the string to start copying from. + * @param whitespace A string of tokens used to deliminate words. + * @return String containing a partial copy of the original string. + */ + static Reference_String gotoWord(const T *in, size_t pos, const T *whitespace); + + /** + * @brief Default constructor for the Reference_String class. + */ + Reference_String(); + + /** + * @brief Creates a reference to a C-Style string. + * + * @param in String to get a reference of. + */ + Reference_String(const T *in); + + /** + * @brief Creates a reference to a string. + * + * @param in String to get a reference of. + * @param len Length of the string to track. + */ + Reference_String(const T *in, size_t len); + + /** + * @brief Move constructor for the Reference_String class. + */ + Reference_String(Jupiter::Reference_String &&source); + + /** + * @brief Constructor for the Refererence_String class to create a reference to an existing string. + */ + Reference_String(const Jupiter::Readable_String &in); + + /** + * @brief Copy constructor for the Reference_String class. + */ + Reference_String(const Jupiter::Reference_String &in); + + protected: + + const T *str; /** Pointer for the underlying string of elements */ + size_t length; /** Number of representable elements in the string */ + }; + + /** Generic Reference String Type */ + typedef Reference_String ReferenceString; + + /** Generic Wide Reference String Type */ + typedef Reference_String ReferenceWString; + +} + +#include "Reference_String_Imp.h" + +#endif // _REFERENCE_STRING_H_HEADER \ No newline at end of file diff --git a/Jupiter/Reference_String_Imp.h b/Jupiter/Reference_String_Imp.h new file mode 100644 index 0000000..5ee158a --- /dev/null +++ b/Jupiter/Reference_String_Imp.h @@ -0,0 +1,146 @@ +/** + * Copyright (C) 2014 Justin James. + * + * This license must be preserved. + * Any applications, libraries, or code which make any use of any + * component of this program must not be commercial, unless explicit + * permission is granted from the original author. The use of this + * program for non-profit purposes is permitted. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * In the event that this license restricts you from making desired use of this program, contact the original author. + * Written by Justin James + */ + +#if !defined _REFERENCE_STRING_IMP_H_HEADER +#define _REFERENCE_STRING_IMP_H_HEADER + +/** + * @file Readable_String_Imp.h + * @brief Provides the implementations for Readable_String functions. + * Note: Modification of this file is not supported in any way. + */ + +#include "Reference_String.h" +#include "Functions.h" + +/** +* IMPLEMENTATION: +* Reference_String +*/ + +template Jupiter::Reference_String::Reference_String() +{ + Jupiter::Reference_String::str = ""; + Jupiter::Reference_String::length = 0; +} + +template Jupiter::Reference_String::Reference_String(const T *in) +{ + Jupiter::Reference_String::str = in; + Jupiter::Reference_String::length = Jupiter::strlen(in); +} + +template Jupiter::Reference_String::Reference_String(const T *in, size_t len) +{ + Jupiter::Reference_String::str = in; + Jupiter::Reference_String::length = len; +} + +template Jupiter::Reference_String::Reference_String(Jupiter::Reference_String &&source) +{ + Jupiter::Reference_String::str = source.str; + Jupiter::Reference_String::length = source.length; + source.length = 0; + source.str = ""; +} + +template Jupiter::Reference_String::Reference_String(const Jupiter::Readable_String &in) : Reference_String(in.ptr(), in.size()) +{ +} + +template Jupiter::Reference_String::Reference_String(const Jupiter::Reference_String &in) : Reference_String(in.str, in.length) +{ +} + +template const T &Jupiter::Reference_String::get(size_t index) const +{ + return Jupiter::Reference_String::str[index]; +} + +template size_t Jupiter::Reference_String::size() const +{ + return Jupiter::Reference_String::length; +} + +template const T *Jupiter::Reference_String::ptr() const +{ + return Jupiter::Reference_String::str; +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(size_t pos) const +{ + return Jupiter::Reference_String::substring(*this, pos); +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(size_t pos, size_t len) const +{ + return Jupiter::Reference_String::substring(*this, pos, len); +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(const Jupiter::Readable_String &in, size_t pos) +{ + if (pos > in.size()) pos = in.size(); + return Jupiter::Reference_String(in.ptr() + pos, in.size() - pos); +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(const T *in, size_t pos) +{ + return Jupiter::Reference_String(in + pos); +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(const Jupiter::Readable_String &in, size_t pos, size_t len) +{ + if (pos + len > in.size()) return Jupiter::Reference_String::substring(in, pos); + return Jupiter::Reference_String(in.ptr() + pos, len); +} + +template Jupiter::Reference_String Jupiter::Reference_String::substring(const T *in, size_t pos, size_t len) +{ + return Jupiter::Reference_String(in + pos, len); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getWord(size_t pos, const T *whitespace) const +{ + return Jupiter::Reference_String::getWord(*this, pos, whitespace); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace) +{ + return Jupiter::Readable_String::getWord(in, pos, whitespace); +} + +template Jupiter::Reference_String Jupiter::Reference_String::getWord(const T *in, size_t pos, const T *whitespace) +{ + return Jupiter::Readable_String::getWord(in, pos, whitespace); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(size_t pos, const T *whitespace) const +{ + return Jupiter::Reference_String::gotoWord(*this, pos, whitespace); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace) +{ + return Jupiter::Readable_String::gotoWord(in, pos, whitespace); +} + +template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(const T *in, size_t pos, const T *whitespace) +{ + return Jupiter::Readable_String::gotoWord(in, pos, whitespace); +} + +#endif // _REFERENCE_STRING_IMP \ No newline at end of file diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 086217a4ec9c52ffad203533de36c6e82afe13b7..e741f7271a155721ea558be2ceb8194302d53bb0 100644 GIT binary patch delta 30566 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 Ssz(vinahVW)VD=EMg9+sY8WK| delta 30390 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 Yo8OaHtq$@;`OiexJa4NO7WEYPUlwDgn*aa+