diff anagram/support/agmap.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/agmap.h	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,52 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1997-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * agmap.h
+ */
+
+#ifndef AGMAP_H
+#define AGMAP_H
+
+#include "agbaltree.h"
+
+
+template <class Key, class Value>
+class AgMap {
+public:
+  class Wrapper {
+  public:
+    Key key;
+    Value value;
+    int operator < (const Wrapper &w) const { return key < w.key; }
+    Wrapper(const Key &k, const Value &v) : key(k), value(v) {}
+  };
+
+  AgBalancedTree<Wrapper> tree;
+  friend class AgBalancedTree<Wrapper>;
+
+public:
+  Value &operator [] (const Key &k);
+  int includes(const Key &k, Value &v);
+};
+
+template <class Key, class Value>
+Value &AgMap<Key,Value>::operator [] (const Key &k) {
+  Wrapper wrapper(k, Value());
+  Wrapper *result = &wrapper;
+  tree.identify(result);
+  return result->value;
+}
+
+template <class Key, class Value>
+int AgMap<Key,Value>::includes(const Key &k, Value &v) {
+  Wrapper wrapper(k,v);
+  Wrapper *result = &wrapper;
+  int flag = tree.identify(result);
+  v = result->value;
+  return flag;
+}
+
+
+#endif /* AGMAP_H */