view anagram/support/register-imp.h @ 7:57b2cc9b87f7

Use memcpy instead of strncpy when we know the length anyway. Modern gcc seems to think it knows how to detect misuse of strncpy, but it's wrong (in fact: very, very wrong) and the path of least resistance is to not try to fight with it.
author David A. Holland
date Mon, 30 May 2022 23:47:52 -0400
parents 13d2b8934445
children
line wrap: on
line source

/*
 * 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 */