Mercurial > ~dholland > hg > ag > index.cgi
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 */