package org.apache.samoa.moa.core;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import java.util.ArrayList;
import java.util.Collection;

import org.apache.samoa.moa.AbstractMOAObject;
import org.apache.samoa.moa.MOAObject;

/**
 * Vector with the capability of automatic expansion.
 * 
 * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
 * @version $Revision: 7 $
 */
public class AutoExpandVector<T> extends ArrayList<T> implements MOAObject {

  private static final long serialVersionUID = 1L;

  public AutoExpandVector() {
    super(0);
  }

  public AutoExpandVector(int size) {
    super(size);
  }

  @Override
  public void add(int pos, T obj) {
    if (pos > size()) {
      while (pos > size()) {
        add(null);
      }
      trimToSize();
    }
    super.add(pos, obj);
  }

  @Override
  public T get(int pos) {
    return ((pos >= 0) && (pos < size())) ? super.get(pos) : null;
  }

  @Override
  public T set(int pos, T obj) {
    if (pos >= size()) {
      add(pos, obj);
      return null;
    }
    return super.set(pos, obj);
  }

  @Override
  public boolean add(T arg0) {
    boolean result = super.add(arg0);
    trimToSize();
    return result;
  }

  @Override
  public boolean addAll(Collection<? extends T> arg0) {
    boolean result = super.addAll(arg0);
    trimToSize();
    return result;
  }

  @Override
  public boolean addAll(int arg0, Collection<? extends T> arg1) {
    boolean result = super.addAll(arg0, arg1);
    trimToSize();
    return result;
  }

  @Override
  public void clear() {
    super.clear();
    trimToSize();
  }

  @Override
  public T remove(int arg0) {
    T result = super.remove(arg0);
    trimToSize();
    return result;
  }

  @Override
  public boolean remove(Object arg0) {
    boolean result = super.remove(arg0);
    trimToSize();
    return result;
  }

  @Override
  protected void removeRange(int arg0, int arg1) {
    super.removeRange(arg0, arg1);
    trimToSize();
  }

  @Override
  public MOAObject copy() {
    return AbstractMOAObject.copy(this);
  }

  @Override
  public int measureByteSize() {
    return AbstractMOAObject.measureByteSize(this);
  }

  @Override
  public void getDescription(StringBuilder sb, int indent) {
    // TODO Auto-generated method stub
  }
}
