view anagram/support/agnotify.h @ 6:607e3be6bad8

Adjust to the moving target called the C++ standard. Apparently nowadays it's not allowed to define an explicit copy constructor but not an assignment operator. Consequently, defining the explicit copy constructor in terms of the implicit/automatic assignment operator for general convenience no longer works. Add assignment operators. Caution: not tested with the IBM compiler, but there's no particular reason it shouldn't work.
author David A. Holland
date Mon, 30 May 2022 23:46:22 -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 */