diff options
Diffstat (limited to 'graphics/asymptote/tests/template/imports/pureset.asy')
-rw-r--r-- | graphics/asymptote/tests/template/imports/pureset.asy | 116 |
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 |