Skip to content

Commit eb66665

Browse files
committed
Type/Traits
1 parent 97de7f7 commit eb66665

2 files changed

Lines changed: 52 additions & 10 deletions

File tree

modules/Type/Callable.mpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,79 @@ export namespace CppUtils::Type
77
template<class T>
88
struct CallableTrait;
99

10-
template<class Functor>
11-
requires requires { &Functor::operator(); }
12-
struct CallableTrait<Functor>: CallableTrait<decltype(&Functor::operator())>
13-
{};
14-
1510
template<class Return, class... Args>
16-
struct CallableTrait<Return(Args...)>
11+
struct SignatureTrait
1712
{
1813
using ReturnType = Return;
1914
using ArgumentsTypes = std::tuple<Args...>;
2015
};
2116

17+
template<class Return, class... Args>
18+
struct CallableTrait<Return(Args...)>: SignatureTrait<Return, Args...>
19+
{};
20+
21+
template<class Return, class... Args>
22+
struct CallableTrait<Return(Args...) noexcept>: SignatureTrait<Return, Args...>
23+
{};
24+
2225
template<class Return, class... Args>
2326
struct CallableTrait<Return (*)(Args...)>: CallableTrait<Return(Args...)>
2427
{};
2528

29+
template<class Return, class... Args>
30+
struct CallableTrait<Return (*)(Args...) noexcept>: CallableTrait<Return(Args...) noexcept>
31+
{};
32+
2633
template<class Object, class Return, class... Args>
2734
struct CallableTrait<Return (Object::*)(Args...)>: CallableTrait<Return(Args...)>
2835
{};
2936

37+
template<class Object, class Return, class... Args>
38+
struct CallableTrait<Return (Object::*)(Args...) const>: CallableTrait<Return(Args...)>
39+
{};
40+
3041
template<class Object, class Return, class... Args>
3142
struct CallableTrait<Return (Object::*)(Args...) &>: CallableTrait<Return(Args...)>
3243
{};
3344

45+
template<class Object, class Return, class... Args>
46+
struct CallableTrait<Return (Object::*)(Args...) const&>: CallableTrait<Return(Args...)>
47+
{};
48+
3449
template<class Object, class Return, class... Args>
3550
struct CallableTrait<Return (Object::*)(Args...) &&>: CallableTrait<Return(Args...)>
3651
{};
3752

3853
template<class Object, class Return, class... Args>
39-
struct CallableTrait<Return (Object::*)(Args...) const>: CallableTrait<Return(Args...)>
54+
struct CallableTrait<Return (Object::*)(Args...) const&&>: CallableTrait<Return(Args...)>
4055
{};
4156

4257
template<class Object, class Return, class... Args>
43-
struct CallableTrait<Return (Object::*)(Args...) const&>: CallableTrait<Return(Args...)>
58+
struct CallableTrait<Return (Object::*)(Args...) noexcept>: CallableTrait<Return(Args...) noexcept>
4459
{};
4560

4661
template<class Object, class Return, class... Args>
47-
struct CallableTrait<Return (Object::*)(Args...) const&&>: CallableTrait<Return(Args...)>
62+
struct CallableTrait<Return (Object::*)(Args...) const noexcept>: CallableTrait<Return(Args...) noexcept>
63+
{};
64+
65+
template<class Object, class Return, class... Args>
66+
struct CallableTrait<Return (Object::*)(Args...) & noexcept>: CallableTrait<Return(Args...) noexcept>
67+
{};
68+
69+
template<class Object, class Return, class... Args>
70+
struct CallableTrait<Return (Object::*)(Args...) const & noexcept>: CallableTrait<Return(Args...) noexcept>
71+
{};
72+
73+
template<class Object, class Return, class... Args>
74+
struct CallableTrait<Return (Object::*)(Args...) && noexcept>: CallableTrait<Return(Args...) noexcept>
75+
{};
76+
77+
template<class Object, class Return, class... Args>
78+
struct CallableTrait<Return (Object::*)(Args...) const && noexcept>: CallableTrait<Return(Args...) noexcept>
79+
{};
80+
81+
template<class Functor>
82+
requires requires { &Functor::operator(); }
83+
struct CallableTrait<Functor>: CallableTrait<decltype(&Functor::operator())>
4884
{};
4985
}

modules/Type/Concept.mpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,13 @@ export namespace CppUtils::Type
5959
concept TriviallyCopyable = std::is_trivially_copyable_v<T>;
6060

6161
template<class T>
62-
concept Trivial = TriviallyConstructible<T> and TriviallyDestructible<T> and TriviallyCopyable<T>;
62+
concept TriviallyMoveConstructible = std::is_trivially_move_constructible_v<T>;
63+
64+
template<class T>
65+
concept TriviallyMoveAssignable = std::is_trivially_move_assignable_v<T>;
66+
67+
template<class T>
68+
concept Trivial = TriviallyConstructible<T> and TriviallyDestructible<T> and TriviallyCopyable<T> and TriviallyMoveConstructible<T> and TriviallyMoveAssignable<T>;
6369

6470
template<class Function, class... Args>
6571
concept Callable = std::invocable<Function, Args...>;

0 commit comments

Comments
 (0)