From c426110f24516f92ecb8a5374e2a281f2c79787a Mon Sep 17 00:00:00 2001 From: Dominick Allen Date: Mon, 31 Mar 2025 00:47:45 -0500 Subject: Fix Vector bug. --- include/fud_string.hpp | 12 +++---- include/fud_vector.hpp | 28 ++------------- source/fud_string.cpp | 43 +++++++++------------- test/test_hash_map.cpp | 97 +++++++++++++++++++++----------------------------- test/test_vector.cpp | 2 ++ 5 files changed, 64 insertions(+), 118 deletions(-) diff --git a/include/fud_string.hpp b/include/fud_string.hpp index 1d724f0..1c189c2 100644 --- a/include/fud_string.hpp +++ b/include/fud_string.hpp @@ -157,8 +157,7 @@ class String { fudAssert(totalLength < maxStringLength); String output{}; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - output.m_allocator = reinterpret_cast(allocator); + output.m_allocator = std::bit_cast(allocator); utf8* data{nullptr}; size_t outputCapacity = totalLength + 1; bool isLarge = outputCapacity > SsoBufSize; @@ -355,14 +354,12 @@ class String { [[nodiscard]] static bool allocatorValid(Allocator* allocator) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - return (reinterpret_cast(allocator) & isLargeMask) == 0; + return (std::bit_cast(allocator) & isLargeMask) == 0; } [[nodiscard]] Allocator* allocator() const { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast,performance-no-int-to-ptr) - auto* allocPtr = reinterpret_cast(m_allocator & allocatorMask); + auto* allocPtr = std::bit_cast(m_allocator & allocatorMask); fudAssert(allocPtr != nullptr); return allocPtr; } @@ -388,8 +385,7 @@ class String { /** \brief The allocator used to get storage for characters when the string * is large. */ - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - uintptr_t m_allocator{reinterpret_cast(&globalFudAllocator)}; + uintptr_t m_allocator{std::bit_cast(&globalFudAllocator)}; using BufType = Array; union { diff --git a/include/fud_vector.hpp b/include/fud_vector.hpp index fd01cd0..9808a7d 100644 --- a/include/fud_vector.hpp +++ b/include/fud_vector.hpp @@ -95,9 +95,9 @@ class Vector { Vector output{}; auto status = initializeWithCapacity(output, capacity, allocator); if (status != FudStatus::Success) { - return status; + return Error{status}; } - return output; + return Okay{std::move(output)}; } static FudStatus initializeWithCapacity( @@ -255,30 +255,6 @@ class Vector { } } - template - static Result, FudStatus> from(Option allocatorOpt, Args&&... args) - { - constexpr size_t size = sizeof...(args); - Vector output{}; - Allocator* allocator = allocatorOpt.hasValue() ? allocatorOpt.value() : &globalFudAllocator; - auto status = Vector::initializeWithCapacity(output, size, allocator); - if (status != FudStatus::Success) { - return Error{status}; - } - output.m_length = size; - size_t index = 0; - /* - for (size_t index = 0; index < output.m_length; ++index) { - - } - */ - ([&]() { - output.m_data[index] = std::forward(args); - ++index; - } (), ...); - return Okay{std::move(output)}; - } - static Vector move(Vector&& rhs) noexcept { return Vector{std::move(rhs)}; diff --git a/source/fud_string.cpp b/source/fud_string.cpp index 69df7e4..777212d 100644 --- a/source/fud_string.cpp +++ b/source/fud_string.cpp @@ -23,21 +23,18 @@ namespace fud { StringResult String::withAllocator(Allocator& allocator) { - if (!String::allocatorValid(&allocator)) - { + if (!String::allocatorValid(&allocator)) { return Error{FudStatus::ArgumentInvalid}; } String output{}; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - output.m_allocator = reinterpret_cast(&allocator); + output.m_allocator = std::bit_cast(&allocator); return Okay{std::move(output)}; } StringResult String::makeFromCString(const char8_t* cString) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - return makeFromCString(reinterpret_cast(cString)); + return makeFromCString(std::bit_cast(cString)); } StringResult String::makeFromCString(const char* cString) @@ -47,8 +44,7 @@ StringResult String::makeFromCString(const char* cString) StringResult String::makeFromCString(const char8_t* cString, Allocator* allocator) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - return makeFromCString(reinterpret_cast(cString), allocator); + return makeFromCString(std::bit_cast(cString), allocator); } StringResult String::makeFromCString(const char* cString, Allocator* allocator) @@ -74,8 +70,7 @@ StringResult String::makeFromCString(const char* cString, Allocator* allocator) } String output{}; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - output.m_allocator = reinterpret_cast(allocator); + output.m_allocator = std::bit_cast(allocator); utf8* outputData{nullptr}; size_t outputCapacity = outputLength + 1; @@ -97,10 +92,10 @@ StringResult String::makeFromCString(const char* cString, Allocator* allocator) auto terminateStatus = output.nullTerminate(); fudAssert(terminateStatus == FudStatus::Success); - return StringResult::okay(std::move(output)); + return Okay{std::move(output)}; } -//NOLINTNEXTLINE(performance-unnecessary-value-param) +// NOLINTNEXTLINE(performance-unnecessary-value-param) StringResult String::from(const String& rhs, Option allocatorOption) { if (!rhs.valid()) { @@ -113,8 +108,8 @@ StringResult String::from(const String& rhs, Option allocatorOption) } String output{}; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - output.m_allocator = reinterpret_cast(allocator); + output.m_allocator = std::bit_cast(allocator); + utf8* outputData{nullptr}; size_t outputCapacity{rhs.capacity()}; size_t outputLength{rhs.length()}; @@ -148,8 +143,7 @@ StringResult String::from(StringView view, Allocator* allocator) } String output{}; - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - output.m_allocator = reinterpret_cast(allocator); + output.m_allocator = std::bit_cast(allocator); size_t outputCapacity = view.length() + 1U; bool isLarge = outputCapacity > SsoBufSize; utf8* data{nullptr}; @@ -206,8 +200,7 @@ FudStatus String::copy(const String& rhs) if (allocResult.isError()) { return allocResult.takeError(); } - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - m_repr.large.data = reinterpret_cast(allocResult.takeOkay()); + m_repr.large.data = std::bit_cast(allocResult.takeOkay()); outputCapacity = m_repr.large.capacity; outputLength = m_repr.large.length; outputData = m_repr.large.data; @@ -250,8 +243,7 @@ void String::cleanup() { const auto* allocPtr = allocator(); if (isLarge() && m_repr.large.data != nullptr && allocPtr != nullptr) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - allocator()->deallocate(reinterpret_cast(m_repr.large.data), m_repr.large.capacity); + allocator()->deallocate(std::bit_cast(m_repr.large.data), m_repr.large.capacity); m_repr.large.data = nullptr; } } @@ -278,8 +270,7 @@ FudStatus String::resize(size_t newCapacity) auto copyResult = copyMem(dataMut(), temp.size(), temp.data(), len); fudAssert(copyResult == FudStatus::Success); - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - allocator()->deallocate(reinterpret_cast(m_repr.large.data), m_repr.large.capacity); + allocator()->deallocate(std::bit_cast(m_repr.large.data), m_repr.large.capacity); setSmall(); m_repr.small.length = len & smallStringLengthMask; copyMem(m_repr.small.buffer, temp); @@ -292,16 +283,15 @@ FudStatus String::resize(size_t newCapacity) if (allocResult.isError()) { return allocResult.takeError(); } - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - auto* newData = reinterpret_cast(allocResult.takeOkay()); + + auto* newData = std::bit_cast(allocResult.takeOkay()); fudAssert(newData != nullptr); auto copyResult = copyMem(newData, newCapacity, data(), length()); fudAssert(copyResult == FudStatus::Success); if (isLarge()) { - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - allocator()->deallocate(reinterpret_cast(m_repr.large.data), m_repr.large.capacity); + allocator()->deallocate(std::bit_cast(m_repr.large.data), m_repr.large.capacity); } size_t len = length(); @@ -773,7 +763,6 @@ bool String::operator==(const String& rhs) const return diffResult.getOkay() == 0; } - FudStatus String::clear() { if (!valid()) { diff --git a/test/test_hash_map.cpp b/test/test_hash_map.cpp index 00c4693..aa0ba49 100644 --- a/test/test_hash_map.cpp +++ b/test/test_hash_map.cpp @@ -24,21 +24,39 @@ namespace fud { +Vector testStrings() +{ + Vector stringList{Vector::withCapacity(9).takeOkay()}; + fudAssert(stringList.pushBack(String::makeFromCString("foo").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("bar").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("baz").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("qux").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("Tom").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("Dick").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("Harry").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("Alice").takeOkay()) == FudStatus::Success); + fudAssert(stringList.pushBack(String::makeFromCString("Bob").takeOkay()) == FudStatus::Success); + return stringList; +} + +Vector testStringViews() +{ + Vector stringList{Vector::withCapacity(9).takeOkay()}; + fudAssert(stringList.pushBack(StringView::makeFromCString("foo")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("bar")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("baz")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("qux")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("Tom")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("Dick")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("Harry")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("Alice")) == FudStatus::Success); + fudAssert(stringList.pushBack(StringView::makeFromCString("Bob")) == FudStatus::Success); + return stringList; +} + TEST(FudHash, InsertMoveKeyMoveValue) { - auto stringList{ - Vector::from( - NullOpt, - String::makeFromCString("foo").takeOkay(), - String::makeFromCString("bar").takeOkay(), - String::makeFromCString("baz").takeOkay(), - String::makeFromCString("qux").takeOkay(), - String::makeFromCString("Tom").takeOkay(), - String::makeFromCString("Dick").takeOkay(), - String::makeFromCString("Harry").takeOkay(), - String::makeFromCString("Alice").takeOkay(), - String::makeFromCString("Bob").takeOkay()) - .takeOkay()}; + auto stringList{testStrings()}; HashMap mapInt2String{}; for (int index = 0; index < static_cast(stringList.size()); ++index) { auto insertStatus = mapInt2String.insert(index * 1, String::from(stringList[index]).takeOkay()); @@ -55,19 +73,7 @@ TEST(FudHash, InsertMoveKeyMoveValue) TEST(FudHash, InsertMoveKeyCopyValue) { - auto stringList{ - Vector::from( - NullOpt, - String::makeFromCString("foo").takeOkay(), - String::makeFromCString("bar").takeOkay(), - String::makeFromCString("baz").takeOkay(), - String::makeFromCString("qux").takeOkay(), - String::makeFromCString("Tom").takeOkay(), - String::makeFromCString("Dick").takeOkay(), - String::makeFromCString("Harry").takeOkay(), - String::makeFromCString("Alice").takeOkay(), - String::makeFromCString("Bob").takeOkay()) - .takeOkay()}; + auto stringList{testStrings()}; HashMap mapString2Int{}; for (int index = 0; index < static_cast(stringList.size()); ++index) { auto insertStatus = mapString2Int.insert(String::from(stringList[index]).takeOkay(), index * 1); @@ -85,19 +91,7 @@ TEST(FudHash, InsertMoveKeyCopyValue) TEST(FudHash, InsertCopyKeyMoveValue) { - auto stringList{ - Vector::from( - NullOpt, - String::makeFromCString("foo").takeOkay(), - String::makeFromCString("bar").takeOkay(), - String::makeFromCString("baz").takeOkay(), - String::makeFromCString("qux").takeOkay(), - String::makeFromCString("Tom").takeOkay(), - String::makeFromCString("Dick").takeOkay(), - String::makeFromCString("Harry").takeOkay(), - String::makeFromCString("Alice").takeOkay(), - String::makeFromCString("Bob").takeOkay()) - .takeOkay()}; + auto stringList{testStrings()}; HashMap mapInt2String{}; for (int index = 0; index < static_cast(stringList.size()); ++index) { auto insertStatus = mapInt2String.insert(index, String::from(stringList[index]).takeOkay()); @@ -115,31 +109,20 @@ TEST(FudHash, InsertCopyKeyMoveValue) TEST(FudHash, InsertCopyKeyCopyValue) { - auto stringList{ - Vector::from( - NullOpt, - StringView::makeFromCString("foo"), - StringView::makeFromCString("bar"), - StringView::makeFromCString("baz"), - StringView::makeFromCString("qux"), - StringView::makeFromCString("Tom"), - StringView::makeFromCString("Dick"), - StringView::makeFromCString("Harry"), - StringView::makeFromCString("Alice"), - StringView::makeFromCString("Bob")) - .takeOkay()}; + auto stringViewList{testStringViews()}; + HashMap mapView2Int{}; - for (int index = 0; index < static_cast(stringList.size()); ++index) { - auto insertStatus = mapView2Int.insert(stringList[index], index); + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { + auto insertStatus = mapView2Int.insert(stringViewList[index], index); EXPECT_EQ(insertStatus, FudStatus::Success); } - EXPECT_EQ(mapView2Int.size(), stringList.size()); + EXPECT_EQ(mapView2Int.size(), stringViewList.size()); EXPECT_GT(mapView2Int.capacity(), mapView2Int.size()); - for (int index = 0; index < static_cast(stringList.size()); ++index) { + for (int index = 0; index < static_cast(stringViewList.size()); ++index) { const int invalid = -1; - EXPECT_EQ(mapView2Int.getConstRef(stringList[index]).valueOr(invalid), index); + EXPECT_EQ(mapView2Int.getConstRef(stringViewList[index]).valueOr(invalid), index); } } diff --git a/test/test_vector.cpp b/test/test_vector.cpp index 3f4e584..ba15085 100644 --- a/test/test_vector.cpp +++ b/test/test_vector.cpp @@ -188,6 +188,7 @@ TEST(VectorTest, NestedVector) // Result>, FudStatus> } +/* TEST(VectorTest, WithElements) { auto vectorResult{Vector::from(NullOpt, 1, 2, 3, 42, -100)}; @@ -200,5 +201,6 @@ TEST(VectorTest, WithElements) ASSERT_EQ(intVector[3], 42); ASSERT_EQ(intVector[4], -100); } +*/ } // namespace fud -- cgit v1.2.3