// Path: src/main/java/io/usethesource/capsule/MapFactory.java
// public class MapFactory {
// 
//   // private final Class<? extends Immutable<?, ?>> targetClass;
// 
//   private final Method persistentMapOfEmpty;
//   private final Method persistentMapOfKeyValuePairs;
// 
//   private final Method transientMapOfEmpty;
//   private final Method transientMapOfKeyValuePairs;
// 
//   public MapFactory(Class<?> targetClass) {
//     // this.targetClass = targetClass;
// 
//     try {
//       persistentMapOfEmpty = targetClass.getMethod("of");
//       persistentMapOfKeyValuePairs = targetClass.getMethod("of", Object[].class);
// 
//       transientMapOfEmpty = targetClass.getMethod("transientOf");
//       transientMapOfKeyValuePairs = targetClass.getMethod("transientOf", Object[].class);
//     } catch (NoSuchMethodException | SecurityException e) {
//       e.printStackTrace();
//       throw new RuntimeException(e);
//     }
//   }
// 
//   // public Class<? extends Immutable<?, ?>> getTargetClass() {
//   // return targetClass;
//   // }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Immutable<K, V> of() {
//     try {
//       return (Map.Immutable<K, V>) persistentMapOfEmpty.invoke(null);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   public final <K, V> Map.Immutable<K, V> of(Object... keyValuePairs) {
//     try {
//       return (Map.Immutable<K, V>) persistentMapOfKeyValuePairs
//           .invoke(null, (Object) keyValuePairs);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Transient<K, V> transientOf() {
//     try {
//       return (Map.Transient<K, V>) transientMapOfEmpty.invoke(null);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Transient<K, V> transientOf(Object... keyValuePairs) {
//     try {
//       return (Map.Transient<K, V>) transientMapOfKeyValuePairs.invoke(null, (Object) keyValuePairs);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       e.printStackTrace();
//       throw new RuntimeException(e);
//     }
//   }
// 
// }
// 
// Path: src/main/java/io/usethesource/criterion/api/JmhValue.java
// @CompilerControl(Mode.DONT_INLINE)
// public interface JmhValue {
// 
//   /**
//    * Removes the JmhValue delegation object to reveal its internal representation.
//    *
//    * @return internal representation
//    */
//   Object unwrap();
// 
// }
// 
// Path: src/main/java/io/usethesource/criterion/impl/AbstractMapBuilder.java
// public class AbstractMapBuilder<C extends JmhValue, CC> implements JmhMap.Builder {
// 
//   protected CC mapContent;
//   protected JmhMap constructedMap;
// 
//   final Function<CC, JmhMap> functionWrap;
//   final Function<CC, BiFunction<JmhValue, JmhValue, CC>> methodInsert;
// 
//   public AbstractMapBuilder(final CC empty,
//       final Function<CC, BiFunction<JmhValue, JmhValue, CC>> methodInsert,
//       final Function<CC, JmhMap> functionWrap) {
// 
//     this.mapContent = empty;
//     this.constructedMap = null;
// 
//     this.methodInsert = methodInsert;
//     this.functionWrap = functionWrap;
//   }
// 
//   @Override
//   public final void put(JmhValue key, JmhValue value) {
//     checkMutation();
//     mapContent = methodInsert.apply(mapContent).apply(key, value);
//   }
// 
//   @Override
//   public final void putAll(JmhMap map) {
//     putAll(map.entryIterator());
//   }
// 
//   @Override
//   public final void putAll(java.util.Map<JmhValue, JmhValue> map) {
//     putAll(map.entrySet().iterator());
//   }
// 
//   private final void putAll(Iterator<Entry<JmhValue, JmhValue>> entryIterator) {
//     checkMutation();
// 
//     while (entryIterator.hasNext()) {
//       final Entry<JmhValue, JmhValue> entry = entryIterator.next();
//       final JmhValue key = entry.getKey();
//       final JmhValue value = entry.getValue();
// 
//       put(key, value);
//     }
//   }
// 
//   private void checkMutation() {
//     if (constructedMap != null) {
//       throw new UnsupportedOperationException("Mutation of a finalized map is not supported.");
//     }
//   }
// 
//   @Override
//   public final JmhMap done() {
//     if (constructedMap == null) {
//       constructedMap = functionWrap.apply(mapContent);
//     }
// 
//     return constructedMap;
//   }
// 
// }


import io.usethesource.capsule.Map;
import io.usethesource.capsule.MapFactory;
import io.usethesource.criterion.api.JmhValue;
import io.usethesource.criterion.impl.AbstractMapBuilder;
/**
 * Copyright (c) Michael Steindorfer <Centrum Wiskunde & Informatica> and Contributors.
 * All rights reserved.
 *
 * This file is licensed under the BSD 2-Clause License, which accompanies this project
 * and is available under https://opensource.org/licenses/BSD-2-Clause.
 */
package io.usethesource.criterion.impl.persistent.champ;


