stats: Method stats source

This source for stats binds an object and a method / function from the object
to a stats object. This allows pulling out stats from object methods without
needing to go through a global, or static shim.

Syntax is somewhat unpleasant, but the templates and method pointer type
specification were quite tricky.  Interface is very clean though; and similar
to .functor
This commit is contained in:
Stephan Diestelhorst 2014-05-09 18:58:46 -04:00
parent 2b1a01ee6c
commit b9e6c260a0

View file

@ -777,6 +777,25 @@ class FunctorProxy : public ProxyInfo
Result total() const { return (*functor)(); }
};
/**
* A proxy similar to the FunctorProxy, but allows calling a method of a bound
* object, instead of a global free-standing function.
*/
template <class T, class V>
class MethodProxy : public ProxyInfo
{
private:
T *object;
typedef V (T::*MethodPointer) () const;
MethodPointer method;
public:
MethodProxy(T *obj, MethodPointer meth) : object(obj), method(meth) {}
Counter value() const { return (object->*method)(); }
Result result() const { return (object->*method)(); }
Result total() const { return (object->*method)(); }
};
template <class Derived>
class ValueBase : public DataWrap<Derived, ScalarInfoProxy>
{
@ -805,6 +824,22 @@ class ValueBase : public DataWrap<Derived, ScalarInfoProxy>
return this->self();
}
/**
* Extended functor that calls the specified method of the provided object.
*
* @param obj Pointer to the object whose method should be called.
* @param method Pointer of the function / method of the object.
* @return Updated stats item.
*/
template <class T, class V>
Derived &
method(T *obj, V (T::*method)() const)
{
proxy = new MethodProxy<T,V>(obj, method);
this->setInit();
return this->self();
}
Counter value() { return proxy->value(); }
Result result() const { return proxy->result(); }
Result total() const { return proxy->total(); };