Skip to content

Commit

Permalink
providing automatic serializability to/fro streams only makes sense i…
Browse files Browse the repository at this point in the history
…f type's streamability is bidirectional.
  • Loading branch information
evaleev committed May 1, 2018
1 parent bb443fa commit 99aea9a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/madness/world/text_fstream_archive.h
Expand Up @@ -99,7 +99,7 @@ namespace madness {
/// \param[in] t Location of the data to be written.
/// \param[in] n The number of data items to be written.
template <class T>
typename std::enable_if< madness::is_ostreammable<T>::value >::type
typename std::enable_if< madness::is_iostreammable_v<T> >::type
store(const T* t, long n) const {
using madness::operator<<;
for (long i=0; i<n; ++i)
Expand Down Expand Up @@ -205,7 +205,7 @@ namespace madness {
/// \param[out] t Where to put the loaded data.
/// \param[in] n The number of data items to be loaded.
template <class T>
typename std::enable_if< madness::is_istreammable<T>::value >::type
typename std::enable_if< madness::is_iostreammable_v<T> >::type
load(T* t, long n) const {
for (long i=0; i<n; ++i) is >> t[i];
eat_eol();
Expand Down
8 changes: 6 additions & 2 deletions src/madness/world/type_traits.h
Expand Up @@ -93,11 +93,15 @@ using std::void_t;
struct is_ostreammable : std::false_type {};
template <typename T>
struct is_ostreammable<T, meta::void_t<decltype(std::declval<std::ostream&>() << std::declval<const T&>())>> : std::true_type {};
template <typename T> constexpr bool is_ostreammable_v = is_ostreammable<T>::value;
/// True for types that are "deserialiable" from an std::istream
template <typename T, typename = void>
struct is_istreammable : std::false_type {};
template <typename T>
struct is_istreammable<T, meta::void_t<decltype(std::declval<std::istream&>() >> std::declval<T&>())>> : std::true_type {};
template <typename T> constexpr bool is_istreammable_v = is_ostreammable<T>::value;
/// providing automatic support for serializing to/from std streams requires bidirectional streammability
template <typename T> constexpr bool is_iostreammable_v = is_istreammable_v<T> && is_ostreammable_v<T>;

template <typename T> constexpr bool is_always_serializable =
std::is_arithmetic<T>::value || \
Expand Down Expand Up @@ -137,9 +141,9 @@ using std::void_t;
template <typename T>
struct is_serializable<archive::VectorInputArchive, T, std::enable_if_t<is_trivially_serializable<T>::value>> : std::true_type {};
template <typename T>
struct is_serializable<archive::TextFstreamOutputArchive, T, std::enable_if_t<is_ostreammable<T>::value>> : std::true_type {};
struct is_serializable<archive::TextFstreamOutputArchive, T, std::enable_if_t<is_iostreammable_v<T>>> : std::true_type {};
template <typename T>
struct is_serializable<archive::TextFstreamInputArchive, T, std::enable_if_t<is_istreammable<T>::value>> : std::true_type {};
struct is_serializable<archive::TextFstreamInputArchive, T, std::enable_if_t<is_iostreammable_v<T>>> : std::true_type {};
template <typename T>
struct is_serializable<archive::MPIRawOutputArchive, T, std::enable_if_t<is_trivially_serializable<T>::value>> : std::true_type {};
template <typename T>
Expand Down

0 comments on commit 99aea9a

Please sign in to comment.