-/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2010-2021. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
int refcount;
};
-typedef s_smpi_key_elem_t* smpi_key_elem;
+using smpi_key_elem = s_smpi_key_elem_t*;
namespace simgrid{
namespace smpi{
private:
std::unordered_map<int, void*> attributes_;
protected:
- std::unordered_map<int, void*>* attributes();
+ std::unordered_map<int, void*>& attributes() { return attributes_; }
+
public:
// Each subclass should have two members, as we want to separate the ones for Win, Comm, and Datatypes :
// static std::unordered_map<int, smpi_key_elem> keyvals_;
value->refcount=1;
*keyval = T::keyval_id_;
- T::keyvals_.insert({*keyval, value});
+ T::keyvals_.emplace(*keyval, value);
T::keyval_id_++;
return MPI_SUCCESS;
}
}else{
elem->refcount--;
}
+ *keyval = MPI_KEYVAL_INVALID;
return MPI_SUCCESS;
}
if(ret!=MPI_SUCCESS)
return ret;
}
- if(attributes()->empty())
+ if (attributes().empty())
return MPI_ERR_ARG;
- attributes()->erase(keyval);
+ attributes().erase(keyval);
return MPI_SUCCESS;
}
const s_smpi_key_elem_t* elem = T::keyvals_.at(keyval);
if(elem==nullptr)
return MPI_ERR_ARG;
- if(attributes()->empty()){
- *flag=0;
- return MPI_SUCCESS;
- }
- const auto& attribs = attributes();
- auto attr = attribs->find(keyval);
- if (attr != attribs->end()) {
+
+ auto attr = attributes().find(keyval);
+ if (attr != attributes().end()) {
*static_cast<void**>(attr_value) = attr->second;
*flag=1;
} else {
return MPI_ERR_ARG;
elem->refcount++;
int flag=0;
- auto p = attributes()->insert({keyval, attr_value});
- if (!p.second) {
+ auto p = attributes().emplace(keyval, attr_value);
+ if (not p.second) {
int ret = call_deleter<T>((T*)this, elem, keyval,p.first->second,&flag);
// overwrite previous value
p.first->second = attr_value;
}
template <typename T> void Keyval::cleanup_attr(){
- if (not attributes()->empty()) {
- int flag=0;
- for (auto const& it : attributes_) {
- auto elm = T::keyvals_.find(it.first);
- if (elm != T::keyvals_.end()) {
- smpi_key_elem elem = elm->second;
- if(elem != nullptr){
- call_deleter<T>((T*)this, elem, it.first,it.second,&flag);
- }
- } else {
- // already deleted, not a problem
- flag=0;
+ int flag = 0;
+ for (auto const& it : attributes()) {
+ auto elm = T::keyvals_.find(it.first);
+ if (elm != T::keyvals_.end()) {
+ smpi_key_elem elem = elm->second;
+ if (elem != nullptr) {
+ call_deleter<T>((T*)this, elem, it.first, it.second, &flag);
}
+ } else {
+ // already deleted, not a problem
+ flag = 0;
}
}
}