]> git.tdb.fi Git - libs/datafile.git/commitdiff
Add facility for classes to specify what type they should be loaded as
authorMikko Rasa <tdb@tdb.fi>
Wed, 18 Jul 2012 14:43:19 +0000 (17:43 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 18 Jul 2012 14:43:19 +0000 (17:43 +0300)
source/type.h
source/value.h

index a7c57c40d230b55e15dc1d5313039e1d39cf347a..72d148a0e16631b2440747fd2c20a1556597b728 100644 (file)
@@ -31,18 +31,21 @@ 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,57 +56,79 @@ struct SymbolType
 };
 
 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>: IntType { };
+struct TypeInfo<short int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned short int>: IntType { };
+struct TypeInfo<unsigned short int, false>: IntType { };
 
 template<>
-struct TypeInfo<int>: IntType { };
+struct TypeInfo<int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned int>: IntType { };
+struct TypeInfo<unsigned int, false>: IntType { };
 
 template<>
-struct TypeInfo<long int>: IntType { };
+struct TypeInfo<long int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned long int>: IntType { };
+struct TypeInfo<unsigned long int, false>: IntType { };
 
 #ifdef MSVC
 template<>
-struct TypeInfo<__int64>: IntType { };
+struct TypeInfo<__int64, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned __int64>: IntType { };
+struct TypeInfo<unsigned __int64, false>: IntType { };
 #else
 template<>
-struct TypeInfo<long long int>: IntType { };
+struct TypeInfo<long long int, false>: IntType { };
 
 template<>
-struct TypeInfo<unsigned long long int>: IntType { };
+struct TypeInfo<unsigned long long int, false>: IntType { };
 #endif
 
 template<>
-struct TypeInfo<float>: FloatType { };
+struct TypeInfo<float, false>: FloatType { };
 
 template<>
-struct TypeInfo<double>: FloatType { };
+struct TypeInfo<double, false>: FloatType { };
 
 template<>
-struct TypeInfo<bool>: BoolType { };
+struct TypeInfo<bool, false>: BoolType { };
 
 template<>
-struct TypeInfo<std::string>: StringType { };
+struct TypeInfo<std::string, 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
index 78ec54a89b512599305316c9ff6ad0b35cb67b3e..e2b9fb1c569782fcbc96dc9d687d9b48eb83388d 100644 (file)
@@ -25,7 +25,7 @@ public:
        Value(Symbol d): sig(TypeInfo<Symbol>::signature), data(d) { }
 
        template<typename T>
-       typename RemoveReference<T>::Type get() const
+       typename TypeInfo<T>::Load get() const
        { return get_<typename TypeInfo<T>::Store>(); }
 
        char get_signature() const { return sig; }