#ifndef FACT_EventImp #define FACT_EventImp #include #include #include #include "Time.h" class EventImp { int fTargetState; /// Target state of an event std::vector fAllowedStates; /// List of states in which this event is allowed /// http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html std::function fFunction; public: /// Constructor. Stores the target state given. EventImp(int target=-1) : fTargetState(target) { } /// Copy constructor EventImp(const EventImp &cmd); virtual ~EventImp() {} // Description virtual void SetDescription(const std::string &) { } virtual std::string GetDescription() const { return ""; } // Function handling EventImp &AssignFunction(const std::function &func) { fFunction = func; return *this; } bool HasFunc() const { return (bool)fFunction; } int ExecFunc() const { return fFunction ? fFunction(*this) : -1; } // Configuration helper EventImp &operator()(const std::function &func) { return AssignFunction(func); } EventImp &operator()(const std::string str) { SetDescription(str); return *this; } EventImp &operator()(const char *str) { SetDescription(str); return *this; } EventImp &operator()(int state) { fAllowedStates.push_back(state); return *this; } // Print contents virtual void Print(std::ostream &out, bool strip=false) const; virtual void Print(bool strip=false) const; // Handling of the states void AddAllowedState(int state); void AddAllowedStates(const char *states); bool IsStateAllowed(int state) const; int GetTargetState() const { return fTargetState; } // virtual function to return the data as stored in the derived classes virtual std::string GetName() const { return ""; } virtual std::string GetFormat() const { return ""; } virtual const void *GetData() const { return 0; } virtual int GetSize() const { return 0; } virtual Time GetTime() const { return Time::None; } // Generalized access operators template T Get(int offset=0) const { if (offset>=GetSize()) throw std::logic_error("EventImp::Get - offset out of range."); return *reinterpret_cast(GetText()+offset); } template const T *Ptr(int offset=0) const { if (offset>=GetSize()) throw std::logic_error("EventImp::Ptr - offset out of range."); return reinterpret_cast(GetText()+offset); } // Getter for all the data contained (name, format, data and time) const char *GetText() const { return reinterpret_cast(GetData()); } bool GetBool() const { return Get()!=0; } int16_t GetShort() const { return Get(); } uint16_t GetUShort() const { return Get(); } int32_t GetInt() const { return Get(); } uint32_t GetUInt() const { return Get(); } int64_t GetXtra() const { return Get(); } uint64_t GetUXtra() const { return Get(); } float GetFloat() const { return Get(); } double GetDouble() const { return Get(); } std::vector GetVector() const { return std::vector(GetText(), GetText()+GetSize()); } std::string GetString() const; }; #endif