summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/fud_string.hpp12
-rw-r--r--include/fud_vector.hpp28
-rw-r--r--source/fud_string.cpp43
-rw-r--r--test/test_hash_map.cpp97
-rw-r--r--test/test_vector.cpp2
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<uintptr_t>(allocator);
+ output.m_allocator = std::bit_cast<uintptr_t>(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<uintptr_t>(allocator) & isLargeMask) == 0;
+ return (std::bit_cast<uintptr_t>(allocator) & isLargeMask) == 0;
}
[[nodiscard]] Allocator* allocator() const
{
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast,performance-no-int-to-ptr)
- auto* allocPtr = reinterpret_cast<Allocator*>(m_allocator & allocatorMask);
+ auto* allocPtr = std::bit_cast<Allocator*>(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<uintptr_t>(&globalFudAllocator)};
+ uintptr_t m_allocator{std::bit_cast<uintptr_t>(&globalFudAllocator)};
using BufType = Array<utf8, SsoBufSize>;
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<T> 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 <typename... Args>
- static Result<Vector<T>, FudStatus> from(Option<Allocator*> allocatorOpt, Args&&... args)
- {
- constexpr size_t size = sizeof...(args);
- Vector<T> 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<T>(args);
- ++index;
- } (), ...);
- return Okay{std::move(output)};
- }
-
static Vector<T> move(Vector<T>&& rhs) noexcept
{
return Vector<T>{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<uintptr_t>(&allocator);
+ output.m_allocator = std::bit_cast<uintptr_t>(&allocator);
return Okay{std::move(output)};
}
StringResult String::makeFromCString(const char8_t* cString)
{
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
- return makeFromCString(reinterpret_cast<const char*>(cString));
+ return makeFromCString(std::bit_cast<const char*>(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<const char*>(cString), allocator);
+ return makeFromCString(std::bit_cast<const char*>(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<uintptr_t>(allocator);
+ output.m_allocator = std::bit_cast<uintptr_t>(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<Allocator*> allocatorOption)
{
if (!rhs.valid()) {
@@ -113,8 +108,8 @@ StringResult String::from(const String& rhs, Option<Allocator*> allocatorOption)
}
String output{};
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
- output.m_allocator = reinterpret_cast<uintptr_t>(allocator);
+ output.m_allocator = std::bit_cast<uintptr_t>(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<uintptr_t>(allocator);
+ output.m_allocator = std::bit_cast<uintptr_t>(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<utf8*>(allocResult.takeOkay());
+ m_repr.large.data = std::bit_cast<utf8*>(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<std::byte*>(m_repr.large.data), m_repr.large.capacity);
+ allocator()->deallocate(std::bit_cast<std::byte*>(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<std::byte*>(m_repr.large.data), m_repr.large.capacity);
+ allocator()->deallocate(std::bit_cast<std::byte*>(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<utf8*>(allocResult.takeOkay());
+
+ auto* newData = std::bit_cast<utf8*>(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<std::byte*>(m_repr.large.data), m_repr.large.capacity);
+ allocator()->deallocate(std::bit_cast<std::byte*>(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<String> testStrings()
+{
+ Vector<String> stringList{Vector<String>::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<StringView> testStringViews()
+{
+ Vector<StringView> stringList{Vector<StringView>::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<String>::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<int, String> mapInt2String{};
for (int index = 0; index < static_cast<int>(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<String>::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<String, int> mapString2Int{};
for (int index = 0; index < static_cast<int>(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<String>::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<int, String> mapInt2String{};
for (int index = 0; index < static_cast<int>(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<StringView>::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<StringView, int> mapView2Int{};
- for (int index = 0; index < static_cast<int>(stringList.size()); ++index) {
- auto insertStatus = mapView2Int.insert(stringList[index], index);
+ for (int index = 0; index < static_cast<int>(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<int>(stringList.size()); ++index) {
+ for (int index = 0; index < static_cast<int>(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<Vector<Vector<FallibleObject>>, FudStatus>
}
+/*
TEST(VectorTest, WithElements)
{
auto vectorResult{Vector<int>::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