Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#ifndef GENERS_IOISPOD_HH_
#define GENERS_IOISPOD_HH_

#include "Alignment/Geners/interface/CPP11_type_traits.hh"

namespace gs {
  // In the following template, enum "IsPOD" is evaluated to 1
  // at compile time if T belongs to one of the known POD types.
  template <typename T>
  struct IOIsPOD {
    enum { value = std::is_standard_layout<T>::value && std::is_trivial<T>::value };
  };
}  // namespace gs

// Use the following macro (outside of any namespace)
// to declare some struct as POD for I/O purposes
//
#define gs_declare_type_as_pod(T) /**/ \
  namespace gs {                       \
    template <>                        \
    struct IOIsPOD<T> {                \
      enum { value = 1 };              \
    };                                 \
    template <>                        \
    struct IOIsPOD<T const> {          \
      enum { value = 1 };              \
    };                                 \
    template <>                        \
    struct IOIsPOD<T volatile> {       \
      enum { value = 1 };              \
    };                                 \
    template <>                        \
    struct IOIsPOD<T const volatile> { \
      enum { value = 1 };              \
    };                                 \
  }

#endif  // GENERS_IOISPOD_HH_