//----------------------------------------------------------------------------- // File: bidirlookup.h // // Desc: This file implements a bi-directional map class template. It does // this by using two CMap classes that each handles the look up in one // direction. // // Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. //----------------------------------------------------------------------------- #ifndef __BIDIRLOOKUP_H__ #define __BIDIRLOOKUP_H__ #ifndef NULL #define NULL 0 #endif template class bidirlookup { private: CMap l2r; CMap r2l; bool addnode(const L &l, const R &r) { l2r.SetAt(l, r); r2l.SetAt(r, l); return true; } public: void clear() { l2r.RemoveAll(); r2l.RemoveAll(); } bidirlookup() {} ~bidirlookup() {clear();} bool add(const L &l, const R &r) { L tl; R tr; if (l2r.Lookup(l, tr) || r2l.Lookup(r, tl)) return false; return addnode(l, r); } bool getleft(L &l, const R &r) { return r2l.Lookup(r, l) ? true : false; } bool getright(const L &l, R &r) { return l2r.Lookup(l, r) ? true : false; } }; #if 0 template class bidirlookup { private: struct node { node(const L &a, const R &b) : l(a), r(b), next(NULL) {} node *next; L l; R r; } *head; bool addnode(const L &l, const R &r) { node *old = head; head = new node(l, r); if (!head) return false; head->next = old; return true; } node *getleftnode(const L &l) { for (node *on = head; on; on = on->next) if (on->l == l) return on; return NULL; } node *getrightnode(const R &r) { for (node *on = head; on; on = on->next) if (on->r == r) return on; return NULL; } public: void clear() { while (head) { node *next = head->next; delete head; head = next; } } bidirlookup() : head(NULL) {} ~bidirlookup() {clear();} bool add(const L &l, const R &r) { if (getleftnode(l) || getrightnode(r)) return false; return addnode(l, r); } bool getleft(L &l, const R &r) { node *n = getrightnode(r); if (!n) return false; l = n->l; return true; } bool getright(const L &l, R &r) { node *n = getleftnode(l); if (!n) return false; r = n->r; return true; } }; #endif #endif //__BIDIRLOOKUP_H__