Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

wvdelayedcallback.h

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 2003 Net Integration Technologies, Inc.
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);
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);
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);
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         // you can't delay a callback that has a non-void return type, sorry
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

Generated on Sun Jul 10 15:30:56 2005 for WvStreams by  doxygen 1.4.0