]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/type.h
Add the target type to lexical_cast invocations
[libs/datafile.git] / source / type.h
index 5a87a10222a84794341d9a167c94786ae022927f..17545bae23ef0922669583344097a65c3e3e04cd 100644 (file)
@@ -1,13 +1,7 @@
-/* $Id$
-
-This file is part of libmspdatafile
-Copyright © 2010  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #ifndef MSP_DATAFILE_TYPE_H_
 #define MSP_DATAFILE_TYPE_H_
 
+#include <msp/core/inttypes.h>
 #include <msp/strings/lexicalcast.h>
 
 namespace Msp {
@@ -17,7 +11,8 @@ struct Symbol
 {
        std::string name;
 
-       Symbol(const std::string &n): name(n) { }
+       template<typename T>
+       Symbol(const T &n): name(lexical_cast<std::string>(n)) { }
 
        template<typename T> operator T() const { return lexical_cast<T>(name); }
 };
@@ -25,25 +20,29 @@ struct Symbol
 struct IntType
 {
        static const char signature = 'i';
-       typedef long long int Store;
+       typedef Int64 Store;
+       typedef Store Load;
 };
 
 struct FloatType
 {
        static const char signature = 'f';
        typedef double Store;
+       typedef Store Load;
 };
 
 struct BoolType
 {
        static const char signature = 'b';
        typedef bool Store;
+       typedef Store Load;
 };
 
 struct StringType
 {
        static const char signature = 's';
        typedef std::string Store;
+       typedef Store Load;
 };
 
 struct SymbolType
@@ -53,50 +52,96 @@ struct SymbolType
        typedef Symbol Store;
 };
 
+const char valid_signatures[] =
+{
+       IntType::signature,
+       FloatType::signature,
+       BoolType::signature,
+       StringType::signature,
+       SymbolType::signature,
+       0
+};
+
 template<typename T>
-struct TypeInfo: SymbolType { };
+struct HasLoadType
+{
+       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, bool lt = HasLoadType<T>::value>
+struct TypeInfo;
+
+template<>
+struct TypeInfo<short int, false>: IntType { };
+
+template<>
+struct TypeInfo<unsigned short int, false>: IntType { };
 
 template<>
-struct TypeInfo<short int>: IntType { };
+struct TypeInfo<int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned short int>: IntType { };
+struct TypeInfo<unsigned int, false>: IntType { };
 
 template<>
-struct TypeInfo<int>: IntType { };
+struct TypeInfo<long int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned int>: IntType { };
+struct TypeInfo<unsigned long int, false>: IntType { };
 
+#if defined(_MSC_VER)
 template<>
-struct TypeInfo<long int>: IntType { };
+struct TypeInfo<__int64, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned long int>: IntType { };
+struct TypeInfo<unsigned __int64, false>: IntType { };
+#elif defined(__GNUC__)
+template<>
+struct TypeInfo<long long int, false>: IntType { };
 
 template<>
-struct TypeInfo<long long int>: IntType { };
+struct TypeInfo<unsigned long long int, false>: IntType { };
+#endif
 
 template<>
-struct TypeInfo<unsigned long long int>: IntType { };
+struct TypeInfo<float, false>: FloatType { };
 
 template<>
-struct TypeInfo<float>: FloatType { };
+struct TypeInfo<double, false>: FloatType { };
 
 template<>
-struct TypeInfo<double>: FloatType { };
+struct TypeInfo<bool, false>: BoolType { };
 
 template<>
-struct TypeInfo<bool>: BoolType { };
+struct TypeInfo<std::string, false>: StringType { };
 
 template<>
-struct TypeInfo<std::string>: StringType { };
+struct TypeInfo<char *, false>: StringType { };
+
+template<>
+struct TypeInfo<const char *, false>: StringType { };
+
+template<typename T>
+struct TypeInfo<const T, false>: TypeInfo<T> { };
+
+template<typename T>
+struct TypeInfo<T &, false>: TypeInfo<T> { };
 
 template<typename T>
-struct TypeInfo<const T>: TypeInfo<T> { };
+struct TypeInfo<T, true>: TypeInfo<typename T::LoadType>
+{ typedef typename T::LoadType Load; };
 
 template<typename T>
-struct TypeInfo<T &>: TypeInfo<T> { };
+struct TypeInfo<T, false>: SymbolType
+{ typedef T Load; };
 
 } // namespace DataFile
 } // namespace Msp