/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

package backtype.storm.utils;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListDelegate implements List<Object> {
  private List<Object> delegate;

  public void setDelegate(List<Object> delegate) {
    this.delegate = delegate;
  }

  @Override
  public int size() {
    return delegate.size();
  }

  @Override
  public boolean isEmpty() {
    return delegate.isEmpty();
  }

  @Override
  public boolean contains(Object o) {
    return delegate.contains(o);
  }

  @Override
  public Iterator<Object> iterator() {
    return delegate.iterator();
  }

  @Override
  public Object[] toArray() {
    return delegate.toArray();
  }

  @Override
  public <T> T[] toArray(T[] ts) {
    return delegate.toArray(ts);
  }

  @Override
  public boolean add(Object e) {
    return delegate.add(e);
  }

  @Override
  public boolean remove(Object o) {
    return delegate.remove(o);
  }

  @Override
  public boolean containsAll(Collection<?> clctn) {
    return delegate.containsAll(clctn);
  }

  @Override
  public boolean addAll(Collection<? extends Object> clctn) {
    return delegate.addAll(clctn);
  }

  @Override
  public boolean addAll(int i, Collection<? extends Object> clctn) {
    return delegate.addAll(i, clctn);
  }

  @Override
  public boolean removeAll(Collection<?> clctn) {
    return delegate.removeAll(clctn);
  }

  @Override
  public boolean retainAll(Collection<?> clctn) {
    return delegate.retainAll(clctn);
  }

  @Override
  public void clear() {
    delegate.clear();
  }

  @Override
  public Object get(int i) {
    return delegate.get(i);
  }

  @Override
  public Object set(int i, Object e) {
    return delegate.set(i, e);
  }

  @Override
  public void add(int i, Object e) {
    delegate.add(i, e);
  }

  @Override
  public Object remove(int i) {
    return delegate.remove(i);
  }

  @Override
  public int indexOf(Object o) {
    return delegate.indexOf(o);
  }

  @Override
  public int lastIndexOf(Object o) {
    return delegate.lastIndexOf(o);
  }

  @Override
  public ListIterator<Object> listIterator() {
    return delegate.listIterator();
  }

  @Override
  public ListIterator<Object> listIterator(int i) {
    return delegate.listIterator(i);
  }

  @Override
  public List<Object> subList(int i, int i1) {
    return delegate.subList(i, i1);
  }

}
