class MapNumberer<T> implements Numberer<T> {

  final Map<T, Integer> map = new HashMap<T, Integer>();
  final ArrayList<T> al = new ArrayList<T>();
  int nextIndex = 1;

  public MapNumberer() {
    al.add(null);
  }

  @Override
  public void add(T o) {
    if (!map.containsKey(o)) {
      map.put(o, nextIndex);
      al.add(o);
      nextIndex++;
    }
  }

  @Override
  public T get(long number) {
    return al.get((int) number);
  }

  @Override
  public long get(Object o) {<FILL_FUNCTION_BODY>}

  @Override
  public int size() {
    /* subtract 1 for null */
    return nextIndex - 1;
  }

  public boolean contains(Object o) {
    return map.containsKey(o);
  }

  @Override
  public boolean remove(T o) {
    Integer i = map.remove(o);
    if (i == null) {
      return false;
    } else {
      al.set(i, null);
      return true;
    }
  }
}

    if (o == null) {
      return 0;
    }
    Integer i = map.get(o);
    if (i == null) {
      throw new RuntimeException("couldn't find " + o);
    }
    return i;
  
<no_super_class>