Utility: add notnull
All checks were successful
CI & Unit Tests / Unit-Tests (push) Successful in 1m34s
All checks were successful
CI & Unit Tests / Unit-Tests (push) Successful in 1m34s
This commit is contained in:
parent
0271b0d0de
commit
a7495db03f
@ -32,6 +32,7 @@ add_executable(tests
|
||||
bytes.cpp
|
||||
filters.cpp
|
||||
cpptick.cpp
|
||||
notnull.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(tests
|
||||
|
||||
59
Tests/notnull.cpp
Normal file
59
Tests/notnull.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
//
|
||||
// Created by erki on 25/10/23.
|
||||
//
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
|
||||
#include <atomic>
|
||||
|
||||
#ifdef NDEBUG
|
||||
#undef NDEBUG
|
||||
#define NDEBUG_WAS_DEFINED
|
||||
#endif
|
||||
|
||||
#include "utility_assert.hpp"
|
||||
#include "utility_notnull.hpp"
|
||||
|
||||
#ifdef NDEBUG_WAS_DEFINED
|
||||
#define NDEBUG
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
std::atomic<bool> assert_flag = false;
|
||||
|
||||
void assertCallback(const char*, const char*, const int)
|
||||
{
|
||||
assert_flag = true;
|
||||
}
|
||||
|
||||
}// namespace
|
||||
|
||||
TEST_CASE("Assert is tripped if nullptr passed.", "[utility],[notnull]")
|
||||
{
|
||||
assert_flag = false;
|
||||
Utility::Assert::setHandler(assertCallback);
|
||||
REQUIRE(assert_flag == false);
|
||||
|
||||
auto call = [](Utility::NotNull<int> i) -> void {};
|
||||
|
||||
call(nullptr);
|
||||
CHECK(assert_flag == true);
|
||||
}
|
||||
|
||||
TEST_CASE("Assert is not tripped if valid pointer is passed.", "[utility],[notnull]")
|
||||
{
|
||||
assert_flag = false;
|
||||
Utility::Assert::setHandler(assertCallback);
|
||||
REQUIRE(assert_flag == false);
|
||||
|
||||
auto call = [](Utility::NotNull<int> i) -> int {
|
||||
return *i;
|
||||
};
|
||||
|
||||
int a = 5;
|
||||
const int test = call(&a);
|
||||
CHECK(assert_flag == false);
|
||||
CHECK(a == test);
|
||||
}
|
||||
51
Utility/Inc/utility_notnull.hpp
Normal file
51
Utility/Inc/utility_notnull.hpp
Normal file
@ -0,0 +1,51 @@
|
||||
//
|
||||
// Created by erki on 25/10/23.
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "utility_assert.hpp"
|
||||
|
||||
namespace Utility
|
||||
{
|
||||
|
||||
template<typename T>
|
||||
struct NotNull
|
||||
{
|
||||
NotNull(T* ptr)
|
||||
: ptr_(ptr)
|
||||
{
|
||||
SKULLC_ASSERT_DEBUG(ptr_ != nullptr);
|
||||
}
|
||||
|
||||
NotNull() = delete;
|
||||
NotNull(const NotNull&) = delete;
|
||||
NotNull(NotNull&&) = delete;
|
||||
NotNull& operator=(const NotNull&) = delete;
|
||||
NotNull& operator=(NotNull&&) = delete;
|
||||
|
||||
const T& operator*() const
|
||||
{
|
||||
return *ptr_;
|
||||
}
|
||||
|
||||
T& operator*()
|
||||
{
|
||||
return *ptr_;
|
||||
}
|
||||
|
||||
const T* operator->() const noexcept
|
||||
{
|
||||
return ptr_;
|
||||
}
|
||||
|
||||
T* operator->() noexcept
|
||||
{
|
||||
return ptr_;
|
||||
}
|
||||
|
||||
private:
|
||||
T* ptr_;
|
||||
};
|
||||
|
||||
}// namespace Utility
|
||||
Loading…
x
Reference in New Issue
Block a user