static const std::size_t INVALID_ID = std::numeric_limits<std::size_t>::max();
std::size_t id_;
friend class Extendable<T>;
static const std::size_t INVALID_ID = std::numeric_limits<std::size_t>::max();
std::size_t id_;
friend class Extendable<T>;
* 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)
* 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)
// Convenience extension access when the type has a associated EXTENSION ID:
template<class U> U* extension() { return extension<U>(U::EXTENSION_ID); }
template<class U> void extension_set(U* p) { extension_set<U>(U::EXTENSION_ID, p); }
// Convenience extension access when the type has a associated EXTENSION ID:
template<class U> U* extension() { return extension<U>(U::EXTENSION_ID); }
template<class U> void extension_set(U* p) { extension_set<U>(U::EXTENSION_ID, p); }