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