-/* $Id$
-
-This file is part of libmspdatafile
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
#ifndef MSP_DATAFILE_VALUE_H_
#define MSP_DATAFILE_VALUE_H_
#include <vector>
-#include <msp/strings/lexicalcast.h>
-#include "error.h"
+#include <msp/core/meta.h>
+#include <msp/core/variant.h>
+#include "type.h"
namespace Msp {
namespace DataFile {
-enum Type
-{
- INTEGER,
- FLOAT,
- STRING,
- BOOLEAN,
- ENUM
-};
-
-template<typename T> struct TypeResolver { static const Type type=ENUM; };
-template<> struct TypeResolver<short> { static const Type type=INTEGER; };
-template<> struct TypeResolver<unsigned short> { static const Type type=INTEGER; };
-template<> struct TypeResolver<int> { static const Type type=INTEGER; };
-template<> struct TypeResolver<unsigned> { static const Type type=INTEGER; };
-template<> struct TypeResolver<long> { static const Type type=INTEGER; };
-template<> struct TypeResolver<unsigned long> { static const Type type=INTEGER; };
-template<> struct TypeResolver<long long> { static const Type type=INTEGER; };
-template<> struct TypeResolver<unsigned long long> { static const Type type=INTEGER; };
-template<> struct TypeResolver<float> { static const Type type=FLOAT; };
-template<> struct TypeResolver<double> { static const Type type=FLOAT; };
-template<> struct TypeResolver<bool> { static const Type type=BOOLEAN; };
-template<> struct TypeResolver<std::string> { static const Type type=STRING; };
-template<typename T> struct TypeResolver<const T> { static const Type type=TypeResolver<T>::type; };
-template<typename T> struct TypeResolver<T &> { static const Type type=TypeResolver<T>::type; };
-template<typename T> struct TypeResolver<const T &> { static const Type type=TypeResolver<T>::type; };
-
class Value
{
-public:
- Value(Type t, const std::string &d): type(t), data(d) { }
+private:
+ char sig;
+ Variant data;
+public:
template<typename T>
- Value(T d): type(TypeResolver<T>::type), data(lexical_cast(d)) { }
+ Value(T d):
+ sig(TypeInfo<T>::signature),
+ data(static_cast<typename TypeInfo<T>::Store>(d))
+ { }
+
+ Value(Symbol d): sig(TypeInfo<Symbol>::signature), data(d) { }
template<typename T>
- T get() const;
+ typename TypeInfo<T>::Load get() const
+ { return get_<typename TypeInfo<T>::Store>(); }
- Type get_type() const { return type; }
- const std::string &get_raw() const { return data; }
+ char get_signature() const { return sig; }
private:
- Type type;
- std::string data;
+ template<typename T>
+ T get_() const;
};
-typedef std::vector<Value> ValueArray;
-
-template<Type T> inline bool check_type(Type t) { return t==T; }
-template<> inline bool check_type<FLOAT>(Type t) { return t==INTEGER || t==FLOAT; }
+typedef std::vector<Value> ValueArray __attribute__((deprecated));
template<typename T>
-inline T Value::get() const
-{
- if(!check_type<TypeResolver<T>::type>(type))
- throw TypeError("Type mismatch");
-
- std::istringstream ss(data);
- T result;
- ss>>result;
- if(ss.fail())
- //XXX
- throw Exception("Invalid value");
-
- return result;
-}
-
-template<>
-inline std::string Value::get<std::string>() const
+inline T Value::get_() const
{
- if(type!=STRING)
- throw TypeError("Type mismatch");
- return data;
+ return data.value<typename TypeInfo<T>::Store>();
}
template<>
-inline const std::string &Value::get<const std::string&>() const
+inline FloatType::Store Value::get_<FloatType::Store>() const
{
- if(type!=STRING)
- throw TypeError("Type mismatch");
- return data;
+ if(sig==IntType::signature)
+ return data.value<IntType::Store>();
+ else
+ return data.value<FloatType::Store>();
}
} // namespace DataFile