X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5864abe6c82acc9c85607864fbbc9b873392162e..e71a2a302d28430dc1bfee906f842f5f3d0fa3ce:/include/xbt/Extendable.hpp diff --git a/include/xbt/Extendable.hpp b/include/xbt/Extendable.hpp index 37946b6958..6f8e0fc6aa 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-2021. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -19,12 +19,12 @@ 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; } }; @@ -48,10 +48,14 @@ template class Extendable { private: static std::vector deleters_; - std::vector extensions_; + std::vector extensions_{std::max(1, deleters_.size()), nullptr}; + public: static size_t extension_create(void (*deleter)(void*)) { + if (deleters_.empty()) { // Save space for void* user data + deleters_.push_back(nullptr); + } deleters_.push_back(deleter); return deleters_.size() - 1; } @@ -65,7 +69,7 @@ public: { return Extension(extension_create([](void* p) { delete static_cast(p); })); } - Extendable() : extensions_(deleters_.size(), nullptr) {} + Extendable() = default; Extendable(const Extendable&) = delete; Extendable& operator=(const Extendable&) = delete; ~Extendable() @@ -76,7 +80,7 @@ public: * an extension A, the subsystem of B might depend on the subsystem on A and * 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) + 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) deleters_[i - 1](extensions_[i - 1]); } @@ -103,8 +107,12 @@ public: { extension_set(rank.id(), value, use_dtor); } - - // Convenience extension access when the type has a associated EXTENSION ID: + // void* version, for C users and nostalgics + void set_data(void* data){ + extensions_[0]=data; + } + void* get_data() const { return extensions_[0]; } + // 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); } };