#ifndef JAWS_ASSOC_ARRAY_CPP #define JAWS_ASSOC_ARRAY_CPP #include "ace/config-all.h" #include "JAWS/Assoc_Array.h" template JAWS_Assoc_Array::JAWS_Assoc_Array (int maxsize) : k_array_ (0), d_array_ (0), maxsize_ (maxsize) { typedef void * ptr_type; this->k_array_ = reinterpret_cast (new ptr_type[this->maxsize_]); if (this->k_array_ == 0) { this->maxsize_ = 0; return; } this->d_array_ = reinterpret_cast (new ptr_type[this->maxsize_]); if (this->d_array_ == 0) { delete[] this->k_array_; this->maxsize_ = 0; return; } for (int i = 0; i < this->maxsize_; i++) { this->k_array_[i] = 0; this->d_array_[i] = 0; } } template JAWS_Assoc_Array::~JAWS_Assoc_Array (void) { this->clear (); delete[] reinterpret_cast (this->k_array_); delete[] reinterpret_cast (this->d_array_); this->k_array_ = 0; this->d_array_ = 0; } template int JAWS_Assoc_Array::index (const KEY &k) { return this->find_i (k); } template DATA * JAWS_Assoc_Array::find (const KEY &k) { int i = this->find_i (k); return (i < this->maxsize_) ? this->d_array_[i] : 0; } template DATA * JAWS_Assoc_Array::find_by_index (int i) { return ((0 <= i) && (i < this->maxsize_)) ? this->d_array_[i] : 0; } template DATA * JAWS_Assoc_Array::insert (const KEY &k, const DATA &d) { int i = this->find_i (k); if (i == this->maxsize_) return 0; KEY *&kk = this->k_array_[i]; DATA *&dd = this->d_array_[i]; if (kk == 0) { dd = new DATA (d); if (dd == 0) return 0; KEY *kkk = new KEY (k); if (kkk == 0) { delete dd; return 0; } kk = kkk; } return dd; } template int JAWS_Assoc_Array::remove (const KEY &k) { int i = this->find_i (k); if (i == this->maxsize_) return 0; KEY *&kk = this->k_array_[i]; DATA *&dd = this->d_array_[i]; if (kk != 0) { KEY *kkk = kk; kk = 0; delete kkk; delete dd; dd = 0; return 1; } return 0; } template void JAWS_Assoc_Array::clear (void) { for (int i = 0; i < this->maxsize_; i++) { if (this->k_array_[i] != 0) { delete this->k_array_[i]; delete this->d_array_[i]; this->k_array_[i] = 0; this->d_array_[i] = 0; } } } template int JAWS_Assoc_Array::find_i (const KEY &k) { int j = this->maxsize_; for (int i = 0; i < this->maxsize_; i++) { KEY *kk = this->k_array_[i]; if (kk) { if (*kk == k) return i; } else if (j == this->maxsize_) j = i; } return j; } template JAWS_Assoc_Array_Iterator:: JAWS_Assoc_Array_Iterator (const JAWS_Assoc_Array &aa) : aa_ (aa), i_ (0), j_ (0) { } template JAWS_Assoc_Array_Iterator::~JAWS_Assoc_Array_Iterator (void) { } template KEY * JAWS_Assoc_Array_Iterator::key (void) { return this->aa_.k_array_[this->i_]; } template DATA * JAWS_Assoc_Array_Iterator::data (void) { return this->aa_.d_array_[this->i_]; } template int JAWS_Assoc_Array_Iterator::first (void) { this->i_ = 0; for (this->j_ = 0; this->j_ < this->aa_.maxsize_; this->j_++) { if (this->aa_.k_array_[this->j_] != 0) break; } return this->next (); } template int JAWS_Assoc_Array_Iterator::last (void) { this->j_ = this->aa_.maxsize_; for (this->i_ = this->aa_.maxsize_; this->i_ > 0; this->i_--) { if (this->aa_.k_array_[this->i_-1] != 0) break; } return (this->i_-- > 0); } template int JAWS_Assoc_Array_Iterator::next (void) { if (this->j_ < this->aa_.maxsize_) { this->i_ = this->j_; for (this->j_++; this->j_ < this->aa_.maxsize_; this->j_++) { if (this->aa_.k_array_[this->j_] != 0) break; } } return (this->i_ < this->aa_.maxsize_); } template int JAWS_Assoc_Array_Iterator::previous (void) { if (this->i_ > 0) { for (this->j_ = this->i_; this->i_ > 0; this->i_--) { if (this->aa_.k_array_[this->i_-1] != 0) break; } } if (this->i_ == 0) this->first (); else this->i_--; return 1; } template int JAWS_Assoc_Array_Iterator::is_done (void) { return (this->j_ == this->aa_.maxsize_); } template JAWS_Assoc_Array_Iterator:: JAWS_Assoc_Array_Iterator (const JAWS_Assoc_Array_Iterator &aai) : aa_ (aai.aa_), i_ (aai.i_), j_ (aai.j_) { } template void JAWS_Assoc_Array_Iterator:: operator= (const JAWS_Assoc_Array_Iterator &) { } #endif /* !defined (JAWS_ASSOC_ARRAY_CPP) */