X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/22e6546d2c6f14864cc93c4ed1470d8e8c1e2d95..4d648ebbbe5705878080b9cbf1ca61497323c592:/include/xbt/Extendable.hpp diff --git a/include/xbt/Extendable.hpp b/include/xbt/Extendable.hpp index d90314d4c8..37a7d41c59 100644 --- a/include/xbt/Extendable.hpp +++ b/include/xbt/Extendable.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015. The SimGrid Team. +/* Copyright (c) 2015-2019. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -22,11 +22,11 @@ class Extension { static const std::size_t INVALID_ID = std::numeric_limits::max(); std::size_t id_; friend class Extendable; - 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_; } - bool valid() { return id_ != INVALID_ID; } + bool valid() const { return id_ != INVALID_ID; } }; /** An Extendable is an object that you can extend with external elements. @@ -48,7 +48,6 @@ template class Extendable { private: static std::vector deleters_; -protected: std::vector extensions_; public: static size_t extension_create(void (*deleter)(void*)) @@ -65,9 +64,11 @@ public: template static Extension extension_create() { - return extension_create([](void* p){ delete static_cast(p); }); + return Extension(extension_create([](void* p) { delete static_cast(p); })); } Extendable() : extensions_(deleters_.size(), nullptr) {} + Extendable(const Extendable&) = delete; + Extendable& operator=(const Extendable&) = delete; ~Extendable() { /* Call destructors in reverse order of their registrations @@ -82,7 +83,7 @@ public: } // Type-unsafe versions of the facet access methods: - void* extension(std::size_t rank) + void* extension(std::size_t rank) const { if (rank >= extensions_.size()) return nullptr; @@ -100,11 +101,7 @@ public: } // Type safe versions of the facet access methods: - template - U* extension(Extension rank) - { - return static_cast(extension(rank.id())); - } + template U* extension(Extension rank) const { return static_cast(extension(rank.id())); } template void extension_set(Extension rank, U* value, bool use_dtor = true) { @@ -112,13 +109,11 @@ public: } // Convenience extension access when the type has a associated EXTENSION ID: - template U* extension() { return extension(U::EXTENSION_ID); } + template U* extension() const { return extension(U::EXTENSION_ID); } template void extension_set(U* p) { extension_set(U::EXTENSION_ID, p); } }; -template -std::vector Extendable::deleters_ = {}; - +template std::vector Extendable::deleters_; } }