Program Listing for File diploid.hpp¶
↰ Return to documentation for file (fwdpp/io/diploid.hpp)
#ifndef FWDPP_IO_DIPLOID_HPP__
#define FWDPP_IO_DIPLOID_HPP__
#include <cstdint>
#include <fwdpp/type_traits.hpp>
#include <fwdpp/meta/always_false.hpp>
#include "scalar_serialization.hpp"
// This file relies on std::uint32_t == fwdpp::uint_t,
// which prevents us from having to include that header.
namespace fwdpp
{
namespace io
{
template <typename T> struct serialize_diploid
{
template <typename ostreamtype>
inline void
operator()(ostreamtype &, const T &) const
{
static_assert(meta::always_false<T>::value,
"fwdpp::io::serialize_diploid not implemented "
"for this type");
}
};
template <>
struct serialize_diploid<std::pair<std::uint32_t, std::uint32_t>>
{
io::scalar_writer writer;
serialize_diploid() : writer{} {}
template <typename ostreamtype>
inline void
operator()(
ostreamtype &buffer,
const std::pair<std::uint32_t, std::uint32_t> &dip) const
{
writer(buffer, &dip.first);
writer(buffer, &dip.second);
}
};
template <>
struct serialize_diploid<std::pair<std::size_t, std::size_t>>
{
io::scalar_writer writer;
serialize_diploid() : writer{} {}
template <typename ostreamtype>
inline void
operator()(ostreamtype &buffer,
const std::pair<std::size_t, std::size_t> &dip) const
{
writer(buffer, &dip.first);
writer(buffer, &dip.second);
}
};
template <typename T> struct deserialize_diploid
{
template <typename istreamtype>
inline void
operator()(istreamtype &, T &) const
{
static_assert(meta::always_false<T>::value,
"fwdpp::io::deserialize_diploid not implemented "
"for this type");
}
};
template <>
struct deserialize_diploid<std::pair<std::uint32_t, std::uint32_t>>
{
template <typename istreamtype>
inline void
operator()(istreamtype &buffer,
std::pair<std::uint32_t, std::uint32_t> &dip) const
{
io::scalar_reader reader;
std::uint32_t c;
reader(buffer, &c);
dip.first = c;
reader(buffer, &c);
dip.second = c;
}
};
template <>
struct deserialize_diploid<std::pair<std::size_t, std::size_t>>
{
template <typename istreamtype>
inline void
operator()(istreamtype &buffer,
std::pair<std::size_t, std::size_t> &dip) const
{
io::scalar_reader reader;
std::size_t c;
reader(buffer, &c);
dip.first = c;
reader(buffer, &c);
dip.second = c;
}
};
template <typename dipvector_t, typename ostreamtype>
void
write_diploids(ostreamtype &buffer, const dipvector_t &diploids)
{
static_assert(
traits::is_diploid<typename dipvector_t::value_type>::value,
"dipvector_t must be a container of diploids");
std::size_t NDIPS = diploids.size();
io::scalar_writer writer;
writer(buffer, &NDIPS);
io::serialize_diploid<typename dipvector_t::value_type> dipwriter;
for (const auto &dip : diploids)
{
dipwriter(buffer, dip);
}
}
template <typename dipvector_t, typename istreamtype>
void
read_diploids(istreamtype &buffer, dipvector_t &diploids)
{
static_assert(
traits::is_diploid<typename dipvector_t::value_type>::value,
"dipvector_t must be a container of diploids");
std::size_t NDIPS;
io::scalar_reader reader;
reader(buffer, &NDIPS);
diploids.resize(NDIPS);
io::deserialize_diploid<typename dipvector_t::value_type>
dipreader;
for (auto &dip : diploids)
{
dipreader(buffer, dip);
}
}
}
}
#endif