final class ChampMapBuilder extends
    AbstractMapBuilder<JmhValue, Map.Immutable<JmhValue, JmhValue>> {

// Path: src/main/java/io/usethesource/capsule/MapFactory.java
// public class MapFactory {
// 
//   // private final Class<? extends Immutable<?, ?>> targetClass;
// 
//   private final Method persistentMapOfEmpty;
//   private final Method persistentMapOfKeyValuePairs;
// 
//   private final Method transientMapOfEmpty;
//   private final Method transientMapOfKeyValuePairs;
// 
//   public MapFactory(Class<?> targetClass) {
//     // this.targetClass = targetClass;
// 
//     try {
//       persistentMapOfEmpty = targetClass.getMethod("of");
//       persistentMapOfKeyValuePairs = targetClass.getMethod("of", Object[].class);
// 
//       transientMapOfEmpty = targetClass.getMethod("transientOf");
//       transientMapOfKeyValuePairs = targetClass.getMethod("transientOf", Object[].class);
//     } catch (NoSuchMethodException | SecurityException e) {
//       e.printStackTrace();
//       throw new RuntimeException(e);
//     }
//   }
// 
//   // public Class<? extends Immutable<?, ?>> getTargetClass() {
//   // return targetClass;
//   // }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Immutable<K, V> of() {
//     try {
//       return (Map.Immutable<K, V>) persistentMapOfEmpty.invoke(null);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   public final <K, V> Map.Immutable<K, V> of(Object... keyValuePairs) {
//     try {
//       return (Map.Immutable<K, V>) persistentMapOfKeyValuePairs
//           .invoke(null, (Object) keyValuePairs);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Transient<K, V> transientOf() {
//     try {
//       return (Map.Transient<K, V>) transientMapOfEmpty.invoke(null);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       throw new RuntimeException(e);
//     }
//   }
// 
//   @SuppressWarnings("unchecked")
//   public final <K, V> Map.Transient<K, V> transientOf(Object... keyValuePairs) {
//     try {
//       return (Map.Transient<K, V>) transientMapOfKeyValuePairs.invoke(null, (Object) keyValuePairs);
//     } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
//       e.printStackTrace();
//       throw new RuntimeException(e);
//     }
//   }
// 
// }
// 
// Path: src/main/java/io/usethesource/criterion/api/JmhValue.java
// @CompilerControl(Mode.DONT_INLINE)
// public interface JmhValue {
// 
//   /**
//    * Removes the JmhValue delegation object to reveal its internal representation.
//    *
//    * @return internal representation
//    */
//   Object unwrap();
// 
// }
// 
// Path: src/main/java/io/usethesource/criterion/impl/AbstractMapBuilder.java
// public class AbstractMapBuilder<C extends JmhValue, CC> implements JmhMap.Builder {
// 
//   protected CC mapContent;
//   protected JmhMap constructedMap;
// 
//   final Function<CC, JmhMap> functionWrap;
//   final Function<CC, BiFunction<JmhValue, JmhValue, CC>> methodInsert;
// 
//   public AbstractMapBuilder(final CC empty,
//       final Function<CC, BiFunction<JmhValue, JmhValue, CC>> methodInsert,
//       final Function<CC, JmhMap> functionWrap) {
// 
//     this.mapContent = empty;
//     this.constructedMap = null;
// 
//     this.methodInsert = methodInsert;
//     this.functionWrap = functionWrap;
//   }
// 
//   @Override
//   public final void put(JmhValue key, JmhValue value) {
//     checkMutation();
//     mapContent = methodInsert.apply(mapContent).apply(key, value);
//   }
// 
//   @Override
//   public final void putAll(JmhMap map) {
//     putAll(map.entryIterator());
//   }
// 
//   @Override
//   public final void putAll(java.util.Map<JmhValue, JmhValue> map) {
//     putAll(map.entrySet().iterator());
//   }
// 
//   private final void putAll(Iterator<Entry<JmhValue, JmhValue>> entryIterator) {
//     checkMutation();
// 
//     while (entryIterator.hasNext()) {
//       final Entry<JmhValue, JmhValue> entry = entryIterator.next();
//       final JmhValue key = entry.getKey();
//       final JmhValue value = entry.getValue();
// 
//       put(key, value);
//     }
//   }
// 
//   private void checkMutation() {
//     if (constructedMap != null) {
//       throw new UnsupportedOperationException("Mutation of a finalized map is not supported.");
//     }
//   }
// 
//   @Override
//   public final JmhMap done() {
//     if (constructedMap == null) {
//       constructedMap = functionWrap.apply(mapContent);
//     }
// 
//     return constructedMap;
//   }
// 
// }


// Path: src/main/java/io/usethesource/criterion/impl/persistent/champ/ChampMapBuilder.java
import io.usethesource.capsule.Map;
import io.usethesource.capsule.MapFactory;
import io.usethesource.criterion.api.JmhValue;
import io.usethesource.criterion.impl.AbstractMapBuilder;

/**
 * Copyright (c) Michael Steindorfer <Centrum Wiskunde & Informatica> and Contributors.
 * All rights reserved.
 *
 * This file is licensed under the BSD 2-Clause License, which accompanies this project
 * and is available under https://opensource.org/licenses/BSD-2-Clause.
 */
package io.usethesource.criterion.impl.persistent.champ;


final class ChampMapBuilder extends
    AbstractMapBuilder<JmhValue, Map.Immutable<JmhValue, JmhValue>> {

  ChampMapBuilder(MapFactory mapFactory) {