/*
 * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.net4j.util;

import java.lang.reflect.Array;

/**
 * Various static helper methods.
 *
 * @author Eike Stepper
 * @since 3.4
 */
public final class ArrayUtil
{
  private ArrayUtil()
  {
  }

  public static <T> T[] add(T[] array, T element)
  {
    int length = array.length;

    @SuppressWarnings("unchecked")
    T[] newArray = (T[])Array.newInstance(array.getClass().getComponentType(), length + 1);

    System.arraycopy(array, 0, newArray, 0, length);
    newArray[length] = element;
    return newArray;
  }

  public static <T> T[] remove(T[] array, T element)
  {
    int length = array.length;
    for (int i = 0; i < array.length; i++)
    {
      T t = array[i];
      if (ObjectUtil.equals(t, element))
      {
        @SuppressWarnings("unchecked")
        T[] newArray = (T[])Array.newInstance(array.getClass().getComponentType(), length - 1);

        if (i != 0)
        {
          System.arraycopy(array, 0, newArray, 0, i);
        }

        int next = i + 1;
        if (next <= length)
        {
          System.arraycopy(array, next, newArray, i, length - next);
        }

        return newArray;
      }
    }

    return array;
  }

  public static String toString(Object[] array)
  {
    StringBuilder builder = new StringBuilder();
    builder.append('{');

    for (int i = 0; i < array.length; i++)
    {
      Object element = array[i];
      if (i != 0)
      {
        builder.append(", ");
      }

      builder.append(element);
    }

    builder.append('}');
    return builder.toString();
  }
}
