Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/support/agnotify.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/support/agnotify.h Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,74 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1997-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * agnotify.h + */ + +#ifndef AGNOTIFY_H +#define AGNOTIFY_H + +#include "agstack.h" + + +class AgNotifierBase; + +class AgNotificationActionBase { +protected: + AgStack<AgNotifierBase *> notifierStack; +public: + AgNotificationActionBase() {} + virtual ~AgNotificationActionBase(); + virtual void perform() {} + AgNotificationActionBase &attach(AgNotifierBase *notifier); + void remove(AgNotifierBase *notifier); +}; + +template <class T> +class AgNotificationAction : public AgNotificationActionBase { +protected: + T *object; + void (T::*memberFunction)(); +public: + AgNotificationAction(T *x, void (T::*f)()): object(x), memberFunction(f) {} + void perform() { (object->*memberFunction)(); } +}; + +class AgNotifierBase { +protected: + AgStack<AgNotificationActionBase *> notifyStack; + void notify(); + +public: + AgNotifierBase() {} + virtual ~AgNotifierBase(); + void attach(AgNotificationActionBase *action) { + notifyStack.push(action); + } + void remove(AgNotificationActionBase *action); +}; + +template <class T> +class AgNotifier : public AgNotifierBase { +protected: + T contents; + +public: + AgNotifier(const T &d) : contents(d) {} + AgNotifier(const AgNotifier<T> &d) : contents(d.contents) {} + operator T &() { return contents; } + //T &data() { return contents; } + T *pointer() { return &contents; } + virtual void initialize(const T &d) { + contents = d; + } + virtual T &operator = (const T &d) { + contents = d; + notify(); + return contents; + } +}; + + +#endif /* AGNOTIFY_H */