Files
revng-revng/tests/unit/UpcastablePointer.cpp
Alessandro Di Federico cfb47157b9 clang-tidy: readability-identifier-naming
This commit fixes all the non-compliance with our preliminary clang-tidy
configuration, which will be merged soon.
2022-01-07 09:18:05 +01:00

53 lines
1.5 KiB
C++

/// \file UpcastablePointer.cpp
/// \brief
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include "revng/ADT/UpcastablePointer.h"
// clang-format off
template<typename T>
concept UniquePtrLike = requires(T A, typename T::pointer B) {
std::is_pointer_v<typename T::pointer>;
typename T::element_type;
{ A.get() } -> same_as<typename T::pointer>;
{ A.reset(B) } -> same_as<void>;
{ T() };
{ T(B) };
};
// clang-format on
class TestClass {
public:
static bool classof(TestClass *) { return true; }
};
template<>
struct concrete_types_traits<TestClass> {
using type = std::tuple<TestClass>;
};
// Test UniquePtrLike
static_assert(UniquePtrLike<std::unique_ptr<int>>);
static_assert(not UniquePtrLike<TestClass>);
static_assert(UniquePtrLike<UpcastablePointer<TestClass>>);
static_assert(Upcastable<TestClass>);
// Test UpcastablePointerLike
static_assert(UpcastablePointerLike<TestClass *>);
static_assert(UpcastablePointerLike<std::unique_ptr<TestClass>>);
static_assert(UpcastablePointerLike<UpcastablePointer<TestClass>>);
static_assert(std::is_default_constructible_v<UpcastablePointer<TestClass>>);
static_assert(std::is_copy_assignable_v<UpcastablePointer<TestClass>>);
static_assert(std::is_copy_constructible_v<UpcastablePointer<TestClass>>);
static_assert(std::is_move_assignable_v<UpcastablePointer<TestClass>>);
static_assert(std::is_move_constructible_v<UpcastablePointer<TestClass>>);
int main() {
return 0;
}