54 using manager_t =
void* (*)(
uint8_t,
void*);
70 generic(
const generic& gen)
72 , _manage(gen._manage) {
74 _handle = _manage(op_clone, gen._handle);
81 generic(
generic&& gen)
82 : _handle(gen._handle)
83 , _manage(gen._manage) {
84 gen._handle =
nullptr;
85 gen._manage =
nullptr;
94 : _handle(new T(fennec::
forward<T>(x)))
95 , _manage(_manage_impl<T>) {
103 template<
typename T,
typename...ArgsT>
105 : _handle(new T(fennec::
forward<ArgsT>(args)...))
106 , _manage(_manage_impl<T>) {
119 return *
static_cast<fennec::type*
>(_manage(op_type,
nullptr));
122 bool has_value()
const {
123 return _handle !=
nullptr;
129 generic& operator=(
const generic& gen) {
135 _manage = gen._manage;
136 _handle = _manage(op_clone, gen._handle);
140 generic& operator=(
generic&& gen)
noexcept {
149 generic& operator=(T&& x) {
151 _handle =
new T(fennec::forward<T>(x));
152 _manage = _manage_impl<T>();
156 template<
typename T,
typename...ArgsT>
157 void emplace(ArgsT&&...args) {
159 _handle =
new T(fennec::forward<ArgsT>(args)...);
160 _manage = _manage_impl<T>;
165 _handle = _manage(op_destroy, _handle);
170 void swap(
generic& gen)
noexcept {
177 return *
static_cast<T*
>(_handle);
181 const T& cast()
const {
182 return *
static_cast<T*
>(_handle);
190 static void* _manage_impl(uint8_t op,
void* hnd) {
191 static fennec::type t = type::get<T>();