summaryrefslogtreecommitdiff
path: root/graphics/asymptote/base/map.asy
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/base/map.asy')
-rw-r--r--graphics/asymptote/base/map.asy40
1 files changed, 40 insertions, 0 deletions
diff --git a/graphics/asymptote/base/map.asy b/graphics/asymptote/base/map.asy
new file mode 100644
index 0000000000..2b2277b956
--- /dev/null
+++ b/graphics/asymptote/base/map.asy
@@ -0,0 +1,40 @@
+// Create a struct <name> parameterized by types <key> and <value>,
+// that maps keys to values, defaulting to the value in <default>.
+void mapTemplate(string name, string key, string value, string default)
+{
+ type(key,"Key");
+ type(value,"Value");
+ eval("Value default="+default,true);
+
+ eval("
+ struct keyValue {
+ Key key;
+ Value T;
+ void operator init(Key key) {
+ this.key=key;
+ }
+ void operator init(Key key, Value T) {
+ this.key=key;
+ this.T=T;
+ }
+ }
+
+ struct map {
+ keyValue[] M;
+ bool operator < (keyValue a, keyValue b) {return a.key < b.key;}
+
+ void add(Key key, Value T) {
+ keyValue m=keyValue(key,T);
+ M.insert(search(M,m,operator <)+1,m);
+ }
+ Value lookup(Key key) {
+ int i=search(M,keyValue(key),operator <);
+ if(i >= 0 && M[i].key == key) return M[i].T;
+ return default;
+ }
+ }
+",true);
+
+ type("map",name);
+}
+