From 6935baba5b9a66bbf1dd2557fc9cc45f0f6768fd Mon Sep 17 00:00:00 2001 From: ehofman Date: Thu, 27 May 2004 13:03:01 +0000 Subject: [PATCH] Add the possibillity to parse a user data pointer to getter and satter functions. This adds a convenient way to get the 'this' pointer to the static functions. --- simgear/props/props.hxx | 62 +++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/simgear/props/props.hxx b/simgear/props/props.hxx index a042c61d..a74b89c2 100644 --- a/simgear/props/props.hxx +++ b/simgear/props/props.hxx @@ -282,11 +282,13 @@ public: * The template type of a static getter function. */ typedef T (*getter_t)(); + typedef T (*getter_td)(void*); /** * The template type of a static setter function. */ typedef void (*setter_t)(T); + typedef void (*setter_td)(T,void*); /** * Explicit constructor. @@ -299,7 +301,26 @@ public: * to write-disable the value. */ SGRawValueFunctions (getter_t getter = 0, setter_t setter = 0) - : _getter(getter), _setter(setter) {} + : _getter(getter), _setter(setter), + _getter_d(0), _setter_d(0), _data(0) {} + + /** + * Explicit constructor. + * + * Create a new raw value bound to the getter and setter supplied. + * + * @param getter A static function for getting a value, or 0 + * to read-disable the value. + * @param setter A static function for setting a value, or 0 + * to write-disable the value. + * @param data A pointer to user data which gets passed to the + * getter and setter functions. This could be used to pass the this + * pointer to the callback function. + */ + SGRawValueFunctions (getter_td getter = 0, setter_td setter = 0, + void *data = NULL) + : _setter(0), _getter(0), + _getter_d(getter), _setter_d(setter), _data(data) {} /** * Destructor. @@ -314,7 +335,8 @@ public: * return the default value for the type. */ virtual T getValue () const { - if (_getter) return (*_getter)(); + if (_getter_d) return (*_getter_d)(_data); + else if (_getter) return (*_getter)(); else return SGRawValue::DefaultValue; } @@ -326,7 +348,8 @@ public: * method will return false. */ virtual bool setValue (T value) { - if (_setter) { (*_setter)(value); return true; } + if (_setter_d) { (*_setter_d)(value,_data); return true; } + else if (_setter) { (*_setter)(value); return true; } else return false; } @@ -334,12 +357,18 @@ public: * Create a copy of this raw value, bound to the same functions. */ virtual SGRawValue * clone () const { - return new SGRawValueFunctions(_getter,_setter); + if (_getter_d) + return new SGRawValueFunctions(_getter_d,_setter_d,_data); + else + return new SGRawValueFunctions(_getter,_setter); } private: getter_t _getter; setter_t _setter; + getter_td _getter_d; + setter_td _setter_d; + void *_data; }; @@ -358,25 +387,40 @@ class SGRawValueFunctionsIndexed : public SGRawValue { public: typedef T (*getter_t)(int); + typedef T (*getter_td)(int,void*); typedef void (*setter_t)(int,T); - SGRawValueFunctionsIndexed (int index, getter_t getter = 0, setter_t setter = 0) - : _index(index), _getter(getter), _setter(setter) {} + typedef void (*setter_td)(int,T,void*); + SGRawValueFunctionsIndexed (int index, getter_t getter = 0, setter_t setter = +0) + : _index(index), _getter(getter), _setter(setter), + _getter_d(0), _setter_d(0),_data(0) {} + SGRawValueFunctionsIndexed (int index, getter_td getter = 0, setter_td setter = 0, void *data = NULL) + : _index(index), _setter(0), _getter(0), + _getter_d(getter), _setter_d(setter), _data(data) {} virtual ~SGRawValueFunctionsIndexed () {} virtual T getValue () const { - if (_getter) return (*_getter)(_index); + if (_getter_d) return (*_getter_d)(_index,_data); + else if (_getter) return (*_getter)(_index); else return SGRawValue::DefaultValue; } virtual bool setValue (T value) { - if (_setter) { (*_setter)(_index, value); return true; } + if (_setter_d) { (*_setter_d)(_index, value, _data); return true; } + else if (_setter) { (*_setter)(_index, value); return true; } else return false; } virtual SGRawValue * clone () const { - return new SGRawValueFunctionsIndexed(_index, _getter, _setter); + if (_getter_d) + return new SGRawValueFunctionsIndexed(_index,_getter_d,_setter_d,_data); + else + return new SGRawValueFunctionsIndexed(_index,_getter,_setter); } private: int _index; getter_t _getter; setter_t _setter; + getter_td _getter_d; + setter_td _setter_d; + void *_data; }; -- 2.39.5