1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#ifndef __icon_cache_ah__
#define __icon_cache_ah__
#include "IconCache.h"
aspect Cache {
// cache instance
IconCache iconcache;
// initialize icon cache
Cache () : iconcache (5, 10) {}
static Cache *instance() {
static Cache cache;
return &cache;
}
public:
// add baseclass Chain to class Icon
advice classes("Icon") : slice class : public Chain;
// look for icon in cache before loading it again
advice args(c) && target("IconLoader") && call("Icon * %::Load(...)") :
around(char c) { tjp->proceed (); }
advice args(c) && target("IconLoader") && call("Icon * %::Load(...)") :
around(char c) {
Icon *i = iconcache.Find(c);
if (!i) {
tjp->proceed();
i = *tjp->result();
iconcache.Insert((Chain*)i);
} else {
*tjp->result() = i;
}
}
advice execution("% IconDrawer::foo(...)") : around () { tjp->proceed (); }
advice execution("% IconDrawer::foo(...)") : around () { tjp->proceed (); }
advice execution("% IconDrawer::foo(...)") : around () { tjp->that (); tjp->proceed (); }
// override IconLoader::Free
advice call("void IconLoader::Free(Icon *)") : around() {
}
static Cache *aspectof () {
return Cache::instance();
}
};
#endif // __icon_cache_ah__
|