Heap.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include "I.hpp"
5 #include "../Basics/static_warning.hpp"
6 
7 namespace iv
8 {
9 
13 class Heap
14 {
15 public:
24  Heap( Instance * inst = nullptr, ClientMarker * cm = nullptr );
25  ~Heap();
26 
31  template< class T >
32  void destroy( T * );
33 
37  void clear();
38 
42  template< class T, class ... CArgs >
43  T * create( CArgs const & ... );
44 
54  template< class T, class ... CArgs >
55  T * createInstance( std::string const & name, CArgs const & ... );
56 
66  template< class T, class ... CArgs >
67  T * createClient( CArgs const & ... );
68 
69 private:
70  using Deleter = void(*)(void*);
71 
72  struct Item
73  {
74  void * identity;
75  Deleter deleter;
76 
77  Item() : identity( nullptr ), deleter( nullptr ){}
78  Item( void * i, Deleter d ) : identity( i ), deleter( d ){}
79  };
80 
81  template< class T >
82  static void DeleterImpl( void * ptr );
83 
84  template< class T, std::enable_if_t< std::is_polymorphic_v< T >, int > = 0 >
85  static void * identity_cast( T * ptr );
86 
87  template< class T, std::enable_if_t< !std::is_polymorphic_v< T >, int > = 0 >
88  static void * identity_cast( T * ptr );
89 
90 private:
91  Instance * inst;
92  ClientMarker * cm;
93  std::vector< Item > items;
94 };
95 
96 }
97 
98 #include "Heap.inl"