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