From bf81e34921e3e30b05313efbcf5c9fa839cb7c05 Mon Sep 17 00:00:00 2001 From: Dominick Allen Date: Sun, 22 Sep 2024 10:19:15 -0500 Subject: Initial commit. --- include/string.hpp | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 include/string.hpp (limited to 'include/string.hpp') diff --git a/include/string.hpp b/include/string.hpp new file mode 100644 index 0000000..89aa94e --- /dev/null +++ b/include/string.hpp @@ -0,0 +1,153 @@ +/* + * Copyright 2024 Dominick Allen + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FUD_STRING_HPP +#define FUD_STRING_HPP + +#include "utf8.hpp" + +#include +#include + +static_assert(CHAR_BIT == 8); + +namespace fud { + +class String { + public: + [[nodiscard]] constexpr size_t length() const + { + return m_length; + } + + [[nodiscard]] constexpr size_t size() const + { + return m_length + 1; + } + + [[nodiscard]] constexpr size_t capacity() const + { + return m_capacity; + } + + [[nodiscard]] constexpr utf8* data() const + { + return m_data; + } + + [[nodiscard]] bool nullTerminated() const; + + [[nodiscard]] bool valid() const; + + [[nodiscard]] bool utf8Valid() const; + + [[nodiscard]] FudStatus nullTerminate() const; + + [[nodiscard]] constexpr size_t remainingLength() const + { + if (m_length >= m_capacity) { + return 0; + } + + return m_capacity - 1U - m_length; + } + + [[nodiscard]] FudStatus pushBack(char letter); + + [[nodiscard]] FudStatus pushBack(utf8 letter); + + [[nodiscard]] FudStatus pushBack(const ExtUtf8& letter); + + std::optional pop(); + + [[nodiscard]] FudStatus catenate(StringView source); + + private: + utf8* m_data; + size_t m_length; + size_t m_capacity; +}; + +class StringView { + public: + constexpr StringView() noexcept : m_length(0), m_data{nullptr} + { + } + + constexpr StringView(size_t strLen, const utf8* strData) : m_length(0), m_data{strData} + { + } + + StringView(size_t strLen, const char* strData) : + m_length(0), // line break + m_data{reinterpret_cast(strData)} // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast) + { + } + + explicit constexpr StringView(const StringView& view) noexcept = default; + + explicit constexpr StringView(const String& fudString) noexcept : StringView(fudString.length(), fudString.data()) + { + } + + [[nodiscard]] constexpr size_t length() const + { + return m_length; + } + + [[nodiscard]] constexpr const utf8* data() const + { + return m_data; + } + + [[nodiscard]] bool nullTerminated() const; + + [[nodiscard]] bool utf8Valid() const; + + Result skipWhitespace(); + + Result trimWhitespace(); + + FudStatus toUint8(uint8_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toUint16(uint16_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toUint32(uint32_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toUint64(uint64_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toInt8(int8_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toInt16(int16_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toInt32(int32_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toInt64(int64_t& number, uint8_t specifiedRadix, size_t& strLen) const; + + FudStatus toFloat(float& number, size_t& strLen) const; + + FudStatus toDouble(double& number, size_t& strLen) const; + + private: + size_t m_length; + const utf8* m_data; +}; + +FudStatus skipWhitespace(StringView& view, size_t& skipIndex); + +} // namespace fud + +#endif -- cgit v1.2.3