From ee7ac58694c16cdd922a6eeddbe1a2eba0da7b4e Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sat, 29 Jan 2005 19:41:34 +0000 Subject: initial commit. --- (limited to 'include/konforka/pointer_map.h') diff --git a/include/konforka/pointer_map.h b/include/konforka/pointer_map.h new file mode 100644 index 0000000..d706e71 --- a/dev/null +++ b/include/konforka/pointer_map.h @@ -0,0 +1,105 @@ +#ifndef __KONFORKA_POINTER_MAP_H +#define __KONFORKA_POINTER_MAP_H + +#include + +/** + * @file + * @brief mapping of pointers. + * + * The support for global mapping of pointers. Useful when using third-party + * libraries callbacks when the library does not provide mechanism for passing + * along custom context-dependent data. + */ + +namespace konforka { + + /** + * @brief internally used actual implementation of mapping pointer. + * + * @param tf the typeid of the key pointer. + * @param pf the key pointer. + * @param tt the typeid of the value pointer. + * @param pt the value pointer. + */ + void _map_pointer(const type_info& tf,void *pf,const type_info& tt,void *pt); + /** + * @brief internally used actual implementation of destroying mapped + * pointer. + * + * @param tf the typeid of the key pointer. + * @param pf the key pointer. + * @param tt the typeid of the value pointer. + * @param pt the value pointer. + */ + void _unmap_pointer(const type_info& tf,void *pf,const type_info& tt,void *pt); + /** + * @brief internally used actual implementation of retrieving mapped + * pointer. + * + * @param tf the typeid of the key pointer. + * @param pf the key pointer. + * @param tt the typeid of the value pointer. + * @return the value. + */ + void *_mapped_pointer(const type_info& tf,void *pf,const type_info& tt); + + /** + * @brief the object, maintaining mapped pointer. + * + * @param from_t the key type. + * @param to_t the value type. + */ + template + class map_pointer { + public: + /** + * stored key. + */ + from_t _from; + /** + * stored value. + */ + to_t _to; + /** + * flag, specifying that the object is currently mapped. + */ + bool bmapped; + + /** + * @brief constructs the object, mapping the key/value pair. + * + * @param f the key. + * @param t the value. + */ + map_pointer(from_t f,to_t t) + : _from(f), _to(t), bmapped(false) { + _map_pointer(typeid(from_t),_from,typeid(to_t),_to); + bmapped=true; + } + /** + * @brief destructor unmaps the key/value pair stored. + */ + ~map_pointer() { + if(bmapped) + _unmap_pointer(typeid(from_t),_from,typeid(to_t),_to); + } + }; + + /** + * The template function for pointer retrieval. + * + * @param from_t the key type. + * @param to_t the value type. + * @param f the key. + * @return the value. + */ + template + to_t mapped_pointer(from_t f) { + return (to_t)_mapped_pointer(typeid(from_t),f,typeid(to_t)); + } + +} + +#endif /* __KONFORKA_POINTER_MAP_H */ +/* vim:set ft=cpp: */ -- cgit v0.9.0.2