]> git.donarmstrong.com Git - lilypond.git/commitdiff
Import of flower-1.0.0
authorfred <fred>
Sat, 5 Oct 1996 16:27:22 +0000 (16:27 +0000)
committerfred <fred>
Sat, 5 Oct 1996 16:27:22 +0000 (16:27 +0000)
flower/assoc.hh [new file with mode: 0644]

diff --git a/flower/assoc.hh b/flower/assoc.hh
new file mode 100644 (file)
index 0000000..a217302
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef ASSOC_HH
+#define ASSOC_HH
+
+#include "vray.hh"
+
+template<class K,class V>
+struct Assoc_ent_ {
+    bool free;
+    K key;
+    V val;
+};
+
+template<class K, class V>
+struct Assoc {
+    svec< Assoc_ent_<K,V> > arr;
+
+    /****************/
+    
+    int find(K key) const {
+       for (int i = 0; i < arr.sz(); i++) {
+           if (!arr[i].free && key == arr[i].key)
+               return i;
+       }
+       return -1;
+    }
+    int find_creat(K key) {
+       int free = -1;
+       for (int i = 0; i < arr.sz(); i++) {
+           if (key == arr[i].key) {            
+               return i;
+           } else if (arr[i].free ) {
+               free = i;
+           }
+       }
+       if (free >= 0){
+           arr[free].free = false;
+           arr[free].key = key;
+           return free;
+       }
+
+       Assoc_ent_<K,V> ae;
+       ae.free = false;
+       ae.key = key;
+       arr.add(ae);
+       return arr.sz() -1;
+    }
+public:
+    bool elt_query(K key) const {
+       return find(key) >= 0;
+    }
+    void del(K key) {
+       assert(elt_query(key));
+       int i= find(key);
+       arr[i].free = true;
+    }
+    void
+    add(K key, V val) {
+       int i = find_creat(key);
+       arr[i].val = val;
+    }
+    /**
+    should create "set" template
+    */
+    V& operator[](K key) {
+       return arr[find_creat(key)].val;
+    }
+    const V& operator[](K key) const {
+       assert(elt_query(key));
+       return arr[find(key)].val;
+    }
+
+};
+#endif