00001
00002
00003
00004
00005
00006 #ifndef __WVDELAYEDCALLBACK_H
00007 #define __WVDELAYEDCALLBACK_H
00008
00009 #include "wvcallback.h"
00010 #include "wvistreamlist.h"
00011
00020 template<class InnerCallback>
00021 class WvDelayedCallback
00022 {
00023 private:
00024 typedef typename InnerCallback::Parm1 P1;
00025 typedef typename InnerCallback::Parm2 P2;
00026 typedef typename InnerCallback::Parm3 P3;
00027 typedef typename InnerCallback::Parm4 P4;
00028 typedef typename InnerCallback::Parm5 P5;
00029 typedef typename InnerCallback::Parm6 P6;
00030 typedef typename InnerCallback::Parm7 P7;
00031 typedef typename InnerCallback::Parm8 P8;
00032 typedef WvCallbackImpl<void, P1, P2, P3, P4, P5, P6, P7, P8> Impl;
00033 typedef typename Impl::FrozenParams FrozenParams;
00034 InnerCallback cb;
00035 FrozenParams *frozen;
00036 WvStream *stream;
00037
00038 void thaw(WvStream &stream, void *userdata)
00039 {
00040 cb.thaw(*frozen);
00041 }
00042
00043 public:
00044 template<typename PtrToObject, typename PtrToMember>
00045 WvDelayedCallback(PtrToObject obj, PtrToMember member)
00046 : cb(InnerCallback(obj, member)), frozen(0), stream(new WvStream)
00047 {
00048 stream->setcallback(WvStreamCallback(this, &WvDelayedCallback::thaw), 0);
00049 WvIStreamList::globallist.append(stream, true, "WvDelayedCallback");
00050 }
00051 template<typename Functor>
00052 WvDelayedCallback(const Functor& func)
00053 : cb(InnerCallback(func)), frozen(0), stream(new WvStream)
00054 {
00055 stream->setcallback(WvStreamCallback(this, &WvDelayedCallback::thaw), 0);
00056 WvIStreamList::globallist.append(stream, true, "WvDelayedCallback");
00057 }
00058 WvDelayedCallback(const WvDelayedCallback &other)
00059 : cb(other.cb), frozen(0), stream(new WvStream)
00060 {
00061 stream->setcallback(WvStreamCallback(this, &WvDelayedCallback::thaw), 0);
00062 WvIStreamList::globallist.append(stream, true, "WvDelayedCallback");
00063 }
00064 ~WvDelayedCallback()
00065 {
00066 stream->setcallback(0, 0);
00067 stream->close();
00068 delete frozen;
00069 }
00070 void operator()()
00071 {
00072 delete frozen;
00073 frozen = new FrozenParams;
00074 stream->alarm(0);
00075
00076 }
00077 void operator()(P1 p1)
00078 {
00079 delete frozen;
00080 frozen = new FrozenParams(p1);
00081 stream->alarm(0);
00082 }
00083 void operator()(P1 p1, P2 p2)
00084 {
00085 delete frozen;
00086 frozen = new FrozenParams(p1, p2);
00087 stream->alarm(0);
00088 }
00089 void operator()(P1 p1, P2 p2, P3 p3)
00090 {
00091 delete frozen;
00092 frozen = new FrozenParams(p1, p2, p3);
00093 stream->alarm(0);
00094 }
00095 void operator()(P1 p1, P2 p2, P3 p3, P4 p4)
00096 {
00097 delete frozen;
00098 frozen = new FrozenParams(p1, p2, p3, p4);
00099 stream->alarm(0);
00100 }
00101 void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5)
00102 {
00103 delete frozen;
00104 frozen = new FrozenParams(p1, p2, p3, p4, p5);
00105 stream->alarm(0);
00106 }
00107 void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6)
00108 {
00109 delete frozen;
00110 frozen = new FrozenParams(p1, p2, p3, p4, p5, p6);
00111 stream->alarm(0);
00112 }
00113 void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7)
00114 {
00115 delete frozen;
00116 frozen = new FrozenParams(p1, p2, p3, p4, p5, p6, p7);
00117 stream->alarm(0);
00118 }
00119 void operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8)
00120 {
00121 delete frozen;
00122 frozen = new FrozenParams(p1, p2, p3, p4, p5, p6, p7, p8);
00123 stream->alarm(0);
00124 }
00125 };
00126 #endif