hdf5_oprimitive::write_hdf5_dataset
(
    float const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype float_type(H5T_NATIVE_FLOAT);
    write_dataset_basic(t, data_count, float_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    long double const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype double_type(H5T_NATIVE_LDOUBLE);
    write_dataset_basic(t, data_count, double_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    unsigned long long const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype long_type(H5T_NATIVE_ULLONG);
    write_dataset_basic(t, data_count, long_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    unsigned short const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype short_type(H5T_NATIVE_USHORT);
    write_dataset_basic(t, data_count, short_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    int const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype int_type(H5T_NATIVE_INT);
    write_dataset_basic(t, data_count, int_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    signed char const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype char_type(H5T_NATIVE_SCHAR);
    write_dataset_basic(t, data_count, char_type, object_number);
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
hdf5_oprimitive::write_hdf5_dataset
(
    double const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype double_type(H5T_NATIVE_DOUBLE);
    write_dataset_basic(t, data_count, double_type, object_number);
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
hdf5_oprimitive::write_hdf5_dataset
(
    long long const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype long_type(H5T_NATIVE_LLONG);
    write_dataset_basic(t, data_count, long_type, object_number);
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
hdf5_oprimitive::write_hdf5_dataset
(
    short const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype short_type(H5T_NATIVE_SHORT);
    write_dataset_basic(t, data_count, short_type, object_number);
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
hdf5_oprimitive::write_hdf5_dataset
(
    unsigned int const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype int_type(H5T_NATIVE_UINT);
    write_dataset_basic(t, data_count, int_type, object_number);
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
hdf5_oprimitive::write_hdf5_dataset
(
    char const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype char_type(H5T_NATIVE_CHAR);
    write_dataset_basic(t, data_count, char_type, object_number);
}
hdf5_oprimitive::write_hdf5_dataset
(
    const std::string *t,
    std::size_t data_count,
    std::size_t object_number
)
{
    BOOST_ASSERT(data_count == 1);
    char const* c_string = t->c_str();

    hdf5_datatype string_type(H5T_STRING);
    if(use_variable_length_strings_ || t->empty()) {
        string_type.resize(H5T_VARIABLE);
        write_dataset_basic(&c_string, data_count, string_type, object_number);
    }
    else {
        string_type.resize(t->size());
        write_dataset_basic(c_string, data_count, string_type, object_number);
    }

    string_type.close();
}
hdf5_oprimitive::write_hdf5_dataset
(
    bool const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    hdf5_datatype bool_type(H5T_NATIVE_CHAR);
    bool_type.resize(sizeof(bool));

    write_dataset_basic(t, data_count, bool_type, object_number);
    bool_type.close();
}
hdf5_oprimitive::write_hdf5_binary_dataset(
    void const* address,
    std::size_t data_count,
    std::size_t object_number
)
{
    // define the datatype
    hdf5_datatype datatype(H5T_OPAQUE);
    datatype.resize(data_count);

    write_dataset_basic(address, 1, datatype, object_number);

    // end access to the datatype and release resources.
    datatype.close();
}
hdf5_oprimitive::write_hdf5_dataset
(
    boost::serialization::collection_size_type const* t,
    std::size_t data_count,
    std::size_t object_number
)
{
    BOOST_STATIC_ASSERT(sizeof(size_t) <= sizeof(hsize_t));

    hsize_t i = *t;
    // paranoid and perhaps unnecessary checking...
    BOOST_ASSERT(boost::serialization::collection_size_type(i) == *t);

    hdf5_datatype size_type(H5T_NATIVE_HSIZE);
    write_dataset_basic(&i, data_count, size_type, object_number);
}