X-Git-Url: http://git.tdb.fi/?p=libs%2Fdatafile.git;a=blobdiff_plain;f=source%2Fvalue.h;h=b7da1d7f3ff3668b0737f45440a19910076cda29;hp=dc117e0a7ff03207e73be05748849c0a182f3e0b;hb=HEAD;hpb=5453824394771ca21de32088a2842486b63e6f6d diff --git a/source/value.h b/source/value.h index dc117e0..bcddd6e 100644 --- a/source/value.h +++ b/source/value.h @@ -1,47 +1,57 @@ -/* -This file is part of libmspparser -Copyright © 2006 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ -#ifndef MSP_PARSER_VALUE_H_ -#define MSP_PARSER_VALUE_H_ - -#include -#include +#ifndef MSP_DATAFILE_VALUE_H_ +#define MSP_DATAFILE_VALUE_H_ + #include +#include +#include +#include +#include "type.h" namespace Msp { -namespace Parser { +namespace DataFile { class Value { +private: + char sig; + Variant data; + public: - enum Type - { - INTEGER, - FLOAT, - STRING, - BOOLEAN - }; - - Value(Type t, const std::string &d): type(t), data(d) { } template - T get() const - { - std::istringstream ss(data); - T result; - ss>>result; - if(ss.fail()) - throw TypeError("Type mismatch"); - return result; - } + Value(T &&d): + sig(TypeInfo::signature), + data(static_cast::Store>(std::forward(d))) + { } + + Value(const Symbol &d): sig(TypeInfo::signature), data(d) { } + Value(Symbol &&d): sig(TypeInfo::signature), data(std::move(d)) { } + + template + typename TypeInfo::Load get() const + { return get_::Store>(); } + + char get_signature() const { return sig; } private: - Type type; - std::string data; + template + T get_() const; }; -typedef std::vector ValueArray; -} // namespace Parser +template +inline T Value::get_() const +{ + return data.value::Store>(); +} + +template<> +inline FloatType::Store Value::get_() const +{ + if(sig==IntType::signature) + return data.value(); + else + return data.value(); +} + +} // namespace DataFile } // namespace Msp #endif