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_IOISNUMBER_HH_
#define GENERS_IOISNUMBER_HH_

namespace gs {
  template <class T>
  struct IOIsNumber {
    enum { value = 0 };
  };
}  // namespace gs

#define gs_declare_type_as_number(T) /**/ \
  namespace gs {                          \
    template <>                           \
    struct IOIsNumber<T> {                \
      enum { value = 1 };                 \
    };                                    \
    template <>                           \
    struct IOIsNumber<T const> {          \
      enum { value = 1 };                 \
    };                                    \
    template <>                           \
    struct IOIsNumber<T volatile> {       \
      enum { value = 1 };                 \
    };                                    \
    template <>                           \
    struct IOIsNumber<T const volatile> { \
      enum { value = 1 };                 \
    };                                    \
  }

gs_declare_type_as_number(float) gs_declare_type_as_number(double) gs_declare_type_as_number(long double)
    gs_declare_type_as_number(int) gs_declare_type_as_number(unsigned) gs_declare_type_as_number(long)
        gs_declare_type_as_number(long long) gs_declare_type_as_number(unsigned long)
            gs_declare_type_as_number(unsigned long long) gs_declare_type_as_number(short)
                gs_declare_type_as_number(unsigned short) gs_declare_type_as_number(char)
                    gs_declare_type_as_number(unsigned char) gs_declare_type_as_number(signed char)

#endif  // GENERS_IOISNUMBER_HH_