Skip to content

Commit

Permalink
Add rsl::Type
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisThrasher committed Nov 10, 2023
1 parent 5c0d774 commit eee954d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
24 changes: 24 additions & 0 deletions include/rsl/type.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

namespace rsl {

/** @file */

/**
* @brief Class template for creating strong type aliases
*
* @tparam T value type
* @tparam Tag Tag type to diambiguate separate type aliases
*/
template <typename T, typename Tag>
class Type {
T value_;

public:
constexpr explicit Type(const T& value) : value_(value) {}
[[nodiscard]] constexpr T& get() { return value_; }
[[nodiscard]] constexpr const T& get() const { return value_; }
[[nodiscard]] constexpr explicit operator T() const { return value_; }
};

} // namespace rsl
3 changes: 2 additions & 1 deletion tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ add_executable(test-rsl
random.cpp
static_string.cpp
static_vector.cpp
try.cpp)
try.cpp
type.cpp)
target_link_libraries(test-rsl PRIVATE
rsl::rsl
Catch2::Catch2WithMain
Expand Down
26 changes: 26 additions & 0 deletions tests/type.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#include <rsl/type.hpp>

#include <catch2/catch_test_macros.hpp>

TEST_CASE("rsl::Type") {
using StrongInt = rsl::Type<int, struct StrongIntTag>; // For testing constexpr support
using StrongString = rsl::Type<std::string, struct StringStringTag>; // For testing non-constexpr types

SECTION("Construction") {
constexpr auto strong_int = StrongInt(42);
STATIC_CHECK(strong_int.get() == 42);
STATIC_CHECK(int{strong_int} == 42);
STATIC_CHECK(int(strong_int) == 42);

auto const strong_string = StrongString("abcdefg");
CHECK(strong_string.get() == "abcdefg");
CHECK(std::string{strong_string} == "abcdefg");
CHECK(std::string(strong_string) == "abcdefg");
}

SECTION("get()") {
auto strong_int = StrongInt(1337);
strong_int.get() = 100;
CHECK(strong_int.get() == 100);
}
}

0 comments on commit eee954d

Please sign in to comment.