1 /* Copyright (c) 2015. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #ifndef SIMGRID_XBT_LIB_HPP
8 #define SIMGRID_XBT_LIB_HPP
20 static std::vector<void(*)(void*)> deleters_;
22 std::vector<void*> facets_;
24 static std::size_t add_level(void (*deleter)(void*))
26 std::size_t res = deleters_.size();
27 deleters_.push_back(deleter);
30 template<class U> static
31 std::size_t add_level()
33 return add_level([](void* p){ delete (U*)p; });
35 Lib() : facets_(deleters_.size(), nullptr) {}
38 for (std::size_t i = 0; i < facets_.size(); ++i)
39 if (facets_[i] != nullptr)
40 deleters_[i](facets_[i]);
43 // TODO, make type-safe versions of this
44 void* facet(std::size_t level)
46 if (level >= facets_.size())
49 return facets_.at(level);
51 void set_facet(std::size_t level, void* value, bool use_dtor = true)
53 if (level >= facets_.size())
54 facets_.resize(level + 1, nullptr);
55 void* old_value = this->facet(level);
56 facets_.at(level) = value;
57 if (use_dtor && old_value != nullptr && deleters_[level])
58 deleters_[level](old_value);
63 std::vector<void(*)(void*)> Lib<T>::deleters_ = {};