From b010fea3929add75cf3ee63c10828d3b0526643d Mon Sep 17 00:00:00 2001 From: Jessica James Date: Sun, 14 Nov 2021 00:41:49 -0600 Subject: [PATCH] First pass: deprecating Reference_String --- src/include/Jupiter/Readable_String.h | 3 - src/include/Jupiter/Reference_String.h | 59 +++--- src/include/Jupiter/Reference_String_Imp.h | 206 ++++++++------------- 3 files changed, 99 insertions(+), 169 deletions(-) diff --git a/src/include/Jupiter/Readable_String.h b/src/include/Jupiter/Readable_String.h index f68bee1..613cc74 100644 --- a/src/include/Jupiter/Readable_String.h +++ b/src/include/Jupiter/Readable_String.h @@ -455,9 +455,6 @@ namespace Jupiter /** Generic Readable String Type */ typedef Readable_String ReadableString; - - /** Generic Wide Readable String Type */ - typedef Readable_String ReadableWString; } #include "Readable_String_Imp.h" diff --git a/src/include/Jupiter/Reference_String.h b/src/include/Jupiter/Reference_String.h index 33e4744..f54dddf 100644 --- a/src/include/Jupiter/Reference_String.h +++ b/src/include/Jupiter/Reference_String.h @@ -22,9 +22,10 @@ /** * @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). + * Note: DEPRECATED */ +#include #include "Readable_String.h" namespace Jupiter @@ -36,8 +37,8 @@ namespace Jupiter * * @param T Element type which the String will store. Defaults to char. */ - template class Reference_String : public Jupiter::Readable_String - { + template class Reference_String : public Jupiter::Readable_String, public std::basic_string_view { + /** DEPRECATED IN FAVOR OF std::string_view */ public: /** @@ -46,21 +47,21 @@ namespace Jupiter * @param index Index of the element to return. * @return The element located at the specified index. */ - const T &get(size_t index) const; + const T &get(size_t index) const override; /** * @brief Returns the number of elements in the String. * * @return Number of elements in the string. */ - size_t size() const; + size_t size() const override; /** * @brief Returns a pointer to the underlying string of elements. * * @return Pointer to the underlying string of elements. */ - const T *ptr() const; + const T *ptr() const override; /** * @brief Truncates the string by a specified number of elements. @@ -262,36 +263,30 @@ namespace Jupiter static typename Jupiter::Readable_String::template 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; }; - inline Readable_String &operator=(const Reference_String &right) { this->set(right); return *this; }; - inline Readable_String &operator=(const std::basic_string &right) { this->set(right); return *this; }; - inline Readable_String &operator=(const T *right) { this->set(right); return *this; }; + inline Reference_String& operator-=(size_t right) { this->truncate(right); return *this; }; + inline Reference_String& operator=(const Readable_String &right) { std::basic_string_view::operator=({right.ptr(), right.size()}); return *this; }; + inline Reference_String& operator=(const Reference_String &right) = default; + inline Reference_String& operator=(const std::basic_string &right) { std::basic_string_view::operator=(right); return *this; }; + inline Reference_String& operator=(const std::basic_string_view &right) { std::basic_string_view::operator=(right); return *this; }; + inline Reference_String& operator=(const T *right) { std::basic_string_view::operator=(right); return *this; }; /** * @brief Default constructor for the Reference_String class. */ - Reference_String(); + Reference_String() = default; /** * @brief Creates a reference to a C-Style string. + * Difference from basic_string_view: checks nullptr * * @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); + Reference_String(Jupiter::Reference_String &&source) = default; /** * @brief Constructor for the Refererence_String class to create a reference to an existing string. @@ -301,32 +296,24 @@ namespace Jupiter /** * @brief Copy constructor for the Reference_String class. */ - Reference_String(const Jupiter::Reference_String &in); + Reference_String(const Jupiter::Reference_String &in) = default; - /** - * @brief Conversion constructor for Jupiter::DataBuffer class. - */ - Reference_String(const Jupiter::DataBuffer &in); + // Bring in constructors from basic_string_view + using std::basic_string_view::basic_string_view; static const Jupiter::Reference_String empty; /** Empty instantiation of Reference_String */ - protected: - - const T *str; /** Pointer for the underlying string of elements */ - size_t length; /** Number of representable elements in the string */ + /** Methods to force disambiguation between bases until this class is removed entirely */ + using std::basic_string_view::find; + using std::basic_string_view::operator[]; }; /** Generic Reference String Type */ typedef Reference_String ReferenceString; - /** Generic Wide Reference String Type */ - typedef Reference_String ReferenceWString; - - namespace literals - { + namespace literals { /** Reference_String literals */ inline Jupiter::ReferenceString operator"" _jrs(const char *str, size_t len) { return Jupiter::ReferenceString(str, len); } - inline Jupiter::ReferenceWString operator"" _jrws(const wchar_t *str, size_t len) { return Jupiter::ReferenceWString(str, len); } } } diff --git a/src/include/Jupiter/Reference_String_Imp.h b/src/include/Jupiter/Reference_String_Imp.h index 888cf63..179d4f5 100644 --- a/src/include/Jupiter/Reference_String_Imp.h +++ b/src/include/Jupiter/Reference_String_Imp.h @@ -26,220 +26,175 @@ */ #include "Reference_String.h" +#include // std::min according to standard +#include // std::min on MSVC #include "Functions.h" +// A hack due to some Windows.h inclusion somewhere, ugh +#ifdef min +#undef min +#endif + /** * IMPLEMENTATION: * Reference_String */ -template Jupiter::Reference_String::Reference_String() : Reference_String(nullptr, 0) -{ -} - template Jupiter::Reference_String::Reference_String(const T *in) -{ - Jupiter::Reference_String::str = in; - if (in == nullptr) Jupiter::Reference_String::length = 0; - else 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 = nullptr; -} - -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) -{ + : std::basic_string_view{} { + if (in != nullptr) { + *this = in; + } } -template Jupiter::Reference_String::Reference_String(const Jupiter::DataBuffer &in) : Reference_String(reinterpret_cast(in.getHead()), in.size() / sizeof(T)) -{ +template Jupiter::Reference_String::Reference_String(const Jupiter::Readable_String& in) + : Reference_String(in.ptr(), in.size()) { } -template const T &Jupiter::Reference_String::get(size_t index) const -{ - return Jupiter::Reference_String::str[index]; +template const T &Jupiter::Reference_String::get(size_t index) const { + return operator[](index); } -template size_t Jupiter::Reference_String::size() const -{ - return Jupiter::Reference_String::length; +template size_t Jupiter::Reference_String::size() const { + return std::basic_string_view::size(); } -template const T *Jupiter::Reference_String::ptr() const -{ - return Jupiter::Reference_String::str; +template const T* Jupiter::Reference_String::ptr() const { + return std::basic_string_view::data(); } // truncate -template size_t Jupiter::Reference_String::truncate(size_t n) -{ - if (n >= Jupiter::Reference_String::length) return (Jupiter::Reference_String::length = 0); - return (Jupiter::Reference_String::length -= n); +template size_t Jupiter::Reference_String::truncate(size_t n) { + std::basic_string_view::remove_suffix(std::min(n, size())); + return size(); } // erase -template void Jupiter::Reference_String::erase() -{ - Jupiter::Reference_String::length = 0; +template void Jupiter::Reference_String::erase() { + std::basic_string_view::remove_suffix(size()); } // shift -template size_t Jupiter::Reference_String::shiftLeft(size_t len) -{ - Jupiter::Reference_String::str -= len; - Jupiter::Reference_String::length += len; +template size_t Jupiter::Reference_String::shiftLeft(size_t len) { + *this = std::basic_string_view{ this->data() - len, size() }; return len; } -template size_t Jupiter::Reference_String::shiftRight(size_t len) -{ - if (len > Jupiter::Reference_String::length) len = Jupiter::Reference_String::length; - Jupiter::Reference_String::str += len; - Jupiter::Reference_String::length -= len; +template size_t Jupiter::Reference_String::shiftRight(size_t len) { + len = std::min(len, size()); + this->remove_prefix(len); return len; } // set -template size_t Jupiter::Reference_String::set(const Jupiter::Readable_String &in) -{ +template size_t Jupiter::Reference_String::set(const Jupiter::Readable_String &in) { return this->set(in.ptr(), in.size()); } -template size_t Jupiter::Reference_String::set(const std::basic_string &in) -{ - return this->set(in.data(), in.size()); +template size_t Jupiter::Reference_String::set(const std::basic_string &in) { + *this = in; + return size(); } -template size_t Jupiter::Reference_String::set(const T *in, size_t len) -{ - Jupiter::Reference_String::str = in; - return Jupiter::Reference_String::length = len; +template size_t Jupiter::Reference_String::set(const T *in, size_t len) { + *this = std::basic_string_view{ in, len }; + return size(); } -template size_t Jupiter::Reference_String::set(const T *in) -{ - if (in == nullptr) return this->set(in, 0); - return this->set(in, Jupiter::strlen(in)); +template size_t Jupiter::Reference_String::set(const T *in) { + if (in == nullptr) { + *this = std::basic_string_view{}; + } + *this = std::basic_string_view{ in }; + return size(); } -template Jupiter::Reference_String Jupiter::Reference_String::substring(size_t pos) const -{ +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 -{ +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(); +template Jupiter::Reference_String Jupiter::Reference_String::substring(const Jupiter::Readable_String &in, size_t pos) { + pos = std::min(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) -{ +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); +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) -{ +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 -{ +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) -{ +template Jupiter::Reference_String Jupiter::Reference_String::getWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace) { return Jupiter::Readable_String::template getWord(in, pos, whitespace); } -template Jupiter::Reference_String Jupiter::Reference_String::getWord(const T *in, size_t pos, const T *whitespace) -{ +template Jupiter::Reference_String Jupiter::Reference_String::getWord(const T *in, size_t pos, const T *whitespace) { return Jupiter::Readable_String::template getWord(in, pos, whitespace); } -template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const T &token) const -{ +template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const T &token) const { return Jupiter::Reference_String::getToken(*this, pos, token); } -template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const Jupiter::Readable_String &token) const -{ +template Jupiter::Reference_String Jupiter::Reference_String::getToken(size_t pos, const Jupiter::Readable_String &token) const { 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) -{ +template Jupiter::Reference_String Jupiter::Reference_String::getToken(const Jupiter::Readable_String &in, size_t pos, const T &token) { return Jupiter::Readable_String::template 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) -{ +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::template getToken(in, pos, token); } -template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(size_t pos, const T *whitespace) const -{ +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) -{ +template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(const Jupiter::Readable_String &in, size_t pos, const T *whitespace) { return Jupiter::Readable_String::template gotoWord(in, pos, whitespace); } -template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(const T *in, size_t pos, const T *whitespace) -{ +template Jupiter::Reference_String Jupiter::Reference_String::gotoWord(const T *in, size_t pos, const T *whitespace) { return Jupiter::Readable_String::template gotoWord(in, pos, whitespace); } -template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const T &token) const -{ +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const T &token) const { return Jupiter::Reference_String::gotoToken(*this, pos, token); } -template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const Jupiter::Readable_String &token) const -{ +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(size_t pos, const Jupiter::Readable_String &token) const { 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) -{ +template Jupiter::Reference_String Jupiter::Reference_String::gotoToken(const Jupiter::Readable_String &in, size_t pos, const T &token) { return Jupiter::Readable_String::template 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) -{ +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::template gotoToken(in, pos, token); } @@ -247,47 +202,38 @@ template const Jupiter::Reference_String Jupiter::Reference_Strin // tokenize -template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const T &separator) const -{ +template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const T &separator) const { return Jupiter::Reference_String::tokenize(*this, separator); } -template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &separator) const -{ +template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &separator) const { return Jupiter::Reference_String::tokenize(*this, separator); } -template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const T *separator, size_t separator_size) const -{ +template typename Jupiter::Readable_String::template 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::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T &token) -{ +template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T &token) { return Jupiter::Readable_String::template tokenize(in, token); } -template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) -{ +template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator) { return Jupiter::Readable_String::template tokenize(in, separator); } -template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) -{ +template typename Jupiter::Readable_String::template TokenizeResult Jupiter::Reference_String::tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size) { return Jupiter::Readable_String::template tokenize(in, separator, separator_size); } // Jupiter::DataBuffer specialization -template<> struct _Jupiter_DataBuffer_partial_specialization_impl -{ - template static void push(Jupiter::DataBuffer *buffer, const Jupiter::Reference_String *data) - { +template<> struct _Jupiter_DataBuffer_partial_specialization_impl { + template static void push(Jupiter::DataBuffer *buffer, const Jupiter::Reference_String *data) { _Jupiter_DataBuffer_partial_specialization_impl::push(buffer, data); }; - template static Jupiter::Reference_String interpret(uint8_t *&head) - { + template static Jupiter::Reference_String interpret(uint8_t *&head) { size_t size_ = *reinterpret_cast(head); head += sizeof(size_t); Jupiter::Reference_String r = Jupiter::Reference_String(reinterpret_cast(head), size_);