summaryrefslogtreecommitdiff
path: root/graphics/asymptote/tests/template/imports/pureset.asy
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/tests/template/imports/pureset.asy')
-rw-r--r--graphics/asymptote/tests/template/imports/pureset.asy116
1 files changed, 116 insertions, 0 deletions
diff --git a/graphics/asymptote/tests/template/imports/pureset.asy b/graphics/asymptote/tests/template/imports/pureset.asy
new file mode 100644
index 0000000000..472a37ccb4
--- /dev/null
+++ b/graphics/asymptote/tests/template/imports/pureset.asy
@@ -0,0 +1,116 @@
+typedef import(T);
+
+struct Set_T {
+ int size();
+ bool empty() {
+ return size() == 0;
+ }
+ bool contains(T item);
+ bool insert(T item);
+ T replace(T item); // Inserts item, and returns the item that was
+ // replaced, or emptyresponse if no item was replaced.
+ T get(T item);
+ bool delete(T item);
+ // Calls process on each item in the collection until process returns false.
+ void forEach(bool process(T item));
+}
+
+struct NaiveSet_T {
+ private T[] buffer = new T[0];
+ private T emptyresponse;
+ private bool equiv(T a, T b);
+
+ void operator init(bool equiv(T a, T b), T emptyresponse) {
+ this.equiv = equiv;
+ this.emptyresponse = emptyresponse;
+ }
+
+ int size() {
+ return buffer.length;
+ }
+
+ bool contains(T item) {
+ for (T a : buffer) {
+ if (equiv(a, item)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool insert(T item) {
+ if (contains(item)) {
+ return false;
+ }
+ buffer.push(item);
+ return true;
+ }
+
+ T replace(T item) {
+ for (int i = 0; i < buffer.length; ++i) {
+ if (equiv(buffer[i], item)) {
+ T old = buffer[i];
+ buffer[i] = item;
+ return old;
+ }
+ }
+ buffer.push(item);
+ return emptyresponse;
+ }
+
+ T get(T item) {
+ for (T a : buffer) {
+ if (equiv(a, item)) {
+ return a;
+ }
+ }
+ return emptyresponse;
+ }
+
+ bool delete(T item) {
+ for (int i = 0; i < buffer.length; ++i) {
+ if (equiv(buffer[i], item)) {
+ buffer[i] = buffer[buffer.length - 1];
+ buffer.pop();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void forEach(bool process(T item)) {
+ for (T a : buffer) {
+ if (!process(a)) {
+ return;
+ }
+ }
+ }
+
+}
+
+Set_T operator cast(NaiveSet_T naiveSet) {
+ Set_T set = new Set_T;
+ set.size = naiveSet.size;
+ set.contains = naiveSet.contains;
+ set.insert = naiveSet.insert;
+ set.replace = naiveSet.replace;
+ set.get = naiveSet.get;
+ set.delete = naiveSet.delete;
+ set.forEach = naiveSet.forEach;
+ return set;
+}
+
+T[] operator cast(Set_T set) {
+ T[] buffer = new T[set.size()];
+ int i = 0;
+ set.forEach(new bool(T item) {
+ buffer[i] = item;
+ ++i;
+ return true;
+ });
+ return buffer;
+}
+
+Set_T makeNaiveSet(bool equiv(T, T), T emptyresponse) {
+ return NaiveSet_T(equiv, emptyresponse);
+} \ No newline at end of file