/* core/func.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_CORE_FUNC_H__ #define __INCLUDED_CORE_FUNC_H__ #include "core/player.h" #include "core/entity.h" #include #include #include namespace core { /// function pointer type for local functions typedef void(* FuncPtr)(std::string const &args); /// fuction pointer for game functions typedef void(* GameFuncPtr)(Player *player, std::string const &args); /// fuction pointer for target functions typedef void(* TargetFuncPtr)(Player *player, Entity *entity); /// a function pointer encapsulation class class Func { public: /// function flags enum Flags {Game = 1, Shared = 2, Target = 4}; /// create a new function Func(char const * name, void *ptr, unsigned int flags = 0); ~Func(); /*----- inspectors ------------------------------------------------ */ /// returns the fucuntion flags inline unsigned int flags() const { return func_flags; } /// returns the name of the function inline std::string const &name() const { return func_name; } /// returns the info of the function inline std::string const &info() { return func_info; } /*----- mutators -------------------------------------------------- */ /// set the info string void set_info(const char *); /// execute the function if the Game flag is not set void exec(std::string const &args); /// execute the function if the Game flag is set void exec(Player *player, std::string const &args); /// execute the function if the Target flag is set void exec(Player *player, Entity *entity); /* ---- Static functions for the Func registry -------------------- */ /// type definition typedef std::map Registry; /// add a function to the registry static Func *add(const char *name, FuncPtr functionptr, bool shared = false); /// add a game function to the registry and set the Game flag static Func *add(const char *name, GameFuncPtr functionptr); /// add a target function to the registry and set Game and Target flag static Func *add(const char *name, TargetFuncPtr targetfunctionptr); /// remove a function from the registry static void remove(const char *name); /// remove a function from the registry static void remove(std::string const &name); /// find a fuction pointer, return 0 if it could not be found static Func *find(std::string const &name); /// list the function registry static void list(); /// the function registry static inline Registry & registry() { return func_registry; } private: std::string func_name; std::string func_info; unsigned int func_flags; void *func_ptr; static Registry func_registry; }; } #endif // __INCLUDED_CORE_FUNC_H__