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             WvStringParm value = WvString::null)
00063     {
00064         if (get_callbacks.exists(key))
00065         {
00066             UniCallbackGenGetCallback &get_callback = get_callbacks[key];
00067             UniTempGen::set(key, get_callback(key));
00068         }
00069         else UniTempGen::set(key, value);
00070     }
00071 
00072     /***** Overridden members *****/
00073     virtual WvString get(const UniConfKey &key)
00074     {
00075         if (update_before_get) update(key);
00076 
00077         return UniTempGen::get(key);
00078     }
00079     virtual void set(const UniConfKey &key, WvStringParm value)
00080     {
00081         if (set_callbacks.exists(key))
00082         {
00083             UniCallbackGenSetCallback &set_callback = set_callbacks[key];
00084             set_callback(key, value);
00085         }
00086 
00087         if (update_after_set) update(key, value);
00088     }
00089 };
00090 
00091 
00092 #endif // __UNICALLBACKGEN_H

Generated on Thu Jan 24 16:50:54 2008 for WvStreams by  doxygen 1.5.4