summaryrefslogtreecommitdiff
path: root/boost/mpi/skeleton_and_content.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/mpi/skeleton_and_content.hpp')
-rw-r--r--boost/mpi/skeleton_and_content.hpp330
1 files changed, 1 insertions, 329 deletions
diff --git a/boost/mpi/skeleton_and_content.hpp b/boost/mpi/skeleton_and_content.hpp
index dcd13bfe57..20fc135e23 100644
--- a/boost/mpi/skeleton_and_content.hpp
+++ b/boost/mpi/skeleton_and_content.hpp
@@ -25,338 +25,10 @@
#include <boost/mpi/config.hpp>
#include <boost/archive/detail/auto_link_archive.hpp>
-#include <boost/mpi/packed_iarchive.hpp>
-#include <boost/mpi/packed_oarchive.hpp>
-#include <boost/mpi/detail/forward_skeleton_iarchive.hpp>
-#include <boost/mpi/detail/forward_skeleton_oarchive.hpp>
-#include <boost/mpi/detail/ignore_iprimitive.hpp>
-#include <boost/mpi/detail/ignore_oprimitive.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/archive/detail/register_archive.hpp>
+#include <boost/mpi/skeleton_and_content_types.hpp>
namespace boost { namespace mpi {
-/**
- * @brief A proxy that requests that the skeleton of an object be
- * transmitted.
- *
- * The @c skeleton_proxy is a lightweight proxy object used to
- * indicate that the skeleton of an object, not the object itself,
- * should be transmitted. It can be used with the @c send and @c recv
- * operations of communicators or the @c broadcast collective. When a
- * @c skeleton_proxy is sent, Boost.MPI generates a description
- * containing the structure of the stored object. When that skeleton
- * is received, the receiving object is reshaped to match the
- * structure. Once the skeleton of an object as been transmitted, its
- * @c content can be transmitted separately (often several times)
- * without changing the structure of the object.
- */
-template <class T>
-struct BOOST_MPI_DECL skeleton_proxy
-{
- /**
- * Constructs a @c skeleton_proxy that references object @p x.
- *
- * @param x the object whose structure will be transmitted or
- * altered.
- */
- skeleton_proxy(T& x)
- : object(x)
- {}
-
- T& object;
-};
-
-/**
- * @brief Create a skeleton proxy object.
- *
- * This routine creates an instance of the skeleton_proxy class. It
- * will typically be used when calling @c send, @c recv, or @c
- * broadcast, to indicate that only the skeleton (structure) of an
- * object should be transmitted and not its contents.
- *
- * @param x the object whose structure will be transmitted.
- *
- * @returns a skeleton_proxy object referencing @p x
- */
-template <class T>
-inline const skeleton_proxy<T> skeleton(T& x)
-{
- return skeleton_proxy<T>(x);
-}
-
-namespace detail {
- /// @brief a class holding an MPI datatype
- /// INTERNAL ONLY
- /// the type is freed upon destruction
- class BOOST_MPI_DECL mpi_datatype_holder : public boost::noncopyable
- {
- public:
- mpi_datatype_holder()
- : is_committed(false)
- {}
-
- mpi_datatype_holder(MPI_Datatype t, bool committed = true)
- : d(t)
- , is_committed(committed)
- {}
-
- void commit()
- {
- BOOST_MPI_CHECK_RESULT(MPI_Type_commit,(&d));
- is_committed=true;
- }
-
- MPI_Datatype get_mpi_datatype() const
- {
- return d;
- }
-
- ~mpi_datatype_holder()
- {
- int finalized=0;
- BOOST_MPI_CHECK_RESULT(MPI_Finalized,(&finalized));
- if (!finalized && is_committed)
- BOOST_MPI_CHECK_RESULT(MPI_Type_free,(&d));
- }
-
- private:
- MPI_Datatype d;
- bool is_committed;
- };
-} // end namespace detail
-
-/** @brief A proxy object that transfers the content of an object
- * without its structure.
- *
- * The @c content class indicates that Boost.MPI should transmit or
- * receive the content of an object, but without any information
- * about the structure of the object. It is only meaningful to
- * transmit the content of an object after the receiver has already
- * received the skeleton for the same object.
- *
- * Most users will not use @c content objects directly. Rather, they
- * will invoke @c send, @c recv, or @c broadcast operations using @c
- * get_content().
- */
-class BOOST_MPI_DECL content
-{
-public:
- /**
- * Constructs an empty @c content object. This object will not be
- * useful for any Boost.MPI operations until it is reassigned.
- */
- content() {}
-
- /**
- * This routine initializes the @c content object with an MPI data
- * type that refers to the content of an object without its structure.
- *
- * @param d the MPI data type referring to the content of the object.
- *
- * @param committed @c true indicates that @c MPI_Type_commit has
- * already been excuted for the data type @p d.
- */
- content(MPI_Datatype d, bool committed=true)
- : holder(new detail::mpi_datatype_holder(d,committed))
- {}
-
- /**
- * Replace the MPI data type referencing the content of an object.
- *
- * @param d the new MPI data type referring to the content of the
- * object.
- *
- * @returns *this
- */
- const content& operator=(MPI_Datatype d)
- {
- holder.reset(new detail::mpi_datatype_holder(d));
- return *this;
- }
-
- /**
- * Retrieve the MPI data type that refers to the content of the
- * object.
- *
- * @returns the MPI data type, which should only be transmitted or
- * received using @c MPI_BOTTOM as the address.
- */
- MPI_Datatype get_mpi_datatype() const
- {
- return holder->get_mpi_datatype();
- }
-
- /**
- * Commit the MPI data type referring to the content of the
- * object.
- */
- void commit()
- {
- holder->commit();
- }
-
-private:
- boost::shared_ptr<detail::mpi_datatype_holder> holder;
-};
-
-/** @brief Returns the content of an object, suitable for transmission
- * via Boost.MPI.
- *
- * The function creates an absolute MPI datatype for the object,
- * where all offsets are counted from the address 0 (a.k.a. @c
- * MPI_BOTTOM) instead of the address @c &x of the object. This
- * allows the creation of MPI data types for complex data structures
- * containing pointers, such as linked lists or trees.
- *
- * The disadvantage, compared to relative MPI data types is that for
- * each object a new MPI data type has to be created.
- *
- * The contents of an object can only be transmitted when the
- * receiver already has an object with the same structure or shape as
- * the sender. To accomplish this, first transmit the skeleton of the
- * object using, e.g., @c skeleton() or @c skeleton_proxy.
- *
- * The type @c T has to allow creation of an absolute MPI data type
- * (content).
- *
- * @param x the object for which the content will be transmitted.
- *
- * @returns the content of the object @p x, which can be used for
- * transmission via @c send, @c recv, or @c broadcast.
- */
-template <class T> const content get_content(const T& x);
-
-/** @brief An archiver that reconstructs a data structure based on the
- * binary skeleton stored in a buffer.
- *
- * The @c packed_skeleton_iarchive class is an Archiver (as in the
- * Boost.Serialization library) that can construct the the shape of a
- * data structure based on a binary skeleton stored in a buffer. The
- * @c packed_skeleton_iarchive is typically used by the receiver of a
- * skeleton, to prepare a data structure that will eventually receive
- * content separately.
- *
- * Users will not generally need to use @c packed_skeleton_iarchive
- * directly. Instead, use @c skeleton or @c get_skeleton.
- */
-class BOOST_MPI_DECL packed_skeleton_iarchive
- : public detail::ignore_iprimitive,
- public detail::forward_skeleton_iarchive<packed_skeleton_iarchive,packed_iarchive>
-{
-public:
- /**
- * Construct a @c packed_skeleton_iarchive for the given
- * communicator.
- *
- * @param comm The communicator over which this archive will be
- * transmitted.
- *
- * @param flags Control the serialization of the skeleton. Refer to
- * the Boost.Serialization documentation before changing the
- * default flags.
- */
- packed_skeleton_iarchive(MPI_Comm const & comm,
- unsigned int flags = boost::archive::no_header)
- : detail::forward_skeleton_iarchive<packed_skeleton_iarchive,packed_iarchive>(skeleton_archive_)
- , skeleton_archive_(comm,flags)
- {}
-
- /**
- * Construct a @c packed_skeleton_iarchive that unpacks a skeleton
- * from the given @p archive.
- *
- * @param archive the archive from which the skeleton will be
- * unpacked.
- *
- */
- explicit packed_skeleton_iarchive(packed_iarchive & archive)
- : detail::forward_skeleton_iarchive<packed_skeleton_iarchive,packed_iarchive>(archive)
- , skeleton_archive_(MPI_COMM_WORLD, boost::archive::no_header)
- {}
-
- /**
- * Retrieve the archive corresponding to this skeleton.
- */
- const packed_iarchive& get_skeleton() const
- {
- return this->implementation_archive;
- }
-
- /**
- * Retrieve the archive corresponding to this skeleton.
- */
- packed_iarchive& get_skeleton()
- {
- return this->implementation_archive;
- }
-
-private:
- /// Store the actual archive that holds the structure, unless the
- /// user overrides this with their own archive.
- packed_iarchive skeleton_archive_;
-};
-
-/** @brief An archiver that records the binary skeleton of a data
- * structure into a buffer.
- *
- * The @c packed_skeleton_oarchive class is an Archiver (as in the
- * Boost.Serialization library) that can record the shape of a data
- * structure (called the "skeleton") into a binary representation
- * stored in a buffer. The @c packed_skeleton_oarchive is typically
- * used by the send of a skeleton, to pack the skeleton of a data
- * structure for transmission separately from the content.
- *
- * Users will not generally need to use @c packed_skeleton_oarchive
- * directly. Instead, use @c skeleton or @c get_skeleton.
- */
-class BOOST_MPI_DECL packed_skeleton_oarchive
- : public detail::ignore_oprimitive,
- public detail::forward_skeleton_oarchive<packed_skeleton_oarchive,packed_oarchive>
-{
-public:
- /**
- * Construct a @c packed_skeleton_oarchive for the given
- * communicator.
- *
- * @param comm The communicator over which this archive will be
- * transmitted.
- *
- * @param flags Control the serialization of the skeleton. Refer to
- * the Boost.Serialization documentation before changing the
- * default flags.
- */
- packed_skeleton_oarchive(MPI_Comm const & comm,
- unsigned int flags = boost::archive::no_header)
- : detail::forward_skeleton_oarchive<packed_skeleton_oarchive,packed_oarchive>(skeleton_archive_)
- , skeleton_archive_(comm,flags)
- {}
-
- /**
- * Construct a @c packed_skeleton_oarchive that packs a skeleton
- * into the given @p archive.
- *
- * @param archive the archive to which the skeleton will be packed.
- *
- */
- explicit packed_skeleton_oarchive(packed_oarchive & archive)
- : detail::forward_skeleton_oarchive<packed_skeleton_oarchive,packed_oarchive>(archive)
- , skeleton_archive_(MPI_COMM_WORLD, boost::archive::no_header)
- {}
-
- /**
- * Retrieve the archive corresponding to this skeleton.
- */
- const packed_oarchive& get_skeleton() const
- {
- return this->implementation_archive;
- }
-
-private:
- /// Store the actual archive that holds the structure.
- packed_oarchive skeleton_archive_;
-};
-
namespace detail {
typedef boost::mpi::detail::forward_skeleton_oarchive<boost::mpi::packed_skeleton_oarchive,boost::mpi::packed_oarchive> type1;
typedef boost::mpi::detail::forward_skeleton_iarchive<boost::mpi::packed_skeleton_iarchive,boost::mpi::packed_iarchive> type2;