00001
00002
00003
00004
00005
00006
00007 #ifndef __UNICALLBACKGEN_H
00008 #define __UNICALLBACKGEN_H
00009
00010 #include <map>
00011
00012 #include "unitempgen.h"
00013 #include "wvstream.h"
00014 #include "wvtr1.h"
00015
00016 typedef wv::function<WvString(const UniConfKey&)>
00017 UniCallbackGenGetCallback;
00018 typedef wv::function<void(const UniConfKey&, WvStringParm)>
00019 UniCallbackGenSetCallback;
00020
00028 class UniCallbackGen: public UniTempGen
00029 {
00030 typedef std::map<UniConfKey, UniCallbackGenGetCallback> GetCallbackMap;
00031 GetCallbackMap get_callbacks;
00032 typedef std::map<UniConfKey, UniCallbackGenSetCallback> SetCallbackMap;
00033 SetCallbackMap set_callbacks;
00034
00035 public:
00036
00037 bool update_before_get;
00038 bool update_after_set;
00039
00040 UniCallbackGen():
00041 update_before_get(false),
00042 update_after_set(true) {}
00043 virtual ~UniCallbackGen() {}
00044
00045 virtual void setgetcallback(const UniConfKey &key,
00046 UniCallbackGenGetCallback get_callback)
00047 {
00048 if (get_callback)
00049 get_callbacks[key] = get_callback;
00050 else
00051 get_callbacks.erase(key);
00052 }
00053 virtual void setsetcallback(const UniConfKey &key,
00054 UniCallbackGenSetCallback set_callback)
00055 {
00056 if (set_callback)
00057 set_callbacks[key] = set_callback;
00058 else
00059 set_callbacks.erase(key);
00060 }
00061
00062 virtual void update(const UniConfKey &key,
00063 WvStringParm value = WvString::null)
00064 {
00065 GetCallbackMap::iterator it = get_callbacks.find(key);
00066 if (it != get_callbacks.end())
00067 UniTempGen::set(key, it->second(key));
00068 else
00069 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 SetCallbackMap::iterator it = set_callbacks.find(key);
00082 if (it != set_callbacks.end())
00083 it->second(key, value);
00084
00085 if (update_after_set)
00086 update(key, value);
00087 }
00088 };
00089
00090
00091 #endif // __UNICALLBACKGEN_H