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.
This commit is contained in:
+53
-9
@@ -282,11 +282,13 @@ public:
|
|||||||
* The template type of a static getter function.
|
* The template type of a static getter function.
|
||||||
*/
|
*/
|
||||||
typedef T (*getter_t)();
|
typedef T (*getter_t)();
|
||||||
|
typedef T (*getter_td)(void*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The template type of a static setter function.
|
* The template type of a static setter function.
|
||||||
*/
|
*/
|
||||||
typedef void (*setter_t)(T);
|
typedef void (*setter_t)(T);
|
||||||
|
typedef void (*setter_td)(T,void*);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Explicit constructor.
|
* Explicit constructor.
|
||||||
@@ -299,7 +301,26 @@ public:
|
|||||||
* to write-disable the value.
|
* to write-disable the value.
|
||||||
*/
|
*/
|
||||||
SGRawValueFunctions (getter_t getter = 0, setter_t setter = 0)
|
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.
|
* Destructor.
|
||||||
@@ -314,7 +335,8 @@ public:
|
|||||||
* return the default value for the type.
|
* return the default value for the type.
|
||||||
*/
|
*/
|
||||||
virtual T getValue () const {
|
virtual T getValue () const {
|
||||||
if (_getter) return (*_getter)();
|
if (_getter_d) return (*_getter_d)(_data);
|
||||||
|
else if (_getter) return (*_getter)();
|
||||||
else return SGRawValue<T>::DefaultValue;
|
else return SGRawValue<T>::DefaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,7 +348,8 @@ public:
|
|||||||
* method will return false.
|
* method will return false.
|
||||||
*/
|
*/
|
||||||
virtual bool setValue (T value) {
|
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;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,12 +357,18 @@ public:
|
|||||||
* Create a copy of this raw value, bound to the same functions.
|
* Create a copy of this raw value, bound to the same functions.
|
||||||
*/
|
*/
|
||||||
virtual SGRawValue<T> * clone () const {
|
virtual SGRawValue<T> * clone () const {
|
||||||
return new SGRawValueFunctions<T>(_getter,_setter);
|
if (_getter_d)
|
||||||
|
return new SGRawValueFunctions<T>(_getter_d,_setter_d,_data);
|
||||||
|
else
|
||||||
|
return new SGRawValueFunctions<T>(_getter,_setter);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
getter_t _getter;
|
getter_t _getter;
|
||||||
setter_t _setter;
|
setter_t _setter;
|
||||||
|
getter_td _getter_d;
|
||||||
|
setter_td _setter_d;
|
||||||
|
void *_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -358,25 +387,40 @@ class SGRawValueFunctionsIndexed : public SGRawValue<T>
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef T (*getter_t)(int);
|
typedef T (*getter_t)(int);
|
||||||
|
typedef T (*getter_td)(int,void*);
|
||||||
typedef void (*setter_t)(int,T);
|
typedef void (*setter_t)(int,T);
|
||||||
SGRawValueFunctionsIndexed (int index, getter_t getter = 0, setter_t setter = 0)
|
typedef void (*setter_td)(int,T,void*);
|
||||||
: _index(index), _getter(getter), _setter(setter) {}
|
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 ~SGRawValueFunctionsIndexed () {}
|
||||||
virtual T getValue () const {
|
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<T>::DefaultValue;
|
else return SGRawValue<T>::DefaultValue;
|
||||||
}
|
}
|
||||||
virtual bool setValue (T value) {
|
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;
|
else return false;
|
||||||
}
|
}
|
||||||
virtual SGRawValue<T> * clone () const {
|
virtual SGRawValue<T> * clone () const {
|
||||||
return new SGRawValueFunctionsIndexed<T>(_index, _getter, _setter);
|
if (_getter_d)
|
||||||
|
return new SGRawValueFunctionsIndexed<T>(_index,_getter_d,_setter_d,_data);
|
||||||
|
else
|
||||||
|
return new SGRawValueFunctionsIndexed<T>(_index,_getter,_setter);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
int _index;
|
int _index;
|
||||||
getter_t _getter;
|
getter_t _getter;
|
||||||
setter_t _setter;
|
setter_t _setter;
|
||||||
|
getter_td _getter_d;
|
||||||
|
setter_td _setter_d;
|
||||||
|
void *_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user