From ad1cadf3512f3dd789151983e5c93af411f929db Mon Sep 17 00:00:00 2001
From: Tuowen Zhao <ztuowen@gmail.com>
Date: Sat, 17 Sep 2016 19:27:15 +0000
Subject: restructure

---
 omegalib/omega_lib/include/basic/Map.h | 68 ++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100644 omegalib/omega_lib/include/basic/Map.h

(limited to 'omegalib/omega_lib/include/basic/Map.h')

diff --git a/omegalib/omega_lib/include/basic/Map.h b/omegalib/omega_lib/include/basic/Map.h
new file mode 100644
index 0000000..f94a10c
--- /dev/null
+++ b/omegalib/omega_lib/include/basic/Map.h
@@ -0,0 +1,68 @@
+#if ! defined _Map_h
+#define _Map_h 1
+
+#include <basic/Link.h>
+#include <stdio.h>  // for NULL
+
+namespace omega {
+
+#define foreach_map(k,K,v,V,M,A) {for (omega::MapElementIterator<K,V> __M_##k = (M).iterator();__M_##k;__M_##k++) {K & k = *__M_##k; V & v = __M_##k.value(); A;}}
+
+template <class K, class V> class MapElement {
+public:
+	K k;
+	V v;
+	MapElement<K,V> *tail;
+	MapElement(const MapElement<K,V>&);
+	MapElement() {}
+	MapElement & operator=(const MapElement<K,V>&);
+	~MapElement() {	delete tail; }
+};
+
+template<class K, class V> class MapElementIterator {
+public:
+    MapElementIterator(MapElement<K,V>* j) { i = j;}
+    virtual const K &  operator*() const   { return i->k; }
+    virtual       K &  operator*()         { return i->k;}
+    virtual const V &  value() const       { return i->v; }
+    virtual	  V &  value()             { return i->v; }
+    virtual    void    operator++(int)        { i = i->tail; }
+    virtual    void    operator++()           { i = i->tail; }
+    virtual    bool    live() const        { return i != NULL; }
+	               operator bool() const { return live(); }
+protected:
+MapElement<K,V> *i;
+};
+
+template <class K, class V> class Map {
+public:
+#if ! defined linux
+	Map(const V &default_value);
+#else
+    //  work around for '386 g++ on Linux
+	Map(V default_value);
+#endif
+	~Map();
+	MapElementIterator<K,V> iterator() 
+		{return MapElementIterator<K,V>(contents);}
+	int empty() const {return contents == NULL;}
+	V  operator()(K) const;
+	V& operator[](K);
+private:
+	MapElement<K,V> *  contents;
+	V _default_value;
+};
+
+} // namespace
+
+#if ! defined DONT_INCLUDE_TEMPLATE_CODE
+#include <basic/Map.c>
+#endif
+
+#define instantiate_Map(T1,T2)	template class Map<T1,T2>; \
+				template class MapElement<T1,T2>; \
+				template class MapElementIterator<T1,T2>;
+#define instantiate_MapElement(T1,T2)		instantiate_Map(T1,T2)
+#define instantiate_MapElementIterator(T1,T2)	instantiate_Map(T1,T2)
+
+#endif
-- 
cgit v1.2.3-70-g09d2