Implement Atomix AsyncAtomicCounterMap, AtomicCounterMap and state machine.

Change-Id: Ifd7f60ae8dcfe7239e034a92654b4ef30ffe46ae
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitives.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitives.java
index 520b9a6..42fb57c 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitives.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DistributedPrimitives.java
@@ -15,13 +15,14 @@
  */
 package org.onosproject.store.primitives.impl;
 
-import java.util.function.Function;
-
+import org.onosproject.store.service.AsyncAtomicCounterMap;
 import org.onosproject.store.service.AsyncConsistentMap;
 import org.onosproject.store.service.AsyncConsistentMultimap;
 import org.onosproject.store.service.AsyncConsistentTreeMap;
 import org.onosproject.store.service.AsyncDistributedSet;
 
+import java.util.function.Function;
+
 /**
  * Misc utilities for working with {@code DistributedPrimitive}s.
  */
@@ -77,6 +78,22 @@
     }
 
     /**
+     * Creates an instance of {@code AsyncAtomicCounterMap} that transforms key types.
+     *
+     * @param map backing map
+     * @param keyEncoder transformer for key type of returned map to key type of input map
+     * @param keyDecoder transformer for key type of input map to key type of returned map
+     * @param <K1> returned map key type
+     * @param <K2> input map key type
+     * @return new counter map
+     */
+    public static <K1, K2> AsyncAtomicCounterMap<K1> newTranscodingAtomicCounterMap(AsyncAtomicCounterMap<K2> map,
+            Function<K1, K2> keyEncoder,
+            Function<K2, K1> keyDecoder) {
+        return new TranscodingAsyncAtomicCounterMap<>(map, keyEncoder, keyDecoder);
+    }
+
+    /**
      * Creates an instance of {@code AsyncConsistentMap} that transforms operations inputs and applies them
      * to corresponding operation in a different typed map and returns the output after reverse transforming it.
      *