X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fvalue.h;h=1b12db9a22db5f40e77578199bdfd7817fff4093;hp=ace18945cbc2ea39eb4bc395cc116c0016b8e7e0;hb=a582163d380833b1370ba067a1fd0ad5c2984723;hpb=cbd0ddd6ee033e46646bfb85d19232c816ea1eda diff --git a/source/value.h b/source/value.h index ace1894..1b12db9 100644 --- a/source/value.h +++ b/source/value.h @@ -1,91 +1,67 @@ /* $Id$ This file is part of libmspdatafile -Copyright © 2006 Mikko Rasa, Mikkosoft Productions +Copyright © 2006-2008, 2010 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ + #ifndef MSP_DATAFILE_VALUE_H_ #define MSP_DATAFILE_VALUE_H_ #include -#include +#include +#include #include "except.h" +#include "type.h" namespace Msp { namespace DataFile { -enum Type -{ - INTEGER, - FLOAT, - STRING, - BOOLEAN, - ENUM -}; - -template struct TypeResolver { static const Type type=ENUM; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=INTEGER; }; -template<> struct TypeResolver { static const Type type=FLOAT; }; -template<> struct TypeResolver { static const Type type=FLOAT; }; -template<> struct TypeResolver { static const Type type=BOOLEAN; }; -template<> struct TypeResolver { static const Type type=STRING; }; -template struct TypeResolver { static const Type type=TypeResolver::type; }; -template struct TypeResolver { static const Type type=TypeResolver::type; }; -template struct TypeResolver { static const Type type=TypeResolver::type; }; - class Value { -public: - Value(Type t, const std::string &d): type(t), data(d) { } +private: + char sig; + Variant data; +public: template - Value(T d): type(TypeResolver::type), data(lexical_cast(d)) { } + Value(T d): + sig(TypeInfo::signature), + data(static_cast::Store>(d)) + { } + + Value(Symbol d): sig(TypeInfo::signature), data(d) { } template - T get() const; + typename RemoveReference::Type get() const + { return get_::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 + T get_() const; }; -typedef std::vector ValueArray; - -template inline bool check_type(Type t) { return t==T; } -template<> inline bool check_type(Type t) { return t==INTEGER || t==FLOAT; } +typedef std::vector ValueArray __attribute__((deprecated)); template -inline T Value::get() const +inline T Value::get_() const { - if(!check_type::type>(type)) + if(sig!=TypeInfo::signature) throw TypeError("Type mismatch"); - return lexical_cast(data); + return data.value::Store>(); } template<> -inline std::string Value::get() const +inline FloatType::Store Value::get_() const { - if(type!=STRING) + if(sig==IntType::signature) + return data.value(); + else if(sig!=FloatType::signature) throw TypeError("Type mismatch"); - return data; -} -template<> -inline const std::string &Value::get() const -{ - if(type!=STRING) - throw TypeError("Type mismatch"); - return data; + return data.value(); } } // namespace DataFile