X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2807fde4fd1f59c230d69a934634c5dfb77905f2..HEAD:/src/smpi/include/smpi_f2c.hpp diff --git a/src/smpi/include/smpi_f2c.hpp b/src/smpi/include/smpi_f2c.hpp index 03d8908047..344c838ccc 100644 --- a/src/smpi/include/smpi_f2c.hpp +++ b/src/smpi/include/smpi_f2c.hpp @@ -1,6 +1,6 @@ -/* Handle Fortan - C conversion for MPI Types*/ +/* Handle Fortran - C conversion for MPI Types*/ -/* Copyright (c) 2010, 2013-2017. The SimGrid Team. +/* Copyright (c) 2010-2023. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -9,43 +9,55 @@ #ifndef SMPI_F2C_HPP_INCLUDED #define SMPI_F2C_HPP_INCLUDED +#include #include +#include -#define KEY_SIZE (sizeof(int) * 2 + 1) - -namespace simgrid{ -namespace smpi{ +namespace simgrid::smpi { class F2C { - private: - // We use a single lookup table for every type. - // Beware of collisions if id in mpif.h is not unique - static std::unordered_map* f2c_lookup_; - static int f2c_id_; - protected: - static std::unordered_map* f2c_lookup(); - static void set_f2c_lookup(std::unordered_map* map); - static int f2c_id(); - static void f2c_id_increment(); - public: - static char* get_key(char* key, int id); - static char* get_key_id(char* key, int id); - static void delete_lookup(); - static std::unordered_map* lookup(); - - virtual ~F2C() = default; - - //Override these to handle specific values. - virtual int add_f(); - static void free_f(int id); - virtual int c2f(); - - // This method should be overridden in all subclasses to avoid casting the result when calling it. - // For the default one, the MPI_*_NULL returned is assumed to be NULL. - static F2C* f2c(int id); +private: + using f2c_lookup_type = std::unordered_map; + + // We use a single lookup table for every type. + // Beware of collisions if id in mpif.h is not unique + static std::unique_ptr f2c_lookup_; + static int f2c_id_; + static f2c_lookup_type::size_type num_default_handles_; + int my_f2c_id_ = -1; + bool deleted_ = false; + std::string call_location_; + +protected: + static void allocate_lookup() + { + if (not f2c_lookup_) + f2c_lookup_ = std::make_unique(); + } + int f2c_id() const { return my_f2c_id_; } + static int global_f2c_id() { return f2c_id_; } + static void f2c_id_increment() { f2c_id_++; } + +public: + void mark_as_deleted() { deleted_ = true; }; + bool deleted() const { return deleted_; } + static f2c_lookup_type* lookup() { return f2c_lookup_.get(); } + F2C(); + virtual ~F2C() = default; + virtual std::string name() const = 0; + + int add_f(); + static void free_f(int id) { if(id!=-1) f2c_lookup_->erase(id); } + int c2f(); + + // This method should be overridden in all subclasses to avoid casting the result when calling it. + // For the default one, the MPI_*_NULL returned is assumed to be NULL. + static F2C* f2c(int id); + static void finish_initialization() { num_default_handles_ = f2c_lookup_->size(); } + static f2c_lookup_type::size_type get_num_default_handles() { return num_default_handles_; } + const std::string& call_location() const { return call_location_; } }; -} -} +} // namespace simgrid::smpi #endif