+int Datatype::get_contents(int max_integers, int max_addresses, int max_datatypes, int* array_of_integers,
+ MPI_Aint* array_of_addresses, MPI_Datatype* array_of_datatypes) const
+{
+ if(contents_==nullptr)
+ return MPI_ERR_ARG;
+ if (static_cast<unsigned>(max_integers) < contents_->integers_.size())
+ return MPI_ERR_COUNT;
+ std::copy(begin(contents_->integers_), end(contents_->integers_), array_of_integers);
+ if (static_cast<unsigned>(max_addresses) < contents_->addresses_.size())
+ return MPI_ERR_COUNT;
+ std::copy(begin(contents_->addresses_), end(contents_->addresses_), array_of_addresses);
+ if (static_cast<unsigned>(max_datatypes) < contents_->datatypes_.size())
+ return MPI_ERR_COUNT;
+ std::copy(begin(contents_->datatypes_), end(contents_->datatypes_), array_of_datatypes);
+ std::for_each(begin(contents_->datatypes_), end(contents_->datatypes_), std::mem_fn(&Datatype::ref));
+ return MPI_SUCCESS;
+}
+
+int Datatype::get_envelope(int* num_integers, int* num_addresses, int* num_datatypes, int* combiner) const
+{
+ if(contents_==nullptr){
+ *num_integers = 0;
+ *num_addresses = 0;
+ *num_datatypes = 0;
+ *combiner = MPI_COMBINER_NAMED;
+ }else{
+ *num_integers = contents_->integers_.size();
+ *num_addresses = contents_->addresses_.size();
+ *num_datatypes = contents_->datatypes_.size();
+ *combiner = contents_->combiner_;
+ }
+ return MPI_SUCCESS;
+}
+