unicallbackgen.h

00001 /* -*- Mode: C++ -*-
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 2002 Net Integration Technologies, Inc.
00004  *
00005  * A UniConf generator that executes callbacks to generate the value of keys
00006  */
00007 #ifndef __UNICALLBACKGEN_H
00008 #define __UNICALLBACKGEN_H
00009 
00010 #include "unitempgen.h"
00011 #include "wvhashtable.h"
00012 #include "wvcallback.h"
00013 #include "wvstream.h"
00014 
00015 typedef WvCallback<WvString, const UniConfKey &>
00016         UniCallbackGenGetCallback;
00017 typedef WvCallback<void, const UniConfKey &, WvStringParm>
00018         UniCallbackGenSetCallback;
00019 
00027 class UniCallbackGen : public UniTempGen
00028 {
00029     WvMap<UniConfKey, UniCallbackGenGetCallback> get_callbacks;
00030     WvMap<UniConfKey, UniCallbackGenSetCallback> set_callbacks;
00031 
00032 public:
00033     
00034     bool update_before_get;
00035     bool update_after_set;
00036 
00037     UniCallbackGen(int size) :
00038         get_callbacks(size),
00039         set_callbacks(size),
00040         update_before_get(false),
00041         update_after_set(true) {}
00042     virtual ~UniCallbackGen() {}
00043 
00044     virtual void setgetcallback(const UniConfKey &key,
00045             UniCallbackGenGetCallback get_callback)
00046     {
00047         if (!!get_callback)
00048             get_callbacks.set(key, get_callback);
00049         else
00050             get_callbacks.remove(key);
00051     }
00052     virtual void setsetcallback(const UniConfKey &key,
00053             UniCallbackGenSetCallback set_callback)
00054     {
00055         if (!!set_callback)
00056             set_callbacks.set(key, set_callback);
00057         else
00058             set_callbacks.remove(key);
00059     }
00060 
00061     virtual void update(const UniConfKey &key)
00062     {
00063         if (get_callbacks.exists(key))
00064         {
00065             UniCallbackGenGetCallback &get_callback = get_callbacks[key];
00066             UniTempGen::set(key, get_callback(key));
00067         }
00068         else UniTempGen::set(key, WvString::null);
00069     }
00070 
00071     /***** Overridden members *****/
00072     virtual WvString get(const UniConfKey &key)
00073     {
00074         if (update_before_get) update(key);
00075 
00076         return UniTempGen::get(key);
00077     }
00078     virtual void set(const UniConfKey &key, WvStringParm value)
00079     {
00080         if (set_callbacks.exists(key))
00081         {
00082             UniCallbackGenSetCallback &set_callback = set_callbacks[key];
00083             set_callback(key, value);
00084         }
00085 
00086         if (update_after_set) update(key);
00087     }
00088 };
00089 
00090 
00091 #endif // __UNICALLBACKGEN_H

Generated on Sun Sep 24 20:10:47 2006 for WvStreams by  doxygen 1.4.7