From a1c79cd127d9aefd9b96c7dae34721198f45aec8 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Wed, 9 Mar 2022 23:19:55 +0100 Subject: [PATCH] Use std::function for Extension deleters. --- include/xbt/Extendable.hpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/include/xbt/Extendable.hpp b/include/xbt/Extendable.hpp index 195f287556..698e80c4f0 100644 --- a/include/xbt/Extendable.hpp +++ b/include/xbt/Extendable.hpp @@ -9,6 +9,7 @@ #include "xbt/base.h" // XBT_ATTRIB_DEPRECATED_v334 #include +#include #include #include @@ -48,20 +49,16 @@ public: template class Extendable { private: - static std::vector deleters_; - std::vector extensions_{std::max(1, deleters_.size()), nullptr}; + static std::vector> deleters_; + std::vector extensions_{deleters_.size(), nullptr}; public: - static size_t extension_create(void (*deleter)(void*)) + static size_t extension_create(const std::function& deleter) { - if (deleters_.empty()) { // Save space for void* user data - deleters_.push_back(nullptr); - } - deleters_.push_back(deleter); + deleters_.emplace_back(deleter); return deleters_.size() - 1; } - template - static Extension extension_create(void (*deleter)(void*)) + template static Extension extension_create(const std::function& deleter) { return Extension(extension_create(deleter)); } @@ -82,7 +79,7 @@ public: * 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 > 1; --i) // rank=0 is the spot of user's void* - if (extensions_[i - 1] != nullptr && deleters_[i - 1] != nullptr) + if (extensions_[i - 1] != nullptr && deleters_[i - 1]) deleters_[i - 1](extensions_[i - 1]); } @@ -122,7 +119,8 @@ public: template void extension_set(U* p) { extension_set(U::EXTENSION_ID, p); } }; -template std::vector Extendable::deleters_; +// Initialized with a first element, to save space for void* user data +template std::vector> Extendable::deleters_{1}; } } -- 2.20.1