home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_11 / splash / assoc.h < prev    next >
Text File  |  1993-01-15  |  3KB  |  145 lines

  1. /*
  2.  * Version 1.6
  3.  * Feeble attempt to duplicate perl associative arrays
  4.  * So feeble I won't even call it PerlAssoc!
  5.  * Anyway the key can only be a string, the value can be anything.
  6.  * Written by Jim Morris,  jegm@sgi.com
  7.  */
  8. #ifndef    _SPASSOC_H
  9. #define _SPASSOC_H
  10.  
  11. #include <iostream.h>
  12. #include "splash.h"
  13.  
  14. template<class T>
  15. class Binar
  16. {
  17. private:
  18.     SPString k;
  19.     T v;
  20.  
  21. public:
  22.     Binar(SPString a, T b) : k(a), v(b){}
  23.     Binar(SPString a) : k(a){}
  24.     Binar(){}
  25.     
  26.     Binar<T>& operator=(const Binar<T>& n){ k= n.k; v= n.v; return *this; }
  27.     SPString& key(void){ return k; }
  28.     const SPString& key(void) const { return k; }
  29.     T& value(void){ return v; }
  30.     const T& value(void) const { return v; }
  31.     int operator==(const Binar<T>& b) const{return ((k == b.k) && (v == b.v));}    
  32.     int operator<(const Binar& b) const {return v < b.v;} // to keep sort quiet
  33. };
  34.  
  35. template<class T>
  36. class Assoc
  37. {
  38. private:
  39.     SPList<Binar<T> > dat;
  40.     Binar<T> def;
  41.     
  42. public:
  43.     Assoc():def(""){}
  44.     Assoc(SPString dk, T dv) : def(dk, dv){}
  45.  
  46.     int scalar(void) const { return dat.scalar(); }
  47.     
  48.     SPStringList keys(void);
  49.     SPList<T> values(void);
  50.     
  51.     int isin(const SPString& k) const;
  52.     T adelete(const SPString& k);
  53.         
  54.     T& operator()(const SPString& k);
  55.     Binar<T>& operator[](int i){ return dat[i]; }
  56. };
  57.  
  58. template<class T>
  59. SPStringList Assoc<T>::keys(void)
  60. {
  61.     SPStringList r;
  62.     for(int i=0;i<dat.scalar();i++)
  63.     r.push(dat[i].key());
  64.     return r;
  65. }    
  66.  
  67. template<class T>
  68. SPList<T> Assoc<T>::values(void)
  69. {
  70.     SPList<T> r;
  71.     for(int i=0;i<dat.scalar();i++)
  72.     r.push(dat[i].value());
  73.     return r;
  74. }
  75.  
  76. template<class T>
  77. T& Assoc<T>::operator()(const SPString& k)
  78. {
  79.     for(int i=0;i<dat.scalar();i++){
  80.     if(k == dat[i].key()) return dat[i].value();
  81.     }
  82.     
  83.     dat.push(Binar<T>(k, def.value()));
  84.     return dat[i].value();
  85. }
  86.  
  87. template<class T>
  88. T Assoc<T>::adelete(const SPString& k)
  89. {
  90.     for(int i=0;i<dat.scalar();i++){
  91.     if(k == dat[i].key()){
  92.         T r= dat[i].value();
  93.         dat.splice(i, 1);
  94.         return r;
  95.     }
  96.     }
  97.     
  98.     return def.value();
  99. }
  100.  
  101. template<class T>
  102. int Assoc<T>::isin(const SPString& k) const
  103. {
  104.     for(int i=0;i<dat.scalar();i++){
  105.     if(k == dat[i].key()) return i+1;
  106.     }
  107.     return 0;
  108. }
  109.  
  110. template<class T>
  111. ostream& operator<<(ostream& os, Binar<T>& a)
  112. {
  113.     os << "(" << a.key() << ", " << a.value() << ")";
  114.     return os;
  115. }
  116.  
  117. template<class T>
  118. ostream& operator<<(ostream& os, Assoc<T>& a)
  119. {
  120.     for(int i=0;i<a.scalar();i++){
  121. #ifdef    TEST
  122.     os << "[" << i << "] " << a[i] << endl;
  123. #else
  124.     os << a[i] << endl;
  125. #endif
  126.     }
  127.     return os;
  128. }
  129.  
  130. #if 0
  131. template<class T>
  132. istream& operator>>(istream& s, Binar<T>& a)
  133. {
  134. char c= 0;
  135.  
  136.     s >> c;
  137.     if(c == '('){
  138.     s >> a.key()
  139.     }
  140.     os << "(" << a.key() << ", " << a.value() << ")";
  141.     return os;
  142. }
  143. #endif
  144. #endif
  145.