Iros
 
Loading...
Searching...
No Matches
out_of_line_vtable.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/util/get.h"
9
10namespace di::any {
12 template<typename Interface>
13 class Invoke;
14
15 template<typename... Methods>
17 class Invoke<meta::List<Methods...>> {
18 private:
20
21 template<typename Storage, typename T>
22 constexpr static auto method_table =
24
25 public:
26 template<typename Storage, concepts::AnyStorable<Storage> T>
27 constexpr static auto create_for() -> Invoke {
28 return Invoke(util::addressof(method_table<Storage, T>));
29 }
30
31 constexpr Invoke() { reset(); }
32
33 constexpr auto empty() const -> bool { return m_storage == nullptr; }
34 constexpr void reset() { m_storage = nullptr; }
35
36 template<concepts::OneOf<meta::Type<Methods>...> Method>
37 constexpr auto operator[](Method) const {
38 constexpr auto index = meta::Lookup<Method, meta::List<meta::Type<Methods>...>>;
39 return util::get<index>(*m_storage);
40 }
41
42 private:
43 constexpr Invoke(Storage const* storage) : m_storage(storage) {}
44
45 Storage const* m_storage;
46 };
47};
48}
Definition out_of_line_vtable.h:13
static constexpr auto create_for() -> Invoke
Definition out_of_line_vtable.h:27
constexpr auto empty() const -> bool
Definition out_of_line_vtable.h:33
constexpr Invoke()
Definition out_of_line_vtable.h:31
constexpr void reset()
Definition out_of_line_vtable.h:34
constexpr auto operator[](Method) const
Definition out_of_line_vtable.h:37
Definition tuple_forward_declaration.h:5
Definition method.h:8
Definition any.h:18
Definition merge_interfaces.h:6
T::Type Type
Definition core.h:26
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto make_tuple(Args &&... args)
Definition make_tuple.h:9
Definition out_of_line_vtable.h:11
Definition erased_call.h:15
Definition method.h:7