diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/Memoizer.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/Memoizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..ece7e391574fb962f7f28d06e876e97693b2d970
--- /dev/null
+++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/Memoizer.java
@@ -0,0 +1,84 @@
+package com.amd.aparapi.internal.model;
+
+import java.util.NoSuchElementException;
+import java.util.concurrent.atomic.AtomicReference;
+
+interface Optional<E> {
+ final class Some<E> implements Optional<E>{
+ private final E value;
+
+ static final <E> Optional<E> of(E value) {
+ return new Some<>(value);
+ }
+
+ private Some(E value) {
+ this.value = value;
+ }
+
+ @Override public E get() {
+ return value;
+ }
+
+ @Override public boolean isPresent() {
+ return true;
+ }
+ }
+
+ final class None<E> implements Optional<E>{
+ @SuppressWarnings("unchecked") static <E> Optional<E> none() {
+ return none;
+ }
+
+ @SuppressWarnings("rawtypes") private static final None none = new None();
+
+ private None() {
+ // Do nothing
+ }
+
+ @Override public E get() {
+ throw new NoSuchElementException("No value present");
+ }
+
+ @Override public boolean isPresent() {
+ return false;
+ }
+ }
+
+ E get();
+
+ boolean isPresent();
+}
+
+public interface Memoizer<T> extends Supplier<T>{
+ public final class Impl<T> implements Memoizer<T>{
+ private final Supplier<T> supplier;
+
+ private final AtomicReference<Optional<T>> valueRef = new AtomicReference<>(Optional.None.<T> none());
+
+ Impl(Supplier<T> supplier) {
+ this.supplier = supplier;
+ }
+
+ @Override public T get() {
+ Optional<T> value = valueRef.get();
+ while (!value.isPresent()) {
+ Optional<T> newValue = Optional.Some.of(supplier.get());
+ if (valueRef.compareAndSet(value, newValue)) {
+ value = newValue;
+ break;
+ }
+ value = valueRef.get();
+ }
+ return value.get();
+ }
+
+ public static <T> Memoizer<T> of(Supplier<T> supplier) {
+ return new Impl<>(supplier);
+ }
+ }
+
+ // static <T> Memoizer<T> of(Supplier<T> supplier)
+ // {
+ // return new Impl<>(supplier);
+ // }
+}