#ifndef MSP_DATAFILE_TYPE_H_
#define MSP_DATAFILE_TYPE_H_
-#include <msp/core/inttypes.h>
+#include <cstdint>
+#include <msp/core/meta.h>
#include <msp/strings/lexicalcast.h>
namespace Msp {
{
std::string name;
+ Symbol() = default;
+
template<typename T>
Symbol(const T &n): name(lexical_cast<std::string>(n)) { }
struct IntType
{
static const char signature = 'i';
- typedef Int64 Store;
+ typedef std::int64_t Store;
typedef Store Load;
};
0
};
-template<typename T>
-struct HasLoadType
+struct CheckLoadType: Sfinae
{
- struct Yes { char c[2]; };
- struct No { char c; };
-
- template<typename U>
- static Yes f(typename U::LoadType *);
- template<typename U>
- static No f(...);
-
- enum { value = (sizeof(f<T>(0))==sizeof(Yes)) };
+ template<typename T>
+ static Yes f(typename T::LoadType *);
+ using Sfinae::f;
};
+template<typename T>
+struct HasLoadType: Sfinae::Evaluate<CheckLoadType, T> { };
+
template<typename T, bool lt = HasLoadType<T>::value>
struct TypeInfo;
template<>
struct TypeInfo<unsigned long int, false>: IntType { };
-#if defined(_MSC_VER)
-template<>
-struct TypeInfo<__int64, false>: IntType { };
-
-template<>
-struct TypeInfo<unsigned __int64, false>: IntType { };
-#elif defined(__GNUC__)
template<>
struct TypeInfo<long long int, false>: IntType { };
template<>
struct TypeInfo<unsigned long long int, false>: IntType { };
-#endif
template<>
struct TypeInfo<float, false>: FloatType { };