Skip to content
Snippets Groups Projects
Commit e1243344 authored by Michal Strnad's avatar Michal Strnad
Browse files

Issue #33 - Add tests

parent 8473f8d5
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 2018-2019 CZ.NIC, z. s. p. o.
* Copyright (C) 2018-2024 CZ.NIC, z. s. p. o.
*
* This file is part of FRED.
*
......@@ -48,7 +48,7 @@ U make_uuid_from_string(const std::string& src)
{
try
{
static_assert(std::is_same<decltype(get_raw_value_from(U())), boost::uuids::uuid&&>::value,
static_assert(std::is_same<std::decay_t<decltype(get_raw_value_from(std::declval<U>()))>, boost::uuids::uuid>::value,
"U must be strong type based on boost uuid");
return Util::make_strong<U>(boost::uuids::string_generator()(src));
}
......
/*
* Copyright (C) 2018-2019 CZ.NIC, z. s. p. o.
* Copyright (C) 2018-2024 CZ.NIC, z. s. p. o.
*
* This file is part of FRED.
*
......@@ -29,9 +29,6 @@ namespace Util {
template <typename Type, typename Name> class StrongType;
template <typename N, typename T>
constexpr N make_strong(const T&);
template <typename N, typename T>
constexpr N make_strong(T&&);
......@@ -39,7 +36,7 @@ template <typename T, typename N>
constexpr const T& get_raw_value_from(const StrongType<T, N>&);
template <typename T, typename N>
T&& get_raw_value_from(StrongType<T, N>&&);
constexpr T get_raw_value_from(StrongType<T, N>&&);
template <typename T, typename N>
class StrongType
......@@ -54,34 +51,28 @@ public:
StrongType& operator=(StrongType&&) = default;
private:
explicit constexpr StrongType(const T& src) : value_(src) { }
explicit StrongType(T&& src) : value_(std::move(src)) { }
explicit constexpr StrongType(T&& src) : value_(std::move(src)) { }
StrongType& operator=(const T& src) { value_ = src; return *this; }
StrongType& operator=(T&& src) { std::swap(value_, src); return *this; }
T value_;
friend StrongType make_strong<>(const T&);
friend StrongType make_strong<>(T&&);
friend const T& get_raw_value_from<>(const StrongType&);
friend T&& get_raw_value_from<>(StrongType&&);
template <typename S, typename Type>
friend constexpr S make_strong(Type&&);
template <typename Type, typename Name>
friend constexpr const Type& get_raw_value_from(const StrongType<Type, Name>&);
template <typename Type, typename Name>
friend constexpr Type get_raw_value_from(StrongType<Type, Name>&&);
friend std::ostream& operator<<(std::ostream& out, const StrongType& src)
{
return out << src.value_;
}
};
template <typename N, typename T>
constexpr N make_strong(const T& src)
{
static_assert(std::is_same<decltype(get_raw_value_from(N())), T&&>::value,
"N must be strong type based on T");
return N(src);
}
template <typename N, typename T>
constexpr N make_strong(T&& src)
template <typename S, typename T>
constexpr S make_strong(T&& src)
{
static_assert(std::is_same<decltype(get_raw_value_from(N())), T&&>::value,
"N must be strong type based on T");
return N(std::move(src));
static_assert(std::is_same<std::decay_t<decltype(get_raw_value_from(std::declval<S>()))>, std::decay_t<T>>::value,
"S must be strong type based on T");
return S{std::forward<T>(src)};
}
template <typename T, typename N>
......@@ -99,7 +90,7 @@ constexpr const T& get_raw_value_from(const StrongType<T, N>& src)
}
template <typename T, typename N>
T&& get_raw_value_from(StrongType<T, N>&& src)
constexpr T get_raw_value_from(StrongType<T, N>&& src)
{
return std::move(src.value_);
}
......@@ -107,15 +98,15 @@ T&& get_raw_value_from(StrongType<T, N>&& src)
template <typename S, typename T, typename N>
S strong_type_cast(const StrongType<T, N>& src)
{
static_assert(std::is_same<decltype(get_raw_value_from(S())), T&&>::value,
static_assert(std::is_same<decltype(get_raw_value_from(S())), const T&>::value,
"S must be strong type based on T");
return Util::make_strong<S>(get_raw_value_from(src));
}
template <typename S, typename T, typename N>
S strong_type_cast(StrongType<T, N>&& src)
S strong_type_cast(StrongType<T, N> src)
{
static_assert(std::is_same<decltype(get_raw_value_from(S())), T&&>::value,
static_assert(std::is_same<decltype(get_raw_value_from(S())), T>::value,
"S must be strong type based on T");
return Util::make_strong<S>(get_raw_value_from(std::move(src)));
}
......
......@@ -70,6 +70,7 @@ add_executable(test-libfred
test/libfred/test_is_registered.cc
test/libfred/test_opcontext_by_libpg.cc
test/libfred/test_opexception.cc
test/libfred/test_state_history.cc
# test/libfred/contact/test_contact_history.cc
# test/libfred/contact/test_contact_state.cc
test/libfred/contact/test_copy_contact.cc
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment