// Path: hppc/src/main/templates/com/carrotsearch/hppc/cursors/KTypeCursor.java
// public final class KTypeCursor<KType> {
//   /**
//    * The current value's index in the container this cursor belongs to. The
//    * meaning of this index is defined by the container (usually it will be an
//    * index in the underlying storage buffer).
//    */
//   public int index;
// 
//   /**
//    * The current value.
//    */
//   public KType value;
// 
//   @Override
//   public String toString() {
//     return "[cursor, index: " + index + ", value: " + value + "]";
//   }
// }
// 
// Path: hppc/src/main/templates/com/carrotsearch/hppc/predicates/KTypePredicate.java
// public interface KTypePredicate<KType> {
//   public boolean apply(KType value);
// }
// 
// Path: hppc/src/main/templates/com/carrotsearch/hppc/procedures/KTypeProcedure.java
// public interface KTypeProcedure<KType> {
//   public void apply(KType value);
// }


import java.util.Iterator;
import com.carrotsearch.hppc.cursors.KTypeCursor;
import com.carrotsearch.hppc.predicates.KTypePredicate;
import com.carrotsearch.hppc.procedures.KTypeProcedure;
package com.carrotsearch.hppc;



/**
 * A generic container holding <code>KType</code>s.
 */
/*! ${TemplateOptions.generatedAnnotation} !*/
public interface KTypeContainer<KType> extends Iterable<KTypeCursor<KType>> {
  /**
   * Returns an iterator to a cursor traversing the collection. The order of
   * traversal is not defined. More than one cursor may be active at a time. The
   * behavior of iterators is undefined if structural changes are made to the
   * underlying collection.
   * 
   * <p>
   * The iterator is implemented as a cursor and it returns <b>the same cursor
   * instance</b> on every call to {@link Iterator#next()} (to avoid boxing of
   * primitive types). To read the current list's value (or index in the list)
   * use the cursor's public fields. An example is shown below.
   * </p>
   * 
   * <pre>
   * for (KTypeCursor&lt;KType&gt; c : container) {
   *   System.out.println(&quot;index=&quot; + c.index + &quot; value=&quot; + c.value);
   * }
   * </pre>
   */
  public Iterator<KTypeCursor<KType>> iterator();

  /**
   * Lookup a given element in the container. This operation has no speed
   * guarantees (may be linear with respect to the size of this container).
   * 
   * @return Returns <code>true</code> if this container has an element equal to
   *         <code>e</code>.
   */
  public boolean contains(KType e);

  /**
   * Return the current number of elements in this container. The time for
   * calculating the container's size may take <code>O(n)</code> time, although
   * implementing classes should try to maintain the current size and return in
   * constant time.
   */
  public int size();

  /**
   * Shortcut for <code>size() == 0</code>.
   */
  public boolean isEmpty();

  /**
   * Copies all elements of this container to an array.
   * 
   * The returned array is always a copy, regardless of the storage used by the
   * container.
   */
  /*! #if ($TemplateOptions.KTypePrimitive)   
  public KType [] toArray();
      #else !*/
  public Object[] toArray();
  /*! #end !*/

  /* #if ($TemplateOptions.KTypeGeneric) */
  /**
   * Copies all elements of this container to a dynamically created array of the
   * given component type.
   * 
   * @throws ArrayStoreException Thrown if this container's elements are not 
   * assignable to the array's component type.
   */
// Path: hppc/src/main/templates/com/carrotsearch/hppc/cursors/KTypeCursor.java
// public final class KTypeCursor<KType> {
//   /**
//    * The current value's index in the container this cursor belongs to. The
//    * meaning of this index is defined by the container (usually it will be an
//    * index in the underlying storage buffer).
//    */
//   public int index;
// 
//   /**
//    * The current value.
//    */
//   public KType value;
// 
//   @Override
//   public String toString() {
//     return "[cursor, index: " + index + ", value: " + value + "]";
//   }
// }
// 
// Path: hppc/src/main/templates/com/carrotsearch/hppc/predicates/KTypePredicate.java
// public interface KTypePredicate<KType> {
//   public boolean apply(KType value);
// }
// 
// Path: hppc/src/main/templates/com/carrotsearch/hppc/procedures/KTypeProcedure.java
// public interface KTypeProcedure<KType> {
//   public void apply(KType value);
// }


// Path: hppc/src/main/templates/com/carrotsearch/hppc/KTypeContainer.java
import java.util.Iterator;
import com.carrotsearch.hppc.cursors.KTypeCursor;
import com.carrotsearch.hppc.predicates.KTypePredicate;
import com.carrotsearch.hppc.procedures.KTypeProcedure;

package com.carrotsearch.hppc;



/**
 * A generic container holding <code>KType</code>s.
 */
/*! ${TemplateOptions.generatedAnnotation} !*/
public interface KTypeContainer<KType> extends Iterable<KTypeCursor<KType>> {
  /**
   * Returns an iterator to a cursor traversing the collection. The order of
   * traversal is not defined. More than one cursor may be active at a time. The
   * behavior of iterators is undefined if structural changes are made to the
   * underlying collection.
   * 
   * <p>
   * The iterator is implemented as a cursor and it returns <b>the same cursor
   * instance</b> on every call to {@link Iterator#next()} (to avoid boxing of
   * primitive types). To read the current list's value (or index in the list)
   * use the cursor's public fields. An example is shown below.
   * </p>
   * 
   * <pre>
   * for (KTypeCursor&lt;KType&gt; c : container) {
   *   System.out.println(&quot;index=&quot; + c.index + &quot; value=&quot; + c.value);
   * }
   * </pre>
   */
  public Iterator<KTypeCursor<KType>> iterator();

  /**
   * Lookup a given element in the container. This operation has no speed
   * guarantees (may be linear with respect to the size of this container).
   * 
   * @return Returns <code>true</code> if this container has an element equal to
   *         <code>e</code>.
   */
  public boolean contains(KType e);

  /**
   * Return the current number of elements in this container. The time for
   * calculating the container's size may take <code>O(n)</code> time, although
   * implementing classes should try to maintain the current size and return in
   * constant time.
   */
  public int size();

  /**
   * Shortcut for <code>size() == 0</code>.
   */
  public boolean isEmpty();

  /**
   * Copies all elements of this container to an array.
   * 
   * The returned array is always a copy, regardless of the storage used by the
   * container.
   */
  /*! #if ($TemplateOptions.KTypePrimitive)   
  public KType [] toArray();
      #else !*/
  public Object[] toArray();
  /*! #end !*/

  /* #if ($TemplateOptions.KTypeGeneric) */
  /**
   * Copies all elements of this container to a dynamically created array of the
   * given component type.
   * 
   * @throws ArrayStoreException Thrown if this container's elements are not 
   * assignable to the array's component type.
   */
  public <T> T[] toArray(Class<T> componentClass);