view anagram/support/agnotify.h @ 20:bb115deb6fb2

Improve agfiles rule. (1) It didn't depend on $(AGCL) and it absolutely should have. (2) allow AGFORCE=1 to make it rebuild whether or not it looks out of date. (3) Document this.
author David A. Holland
date Mon, 13 Jun 2022 00:02:15 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 * 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 */