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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#ifndef GENERS_COMPLEXIO_HH_
#define GENERS_COMPLEXIO_HH_

#include <complex>

#include "Alignment/Geners/interface/IOIsContainer.hh"
#include "Alignment/Geners/interface/IOIsPOD.hh"
#include "Alignment/Geners/interface/binaryIO.hh"

#define gs_specialize_complex_read_write(T) /**/                                                                    \
  namespace gs {                                                                                                    \
    template <>                                                                                                     \
    inline void write_pod<std::complex<T>>(std::ostream & of, const std::complex<T> &s) {                           \
      write_pod(of, s.real());                                                                                      \
      write_pod(of, s.imag());                                                                                      \
    }                                                                                                               \
    template <>                                                                                                     \
    inline void read_pod<std::complex<T>>(std::istream & in, std::complex<T> *ps) {                                 \
      assert(ps);                                                                                                   \
      T re, im;                                                                                                     \
      read_pod(in, &re);                                                                                            \
      read_pod(in, &im);                                                                                            \
      *ps = std::complex<T>(re, im);                                                                                \
    }                                                                                                               \
    template <>                                                                                                     \
    inline void write_pod_array<std::complex<T>>(std::ostream & of,                                                 \
                                                 const std::complex<T> *pod,                                        \
                                                 const unsigned long len) {                                         \
      if (len) {                                                                                                    \
        assert(pod);                                                                                                \
        for (unsigned long i = 0; i < len; ++i)                                                                     \
          write_pod<std::complex<T>>(of, pod[i]);                                                                   \
      }                                                                                                             \
    }                                                                                                               \
    template <>                                                                                                     \
    inline void read_pod_array<std::complex<T>>(std::istream & in, std::complex<T> *pod, const unsigned long len) { \
      if (len) {                                                                                                    \
        assert(pod);                                                                                                \
        T re, im;                                                                                                   \
        for (unsigned long i = 0; i < len; ++i) {                                                                   \
          read_pod(in, &re);                                                                                        \
          read_pod(in, &im);                                                                                        \
          pod[i] = std::complex<T>(re, im);                                                                         \
        }                                                                                                           \
      }                                                                                                             \
    }                                                                                                               \
  }

gs_specialize_complex_read_write(float) gs_specialize_complex_read_write(double)
    gs_specialize_complex_read_write(long double)

        namespace gs {
  template <typename T>
  struct IOIsPOD<std::complex<T>> {
    enum { value = 1 };
  };

  template <typename T>
  struct IOIsPOD<const std::complex<T>> {
    enum { value = 1 };
  };

  template <typename T>
  struct IOIsPOD<volatile std::complex<T>> {
    enum { value = 1 };
  };

  template <typename T>
  struct IOIsPOD<const volatile std::complex<T>> {
    enum { value = 1 };
  };

  template <typename T>
  class IOIsContainer<std::complex<T>> {
  public:
    enum { value = 0 };
  };

  template <typename T>
  class IOIsContainer<const std::complex<T>> {
  public:
    enum { value = 0 };
  };

  template <typename T>
  class IOIsContainer<volatile std::complex<T>> {
  public:
    enum { value = 0 };
  };

  template <typename T>
  class IOIsContainer<const volatile std::complex<T>> {
  public:
    enum { value = 0 };
  };
}

gs_specialize_template_id_T(std::complex, 0, 1)

#endif  // GENERS_COMPLEXIO_HH_