// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_sg_bcbk #define tools_sg_bcbk // "cbk" is for callback. Base class to handle a callback. #include "../scast" #include "../S_STRING" #include namespace tools { namespace sg { enum return_action { return_none, return_to_render }; class bcbk { public: TOOLS_SCLASS(tools::sg::bcbk) public: virtual void* cast(const std::string& a_class) const { if(void* p = cmp_cast(this,a_class)) {return p;} return 0; } virtual const std::string& s_cls() const {return s_class();} public: virtual return_action action() = 0; virtual bcbk* copy() const = 0; public: virtual ~bcbk(){ } protected: bcbk() :m_single_shoot(false) ,m_is_valid(true) { } bcbk(const bcbk& a_from) :m_single_shoot(a_from.m_single_shoot) ,m_is_valid(a_from.m_is_valid) { } bcbk& operator=(const bcbk& a_from){ m_single_shoot = a_from.m_single_shoot; m_is_valid = a_from.m_is_valid; return *this; } public: void set_single_shoot(bool a_value) {m_single_shoot = a_value;} bool is_single_shoot() const {return m_single_shoot;} bool is_valid() const {return m_is_valid;} void invalidate() {m_is_valid = false;} protected: bool m_single_shoot; bool m_is_valid; }; }} #define TOOLS_CBK(a__class,a__sclass,a__parent)\ private:\ typedef a__parent parent;\ public:\ TOOLS_SCLASS(a__sclass)\ public:\ virtual void* cast(const std::string& a_class) const {\ if(void* p = tools::cmp_cast(this,a_class)) return p;\ return parent::cast(a_class);\ }\ virtual const std::string& s_cls() const {return s_class();}\ virtual tools::sg::bcbk* copy() const {return new a__class(*this);} #define TOOLS_T_CBK(a__T,a__class,a__sclass,a__parent)\ private:\ typedef a__parent parent;\ public:\ TOOLS_T_SCLASS(a__T,a__sclass)\ public:\ virtual void* cast(const std::string& a_class) const {\ if(void* p = tools::cmp_cast(this,a_class)) return p;\ return parent::cast(a_class);\ }\ virtual const std::string& s_cls() const {return s_class();}\ virtual tools::sg::bcbk* copy() const {return new a__class(*this);} #define TOOLS_T2_CBK(a__T1,a__T2,a__class,a__sclass,a__parent)\ private:\ typedef a__parent parent;\ public:\ TOOLS_T2_SCLASS(a__T1,a__T2,a__sclass)\ public:\ virtual void* cast(const std::string& a_class) const {\ if(void* p = tools::cmp_cast(this,a_class)) return p;\ return parent::cast(a_class);\ }\ virtual const std::string& s_cls() const {return s_class();}\ virtual tools::sg::bcbk* copy() const {return new a__class(*this);} #define TOOLS_T3_CBK(a__T1,a__T2,a__T3,a__class,a__sclass,a__parent)\ private:\ typedef a__parent parent;\ public:\ TOOLS_T3_SCLASS(a__T1,a__T2,a__T3,a__sclass)\ public:\ virtual void* cast(const std::string& a_class) const {\ if(void* p = tools::cmp_cast(this,a_class)) return p;\ return parent::cast(a_class);\ }\ virtual const std::string& s_cls() const {return s_class();}\ virtual tools::sg::bcbk* copy() const {return new a__class(*this);} #endif