00001
00002
00003
00004
00005
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
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