LeviLamina
Loading...
Searching...
No Matches
AnyObjBase.h
1#pragma once
2
3#include <memory>
4#include <type_traits>
5
6namespace ll::data {
7class AnyObjBase {
8protected:
9 template <class Obj>
10 static constexpr bool isLarge = sizeof(Obj) > Obj::smallObjSize || alignof(Obj) > alignof(std::max_align_t)
11 || !Obj::nothrowMove;
12
13 template <class Obj, class... Args>
14 static constexpr Obj*
15 constructImpl(void* to, Args&&... args) noexcept(std::is_nothrow_constructible_v<Obj, Args...>) {
16 if constexpr (isLarge<Obj>) {
17 return ::new Obj(std::forward<Args>(args)...);
18 } else {
19 return ::new (to) Obj(std::forward<Args>(args)...);
20 }
21 }
22 template <class Obj>
23 static constexpr void destroyImpl(Obj* self) noexcept {
24 if constexpr (isLarge<Obj>) {
25 delete self;
26 } else {
27 self->~Obj();
28 }
29 }
30
31public:
32 AnyObjBase() = default;
33 AnyObjBase(AnyObjBase const&) = delete;
34 AnyObjBase& operator=(AnyObjBase const&) = delete;
35
36 virtual ~AnyObjBase() = default;
37
38 virtual AnyObjBase* copy(void* to) const = 0;
39 virtual AnyObjBase* move(void* to) noexcept = 0;
40 virtual void tidy() noexcept = 0;
41};
42} // namespace ll::data
Definition AnyObjBase.h:7