friend class Extendable<T>;
constexpr Extension(std::size_t id) : id_(id) {}
public:
- constexpr Extension() : id_(INVALID_ID) {}
+ explicit constexpr Extension() : id_(INVALID_ID) {}
std::size_t id() const { return id_; }
bool valid() { return id_ != INVALID_ID; }
};
* with a notion of Host extended with another concept (such as mobility).
* You could completely externalize these data with an associative map Host->EnergyHost.
* It would work, provided that you implement this classical feature correctly (and it would induce a little performance penalty).
- * Instead, you should add a new facet to the Host class, that happens to be Facetable.
+ * Instead, you should add a new extension to the Host class, that happens to be Extendable.
*
*/
template<class T>
class Extendable {
private:
static std::vector<void(*)(void*)> deleters_;
-protected:
std::vector<void*> extensions_;
public:
static size_t extension_create(void (*deleter)(void*))
* an extension of B might need to have the extension of A around when executing
* its cleanup function/destructor. */
for (std::size_t i = extensions_.size(); i > 0; --i)
- if (extensions_[i - 1] != nullptr)
+ if (extensions_[i - 1] != nullptr && deleters_[i - 1] != nullptr)
deleters_[i - 1](extensions_[i - 1]);
}