2
0
mirror of https://github.com/boostorg/mpi.git synced 2026-02-25 04:22:17 +00:00

Add send and recv overloads for std::vector.

This commit is contained in:
K. Noel Belcourt
2016-07-21 21:48:02 -06:00
parent 004df1037e
commit 85bb58d75b

View File

@@ -272,6 +272,15 @@ class BOOST_MPI_DECL communicator
template<typename T>
void send(int dest, int tag, const T& value) const;
template<typename T>
void send(int dest, int tag, const std::vector<T>& value) const;
template<typename T>
void send_vector(int dest, int tag, const std::vector<T>& value, mpl::true_) const;
template<typename T>
void send_vector(int dest, int tag, const std::vector<T>& value, mpl::false_) const;
/**
* @brief Send the skeleton of an object.
*
@@ -384,6 +393,17 @@ class BOOST_MPI_DECL communicator
template<typename T>
status recv(int source, int tag, T& value) const;
template<typename T>
status recv(int source, int tag, std::vector<T>& value) const;
template<typename T>
status recv_vector(int source, int tag, std::vector<T>& value
, mpl::true_) const;
template<typename T>
status recv_vector(int source, int tag, std::vector<T>& value
, mpl::false_) const;
/**
* @brief Receive a skeleton from a remote process.
*
@@ -1187,6 +1207,30 @@ communicator::array_send_impl(int dest, int tag, const T* values, int n,
send(dest, tag, oa);
}
template<typename T>
void communicator::send_vector(int dest, int tag, const std::vector<T>& value
, mpl::true_ true_type) const
{
// send the vector size
typename std::vector<T>::size_type size = value.size();
send(dest, tag, size);
// send the data
this->array_send_impl(dest, tag, value.data(), size, true_type);
}
template<typename T>
void communicator::send_vector(int dest, int tag, const std::vector<T>& value
, mpl::false_ false_type) const
{
this->send_impl(dest, tag, value, false_type);
}
template<typename T>
void communicator::send(int dest, int tag, const std::vector<T>& value) const
{
send_vector(dest, tag, value, is_mpi_datatype<T>());
}
// Array send must send the elements directly
template<typename T>
void communicator::send(int dest, int tag, const T* values, int n) const
@@ -1269,6 +1313,32 @@ communicator::array_recv_impl(int source, int tag, T* values, int n,
return stat;
}
template<typename T>
status communicator::recv_vector(int source, int tag, std::vector<T>& value
, mpl::true_ true_type) const
{
// receive the vector size
typename std::vector<T>::size_type size = 0;
recv(source, tag, size);
// size the vector
value.resize(size);
// receive the data
return this->array_recv_impl(source, tag, value.data(), size, true_type);
}
template<typename T>
status communicator::recv_vector(int source, int tag, std::vector<T>& value
, mpl::false_ false_type) const
{
return this->recv_impl(source, tag, value, false_type);
}
template<typename T>
status communicator::recv(int source, int tag, std::vector<T>& value) const
{
return recv_vector(source, tag, value, is_mpi_datatype<T>());
}
// Array receive must receive the elements directly into a buffer.
template<typename T>
status communicator::recv(int source, int tag, T* values, int n) const