Package com.cburch.logisim.util

Source Code of com.cburch.logisim.util.ArraySet$ArrayIterator

/* Copyright (c) 2010, Carl Burch. License information is located in the
* com.cburch.logisim.Main source code and at www.cburch.com/logisim/. */

package com.cburch.logisim.util;

import java.util.AbstractSet;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class ArraySet<E> extends AbstractSet<E> {
  private static final Object[] EMPTY_ARRAY = new Object[0];
 
  private class ArrayIterator implements Iterator<E> {
    int itVersion = version;
    int pos = 0; // position of next item to return
    boolean hasNext = values.length > 0;
    boolean removeOk = false;
   
    public boolean hasNext() {
      return hasNext;
    }
   
    public E next() {
      if (itVersion != version) {
        throw new ConcurrentModificationException();
      } else if (!hasNext) {
        throw new NoSuchElementException();
      } else {
        @SuppressWarnings("unchecked")
        E ret = (E) values[pos];
        ++pos;
        hasNext = pos < values.length;
        removeOk = true;
        return ret;
      }
    }
   
    public void remove() {
      if (itVersion != version) {
        throw new ConcurrentModificationException();
      } else if (!removeOk) {
        throw new IllegalStateException();
      } else if (values.length == 1) {
        values = EMPTY_ARRAY;
        ++version;
        itVersion = version;
        removeOk = false;
      } else {
        Object[] newValues = new Object[values.length - 1];
        if (pos > 1) {
          System.arraycopy(values, 0, newValues, 0, pos - 1);
        }
        if (pos < values.length) {
          System.arraycopy(values, pos, newValues, pos - 1, values.length - pos);
        }
        values = newValues;
        --pos;
        ++version;
        itVersion = version;
        removeOk = false;
      }
    }
  }
 
  private int version = 0;
  private Object[] values = EMPTY_ARRAY;
 
  public ArraySet() { }
 
  @Override
  public Object[] toArray() {
    return values;
  }
 
  @Override
  public Object clone() {
    ArraySet<E> ret = new ArraySet<E>();
    if (this.values == EMPTY_ARRAY) {
      ret.values = EMPTY_ARRAY;
    } else {
      ret.values = this.values.clone();
    }
    return ret;
  }
 
  @Override
  public void clear() {
    values = EMPTY_ARRAY;
    ++version;
  }
 
  @Override
  public boolean isEmpty() {
    return values.length == 0;
  }

  @Override
  public int size() {
    return values.length;
  }
 
  @Override
  public boolean add(Object value) {
    int n = values.length;
    for (int i = 0; i < n; i++) {
      if (values[i].equals(value)) return false;
    }
   
    Object[] newValues = new Object[n + 1];
    System.arraycopy(values, 0, newValues, 0, n);
    newValues[n] = value;
    values = newValues;
    ++version;
    return true;
  }
 
  @Override
  public boolean contains(Object value) {
    for (int i = 0, n = values.length; i < n; i++) {
      if (values[i].equals(value)) return true;
    }
    return false;
  }

  @Override
  public Iterator<E> iterator() {
    return new ArrayIterator();
  }
 
  public static void main(String[] args) throws java.io.IOException {
    ArraySet<String> set = new ArraySet<String>();
    java.io.BufferedReader in = new java.io.BufferedReader(
        new java.io.InputStreamReader(System.in));
    while (true) {
      System.out.print(set.size() + ":"); //OK
      for (String str : set) {
        System.out.print(" " + str); //OK
      }
      System.out.println(); //OK
      System.out.print("> "); //OK
      String cmd = in.readLine();
      if (cmd == null) break;
      cmd = cmd.trim();
      if (cmd.equals("")) {
        ;
      } else if (cmd.startsWith("+")) {
        set.add(cmd.substring(1));
      } else if (cmd.startsWith("-")) {
        set.remove(cmd.substring(1));
      } else if (cmd.startsWith("?")) {
        boolean ret = set.contains(cmd.substring(1));
        System.out.println("  " + ret); //OK
      } else {
        System.out.println("unrecognized command"); //OK
      }
    }
  }
}
TOP

Related Classes of com.cburch.logisim.util.ArraySet$ArrayIterator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.