add CTClosure for a closure that takes one argument at call time
git-svn-id: svn://localhost/ardour2/branches/3.0@6351 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
9fa8a7e9c2
commit
70b75d656e
@ -86,7 +86,7 @@ struct Closure {
|
|||||||
/* will crash if impl is unset */
|
/* will crash if impl is unset */
|
||||||
void operator() () const { (*impl)(); }
|
void operator() () const { (*impl)(); }
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
ClosureBaseImpl* impl;
|
ClosureBaseImpl* impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -154,6 +154,46 @@ Closure closure (T& t, void (T::*m)(A1,A2), A1 a1, A2 a2) { return Closure (new
|
|||||||
template<typename T, typename A1, typename A2, typename A3>
|
template<typename T, typename A1, typename A2, typename A3>
|
||||||
Closure closure (T& t, void (T::*m)(A1, A2, A3), A1 a1, A2 a2, A3 a3) { return Closure (new ClosureImpl3<T,A1,A2,A3>(t,m , a1, a2, a3)); }
|
Closure closure (T& t, void (T::*m)(A1, A2, A3), A1 a1, A2 a2, A3 a3) { return Closure (new ClosureImpl3<T,A1,A2,A3>(t,m , a1, a2, a3)); }
|
||||||
|
|
||||||
|
/*---------*/
|
||||||
|
|
||||||
|
template<typename A>
|
||||||
|
struct CTClosureBaseImpl : ClosureBaseImpl {
|
||||||
|
CTClosureBaseImpl() {}
|
||||||
|
|
||||||
|
virtual void operator() () { operator() (A()); }
|
||||||
|
virtual void operator() (A arg) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ~CTClosureBaseImpl() { }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename A>
|
||||||
|
struct CTClosure : public Closure {
|
||||||
|
CTClosure() {}
|
||||||
|
CTClosure (CTClosureBaseImpl<A>* i) : Closure (i) {}
|
||||||
|
CTClosure (const CTClosure& other) : Closure (other) {}
|
||||||
|
|
||||||
|
/* will crash if impl is unset */
|
||||||
|
void operator() (A arg) const { (*(dynamic_cast<CTClosureBaseImpl<A>*> (impl))) (arg); }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T, typename A>
|
||||||
|
struct CTClosureImpl1 : public CTClosureBaseImpl<A>
|
||||||
|
{
|
||||||
|
CTClosureImpl1 (T& obj, void (T::*m)(A))
|
||||||
|
: object (obj), method (m) {}
|
||||||
|
void operator() (A call_time_arg) { (object.*method) (call_time_arg); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
T& object;
|
||||||
|
void (T::*method)(A);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* functor wraps a method that takes 1 arg provided at call-time */
|
||||||
|
|
||||||
|
template<typename T, typename A>
|
||||||
|
CTClosure<A> closure (T& t, void (T::*m)(A)) { return CTClosure<A> (new CTClosureImpl1<T,A>(t,m)); }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __pbd_closure_h__ */
|
#endif /* __pbd_closure_h__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user