X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/31c0fb4e9b5d20d58c57f13b1bece0e6b94f4ac8..d4b2983abdd669bb8588fd8d455276d47266c51f:/include/xbt/Extendable.hpp diff --git a/include/xbt/Extendable.hpp b/include/xbt/Extendable.hpp index c85201fec6..8dbc3ab3d9 100644 --- a/include/xbt/Extendable.hpp +++ b/include/xbt/Extendable.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2019. The SimGrid Team. +/* Copyright (c) 2015-2023. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -7,24 +7,26 @@ #ifndef SIMGRID_XBT_LIB_HPP #define SIMGRID_XBT_LIB_HPP +#include "xbt/base.h" // XBT_ATTRIB_DEPRECATED_v334 #include +#include #include +#include #include -namespace simgrid { -namespace xbt { +namespace simgrid::xbt { template class Extension; template class Extendable; template class Extension { - static const std::size_t INVALID_ID = std::numeric_limits::max(); - std::size_t id_; + static constexpr std::size_t INVALID_ID = std::numeric_limits::max(); + std::size_t id_ = INVALID_ID; friend class Extendable; explicit constexpr Extension(std::size_t id) : id_(id) {} public: - explicit constexpr Extension() : id_(INVALID_ID) {} + explicit constexpr Extension() = default; std::size_t id() const { return id_; } bool valid() const { return id_ != INVALID_ID; } }; @@ -47,19 +49,16 @@ public: template class Extendable { private: - static std::vector deleters_; - std::vector extensions_; + 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)); } @@ -68,7 +67,7 @@ public: { return Extension(extension_create([](void* p) { delete static_cast(p); })); } - Extendable() : extensions_((deleters_.size() > 0 ? deleters_.size() : 1), nullptr) {} + Extendable() = default; Extendable(const Extendable&) = delete; Extendable& operator=(const Extendable&) = delete; ~Extendable() @@ -80,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]); } @@ -110,14 +109,20 @@ public: void set_data(void* data){ extensions_[0]=data; } - void* get_data() const { return extensions_[0]; } - // Convenience extension access when the type has a associated EXTENSION ID: + template D* get_data() const { return static_cast(extensions_[0]); } + template std::unique_ptr get_unique_data() { return std::unique_ptr(get_data()); } + + XBT_ATTRIB_DEPRECATED_v334("Please use typed template Extendable::get_data<>()") void* get_data() const + { + return get_data(); + } + // Convenience extension access when the type has an associated 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_; -} -} +// Initialized with a first element, to save space for void* user data +template std::vector> Extendable::deleters_{1}; +} // namespace simgrid::xbt #endif