X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fvalue.h;h=fda83e494db884a228036fafdf3f6ba5c3ec9439;hb=27630d44298cb67e075c166f4421288cc8ca117e;hp=dc117e0a7ff03207e73be05748849c0a182f3e0b;hpb=5453824394771ca21de32088a2842486b63e6f6d;p=libs%2Fdatafile.git diff --git a/source/value.h b/source/value.h index dc117e0..fda83e4 100644 --- a/source/value.h +++ b/source/value.h @@ -1,47 +1,101 @@ -/* -This file is part of libmspparser -Copyright © 2006 Mikko Rasa, Mikkosoft Productions +/* $Id$ + +This file is part of libmspdatafile +Copyright © 2006 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ -#ifndef MSP_PARSER_VALUE_H_ -#define MSP_PARSER_VALUE_H_ +#ifndef MSP_DATAFILE_VALUE_H_ +#define MSP_DATAFILE_VALUE_H_ -#include -#include #include +#include +#include "error.h" namespace Msp { -namespace Parser { +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: - 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): type(TypeResolver::type), data(lexical_cast(d)) { } + + template + T get() const; + + Type get_type() const { return type; } + const std::string &get_raw() const { return data; } private: Type type; std::string data; }; + typedef std::vector ValueArray; -} // namespace Parser +template inline bool check_type(Type t) { return t==T; } +template<> inline bool check_type(Type t) { return t==INTEGER || t==FLOAT; } + +template +inline T Value::get() const +{ + if(!check_type::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() const +{ + if(type!=STRING) + throw TypeError("Type mismatch"); + return data; +} + +template<> +inline const std::string &Value::get() const +{ + if(type!=STRING) + throw TypeError("Type mismatch"); + return data; +} + +} // namespace DataFile } // namespace Msp #endif