Iros
 
Loading...
Searching...
No Matches
clone.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/vocab.h"
6#include "di/util/create.h"
7
8namespace di::util {
9namespace detail {
10 struct CloneFunction;
11
12 template<typename T>
15
16 template<typename T>
17 concept MemberClonable = requires(T const& value) {
18 { value.clone() } -> concepts::MaybeFallible<T>;
19 };
20
22 template<typename T>
25 constexpr auto operator()(T const& value) const {
26 if constexpr (concepts::CopyConstructible<T>) {
27 return value;
28 } else if constexpr (CustomClonable<T>) {
29 return function::tag_invoke(*this, value);
30 } else if constexpr (MemberClonable<T>) {
31 return value.clone();
32 } else {
33 return util::create<T>(value);
34 }
35 }
36 };
37}
38
39constexpr inline auto clone = detail::CloneFunction {};
40}
41
42namespace di::concepts {
43template<typename T>
44concept Clonable = requires(T const& value) { util::clone(value); };
45}
46
47namespace di {
48using util::clone;
49}
Definition clone.h:44
Definition operations.h:34
Definition create.h:10
Definition vocab.h:74
Definition tag_invoke.h:33
Definition any_storable.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition clamp.h:9
Definition vocab.h:96
constexpr auto clone
Definition clone.h:39
constexpr auto create(Args &&... args)
Definition create.h:21
Definition zstring_parser.h:9
Definition clone.h:21