//AttrList : attrlist.cpp
#include "attrlist.h"

/* Funzione di confronto ricorsiva.
 * Ritorna:
 *  0 se il confronto ha successo
 *  !=0 se il confronto fallisce
 * Per prima cosa confronta l'attributo
 * passato per parametro con 'se stesso'.
 * Se il risultato del confronto e' difforme
 * dal criterio impostato, ritorna 'fallimento' (!= 0)
 * altrimenti passa il testimone al prossimo nodo.
 * Se i nodi sono finiti, il confronto ha avuto successo.
 */
int AttrList::operator == (const Attributo &a)
{
  /* Notare che 'operator ==' (cioe' questo metodo) ridefinisce 
   * la 'operator ==' di Attributo. A noi serve quella della
   * superclasse, quindi indichiamo 'Attributo::compare' */
  int c = Attributo::operator != (a);
  if (c)
  {
    switch (conf)
    {
      case le :      // Se dovrebbe essere <=
        if (c > 0)   // ed invece e' maggiore
          return 0;  // Ritorno errore
        break;
      case eq :      // Se dovrebbe essere ==
        return 0;    // ritorno errore (comunque)
      case ge :      // Se dovrebbe essere >=
        if (c < 0)   // ed invece e' <
          return 0;  // Allora ritorno errore
        break;
    }
  }
  if (Next ())
    return *Next () == a; // Siccome uso il template, non mi serve piu' il cast
  return -1;
}