-/* Copyright (c) 2015. The SimGrid Team.
+/* Copyright (c) 2015, 2017. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
static const std::size_t INVALID_ID = std::numeric_limits<std::size_t>::max();
std::size_t id_;
friend class Extendable<T>;
- constexpr Extension(std::size_t id) : id_(id) {}
+ explicit constexpr Extension(std::size_t id) : id_(id) {}
public:
explicit constexpr Extension() : id_(INVALID_ID) {}
std::size_t id() const { return id_; }
class Extendable {
private:
static std::vector<void(*)(void*)> deleters_;
-protected:
std::vector<void*> extensions_;
public:
static size_t extension_create(void (*deleter)(void*))
template<class U> static
Extension<T,U> extension_create()
{
- return extension_create([](void* p){ delete static_cast<U*>(p); });
+ return Extension<T, U>(extension_create([](void* p) { delete static_cast<U*>(p); }));
}
Extendable() : extensions_(deleters_.size(), nullptr) {}
~Extendable()
* 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]);
}