//AssocList.cc
#ifndef _ASSOCLIST_CC
#define _ASSOCLIST_CC
#include "AssocList.h"
#include "Comparisons.h"
#include <iostream.h>
// destructor
template <class KEY, class VALUE>
AssocList<KEY,VALUE>::~AssocList() {
}
// constructors
template <class KEY, class VALUE>
AssocList<KEY,VALUE>::AssocList() :
use_default(0)
{
}
template <class KEY, class VALUE>
AssocList<KEY,VALUE>::AssocList(VALUE const & def) :
use_default(1), default_init(def)
{
}
template <class KEY, class VALUE>
AssocList<KEY,VALUE>::AssocList(AssocList const & a) :
pairs(a.pairs),
use_default (a.use_default),
default_init (a.default_init)
{
}
// operator=
template <class KEY, class VALUE>
AssocList<KEY,VALUE>& AssocList<KEY,VALUE>::operator=(const AssocList& a) {
pairs = a.pairs; // deep copy
use_default = a.use_default;
default_init = a.default_init;
return *this;
}
// find
template <class KEY, class VALUE>
int AssocList<KEY,VALUE>::find(KEY const & k) const {
for (int i = 0; i < pairs.size(); ++i)
if (! pairs[i].removed && Equal(pairs[i].k, k)) return i;
return -1;
}
// clear
template <class KEY, class VALUE>
void AssocList<KEY,VALUE>::clear() {
pairs.clear();
}
// find
template <class KEY, class VALUE>
int AssocList<KEY,VALUE>::exists(KEY const & k) const {
return find(k) != -1;
}
// remove
template <class KEY, class VALUE>
void AssocList<KEY,VALUE>::remove(KEY const & k) {
int i = find(k);
if (i == -1) return;
pairs[i].removed = 1;
}
// operator[] and const operator[]
template <class KEY, class VALUE>
VALUE &
AssocList<KEY,VALUE>::operator[](KEY const & k) {
int i = find(k);
if (i >= 0) return pairs[i].v;
// find next free pair pointer
for (i = 0; i < pairs.size() && ! pairs[i].removed; ++i)
;
// insert pair for key k and return v
pairs[i].k = k;
if (use_default) pairs[i].v = default_init;
pairs[i].removed = 0;
return pairs[i].v;
}
template <class KEY, class VALUE>
VALUE AssocList<KEY,VALUE>::operator[](KEY const & k) const {
int i = find(k);
if (i >= 0) return pairs[i].v;
cerr << "AssocList index out of range\n";
exit(1);
}
// keys() and values()
template <class KEY, class VALUE>
Array<KEY> AssocList<KEY,VALUE>::keys() const {
Array<KEY> a;
for (int i = 0; i < pairs.size(); ++i)
if (! pairs[i].removed) a[a.size()] = pairs[i].k;
return a;
}
template <class KEY, class VALUE>
Array<VALUE> AssocList<KEY,VALUE>::values() const {
Array<VALUE> a;
for (int i = 0; i < pairs.size(); ++i)
if (! pairs[i].removed) a[a.size()] = pairs[i].v;
return a;
}
// operator<<
template <class KEY, class VALUE>
ostream &
operator<<(ostream & out, const AssocList<KEY,VALUE> & a) {
// out << "use_default = " << a.use_default;
// if (a.use_default) {
// out << ", default = " << a.default_init;
// }
// out << "\npairs = [";
out << "[";
for (int i = 0; i < a.pairs.size(); ++i) {
if (i != 0) out << ", ";
out << "(" << a.pairs[i].k << ", " << a.pairs[i].v << ", " << a.pairs[i].removed << ")";
}
out << "]";
return out;
}
#endif