diff anagram/support/register-imp.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/register-imp.h	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,190 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * register-imp.h
+ */
+
+#ifndef REGISTER_IMP_H
+#define REGISTER_IMP_H
+
+template <class Descriptor>
+AgStack<Descriptor> ObjectRegister<Descriptor>::descriptorList;
+
+template <class Descriptor>
+ObjectRegister<Descriptor>::ObjectRegister(const Descriptor &d)
+  : index(descriptorList.size())
+{
+  descriptorList.push(d);
+  descriptor = &descriptorList.top();
+}
+
+template <class Descriptor>
+ObjectRegister<Descriptor>::ObjectRegister(const ObjectRegister<Descriptor> &d)
+  : index(d.index), descriptor(d.descriptor)
+{
+  // Nothing to do
+}
+
+template <class Descriptor>
+ObjectRegister<Descriptor>::ObjectRegister()
+  : index(0), descriptor(0)
+{
+  // Nothing to do
+}
+
+
+template <class Descriptor>
+ObjectRegister<Descriptor>::ObjectRegister(int x)
+  : index(x)
+{
+  assert((unsigned) x < descriptorList.size());
+  descriptor = &descriptorList[x];
+}
+
+template <class Descriptor>
+ObjectRegister<Descriptor> &
+ObjectRegister<Descriptor>::operator = (const ObjectRegister<Descriptor> &d) {
+  index = d.index;
+  descriptor = d.descriptor;
+  return *this;
+}
+
+template <class Descriptor>
+ObjectRegister<Descriptor> &ObjectRegister<Descriptor>::operator = (int x) {
+  assert((unsigned) x < descriptorList.size());
+  index = x;
+  descriptor = &descriptorList[x];
+  return *this;
+}
+
+template <class Descriptor>
+void ObjectRegister<Descriptor>::reset() {
+  descriptorList.reset();
+}
+
+template <class Descriptor>
+int ObjectRegister<Descriptor>::next() {
+  if ((unsigned) (index + 1) >= descriptorList.size()) {
+    return 0;
+  }
+  index++;
+  descriptor = &descriptorList[index];
+  return 1;
+}
+
+template <class Descriptor>
+unsigned ObjectRegister<Descriptor>::count() {
+  return descriptorList.size();
+}
+
+/*
+template <class Descriptor>
+Descriptor *ObjectRegister<Descriptor>::operator -> () const {
+  return descriptor;
+}
+*/
+
+template <class Descriptor>
+int KeyedObjectRegister<Descriptor>::Tree::compare(const int &x, 
+						   const int &y) const {
+  //LOGSECTION("KeyedObjectRegister::Tree::compare");
+  unsigned size = KeyedObjectRegister<Descriptor>::descriptorList.size();
+
+  const Descriptor &dx = (unsigned) x < size ? 
+    KeyedObjectRegister<Descriptor>::descriptorList[x] : 
+    *KeyedObjectRegister<Descriptor>::testObject;
+  const Descriptor &dy = (unsigned) y < size ? 
+    KeyedObjectRegister<Descriptor>::descriptorList[y] :
+    *KeyedObjectRegister<Descriptor>::testObject;
+
+  int flag = dx < dy ? -1 : dy < dx;
+  //LOGV(x) LCV(y) LCV(flag);
+  return flag;
+}
+
+template <class Descriptor>
+KeyedObjectRegister<Descriptor>::KeyedObjectRegister(const Descriptor &d) {
+  //LOGSECTION("KeyedObjectRegister::KeyedObjectRegister");
+  testObject = &d;
+
+  unsigned size = KeyedObjectRegister<Descriptor>::descriptorList.size();
+  KeyedObjectRegister<Descriptor>::index = size;
+  //LOGV(index);
+
+  if (tree.identify(KeyedObjectRegister<Descriptor>::index)) {
+    KeyedObjectRegister<Descriptor>::descriptor = 
+      &KeyedObjectRegister<Descriptor>::descriptorList[
+	  KeyedObjectRegister<Descriptor>::index
+	];
+    return;
+  }
+  KeyedObjectRegister<Descriptor>::descriptorList.push(d);
+  KeyedObjectRegister<Descriptor>::descriptor = &
+    KeyedObjectRegister<Descriptor>::descriptorList.top();
+}
+
+template <class Descriptor>
+KeyedObjectRegister<Descriptor>::KeyedObjectRegister()
+  : ObjectRegister<Descriptor>()
+{
+  // Nothing to do
+}
+
+template <class Descriptor>
+KeyedObjectRegister<Descriptor>::KeyedObjectRegister(unsigned x)
+  : ObjectRegister<Descriptor>(x)
+{
+  // Nothing to do
+}
+
+template <class Descriptor>
+typename KeyedObjectRegister<Descriptor>::Tree
+KeyedObjectRegister<Descriptor>::tree;
+
+template <class Descriptor>
+void KeyedObjectRegister<Descriptor>::reset() {
+  tree.reset();
+  KeyedObjectRegister<Descriptor>::descriptorList.reset();
+}
+
+template <class Descriptor>
+const Descriptor *KeyedObjectRegister<Descriptor>::testObject = 0;
+
+template <class Descriptor>
+Each<Descriptor>::Each(int x) {
+  Each<Descriptor>::index = x;
+  Each<Descriptor>::descriptor = 
+    ( (unsigned) Each<Descriptor>::index 
+        < 
+      Each<Descriptor>::descriptorList.size()
+    )
+    ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index] 
+    : 0;
+}
+
+template <class Descriptor>
+void Each<Descriptor>::restart(int x) {
+  Each<Descriptor>::index = x;
+  Each<Descriptor>::descriptor = 
+    ((unsigned) Each<Descriptor>::index
+       <
+     Each<Descriptor>::descriptorList.size())
+    ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index]
+    : 0;
+}
+
+template <class Descriptor>
+void Each<Descriptor>::getNext() {
+  Each<Descriptor>::index++;
+  Each<Descriptor>::descriptor =
+    ((unsigned) Each<Descriptor>::index
+       <
+     Each<Descriptor>::descriptorList.size())
+    ? &Each<Descriptor>::descriptorList[Each<Descriptor>::index]
+    : 0;
+}
+
+
+#endif /* REGISTER_IMP_H */