-int Datatype::attr_delete(int keyval){
- smpi_type_key_elem elem = keyvals_.at(keyval);
- if(elem==nullptr)
- return MPI_ERR_ARG;
- if(elem->delete_fn!=MPI_NULL_DELETE_FN){
- void * value = nullptr;
- int flag;
- if(this->attr_get(keyval, &value, &flag)==MPI_SUCCESS){
- int ret = elem->delete_fn(this, keyval, value, &flag);
- if(ret!=MPI_SUCCESS)
- return ret;
- }
- }
- if(attributes_==nullptr)
- return MPI_ERR_ARG;
-
- xbt_dict_remove_ext(attributes_, reinterpret_cast<const char*>(&keyval), sizeof(int));
- return MPI_SUCCESS;
-}
-
-
-int Datatype::attr_get(int keyval, void* attr_value, int* flag){
- smpi_type_key_elem elem = keyvals_.at(keyval);
- if(elem==nullptr)
- return MPI_ERR_ARG;
- if(attributes_==nullptr){
- *flag=0;
- return MPI_SUCCESS;
- }
- try {
- *static_cast<void**>(attr_value) = xbt_dict_get_ext(attributes_, reinterpret_cast<const char*>(&keyval), sizeof(int));
- *flag=1;
- }
- catch (xbt_ex& ex) {
- *flag=0;
- }
- return MPI_SUCCESS;
-}
-
-int Datatype::attr_put(int keyval, void* attr_value){
- smpi_type_key_elem elem = keyvals_.at(keyval);
- if(elem==nullptr)
- return MPI_ERR_ARG;
- int flag;
- void* value = nullptr;
- this->attr_get(keyval, &value, &flag);
- if(flag!=0 && elem->delete_fn!=MPI_NULL_DELETE_FN){
- int ret = elem->delete_fn(this, keyval, value, &flag);
- if(ret!=MPI_SUCCESS)
- return ret;
- }
- if(attributes_==nullptr)
- attributes_ = xbt_dict_new_homogeneous(nullptr);
-
- xbt_dict_set_ext(attributes_, reinterpret_cast<const char*>(&keyval), sizeof(int), attr_value, nullptr);
- return MPI_SUCCESS;
-}
-
-int Datatype::keyval_create(MPI_Type_copy_attr_function* copy_fn, MPI_Type_delete_attr_function* delete_fn, int* keyval, void* extra_state){
-
- smpi_type_key_elem value = (smpi_type_key_elem) xbt_new0(s_smpi_mpi_type_key_elem_t,1);
-
- value->copy_fn=copy_fn;
- value->delete_fn=delete_fn;
-
- *keyval = keyval_id_;
- keyvals_.insert({*keyval, value});
- keyval_id_++;
- return MPI_SUCCESS;
-}
-
-int Datatype::keyval_free(int* keyval){
- smpi_type_key_elem elem = keyvals_.at(*keyval);
- if(elem==0){
- return MPI_ERR_ARG;
- }
- keyvals_.erase(*keyval);
- xbt_free(elem);
- return MPI_SUCCESS;
-}
-
-