47 template <
typename Type>
48 static inline size_t FastTypeId() {
49 static_assert(
sizeof(
char*) <=
sizeof(
size_t),
50 "ptr size too large for size_t");
54 static char dummy_var;
55 return reinterpret_cast<size_t>(&dummy_var);
64 for (
int i = cleanup_list_.size() - 1;
i >= 0; --
i) {
65 cleanup_list_[
i].reset();
73 explicit Model(std::string name) : name_(name) {}
103 template <
typename T>
109 template <
typename T>
128 template <
typename T>
130 const size_t type_id = FastTypeId<T>();
131 auto find = singletons_.find(type_id);
132 if (find != singletons_.end()) {
133 return static_cast<T*
>(find->second);
138 T* new_t = MyNew<T>(0);
139 singletons_[type_id] = new_t;
149 template <
typename T>
151 const auto& it = singletons_.find(FastTypeId<T>());
152 return it != singletons_.end() ?
static_cast<const T*
>(it->second)
159 template <
typename T>
161 const auto& it = singletons_.find(FastTypeId<T>());
162 return it != singletons_.end() ?
static_cast<T*
>(it->second) :
nullptr;
170 template <
typename T>
172 cleanup_list_.emplace_back(
new Delete<T>(t));
181 template <
typename T>
183 T* new_t = MyNew<T>(0);
193 template <
typename T>
195 const size_t type_id = FastTypeId<T>();
196 CHECK(!singletons_.contains(type_id));
197 singletons_[type_id] = non_owned_class;
200 const std::string&
Name()
const {
return name_; }
208 template <
typename T>
209 decltype(T(
static_cast<Model*
>(
nullptr)))* MyNew(
int) {
212 template <
typename T>
217 const std::string name_;
220 absl::flat_hash_map< size_t,
void*> singletons_;
222 struct DeleteInterface {
223 virtual ~DeleteInterface() =
default;
225 template <
typename T>
226 class Delete :
public DeleteInterface {
228 explicit Delete(T* t) : to_delete_(t) {}
229 ~Delete()
override =
default;
232 std::unique_ptr<T> to_delete_;
240 std::vector<std::unique_ptr<DeleteInterface>> cleanup_list_;