// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 // // Copyright (C) 2004,2005 David Lau (skunix) // Chong Kai Xiong (descender) // // This file is part of The Plains of Usata. // // The Plains of Usata is licensed under the GNU General Public // License (GPL) version 2. For details, please see the COPYING file // included in the software distribution, or visit // http://www.fsf.org/licenses/gpl.html. // // $Id: scene_parser_elements.hpp,v 1.1 2005/02/18 02:24:33 skunix Exp $ #ifndef USATA_SCENE_PARSER_ELEMENTS #define USATA_SCENE_PARSER_ELEMENTS #include #include "scene_parser.hpp" namespace usata { struct SceneElementType { const char* id; SceneElement*(*create)(SceneElement*, SceneParser*); }; class SceneElementHub { public: virtual bool take_data(const std::string& name, ObjectDescription* odp){return false;}; virtual SceneElement* make_child(const char* eName){ return 0;} virtual bool take_data_any(const std::string& name, boost::any& a){return false;} }; class SceneDocument : public SceneElement, public SceneElementHub { public: SceneDocument(SceneParser *parser); virtual SceneElement* make_child(const char* eName); virtual ~SceneDocument(); virtual void start_element(const char*, const char**); virtual void end_element(){} virtual void content(const char*, int){} }; namespace scene_parser_elements { class ObjectE : public SceneElement, public SceneElementHub { std::auto_ptr mOd; public: ObjectE(SceneElement* parent, SceneParser*parser); virtual ~ObjectE(); virtual void start_element(const char*, const char**); virtual void end_element(); virtual SceneElement* make_child(const char* eName); virtual bool take_data_any(const std::string& name, const boost::any&); static SceneElement*create(SceneElement*,SceneParser*); }; class SimpleElementBase : public SceneElement { protected: std::string mName; bool mHaveName, mHaveValue; public: SimpleElementBase(SceneElement* parent, SceneParser*parser) : SceneElement(parent, parser), mHaveName(false), mHaveValue(false) { } virtual void start_element(const char*, const char**); virtual void process(const char*)=0; }; class IntE : public SimpleElementBase { int mValue; public: IntE(SceneElement* parent, SceneParser* parser); //virtual void start_element(const char*, const char**); virtual void process(const char*); virtual void end_element(); virtual void content(const char*,int); static SceneElement * create(SceneElement*p, SceneParser*pp); }; class FloatE : public SceneElement { double mValue; public: FloatE(SceneElement* parent, SceneParser* parser); static SceneElement * create(SceneElement*p, SceneParser*pp); }; class StringE : public SceneElement { std::string mValue; public: StringE(SceneElement*parent, SceneParser*parser); static SceneElement * create(SceneElement*p, SceneParser*pp); }; } } #endif