/*
 * Copyright 2005-2008 Jeremy Haile
 *
 * 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.
 */
package org.jsecurity.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;

/**
 * Static helper class for use dealing with Arrays.
 * @author Jeremy Haile
 * @since 0.9
 */
public class CollectionUtils {

  public static <E> LinkedHashSet<E> newLinkedHashSet(E... elements) {
    LinkedHashSet<E> set = new LinkedHashSet<E>(elements.length * 4 / 3 + 1);
    Collections.addAll(set, elements);
    return set;
  }

    public static <E> ArrayList<E> newArrayList(E... elements) {
      // Avoid integer overflow when a large array is passed in
      int capacity = computeArrayListCapacity(elements.length);
      ArrayList<E> list = new ArrayList<E>(capacity);
      Collections.addAll(list, elements);
      return list;
    }

    static int computeArrayListCapacity(int arraySize) {
      return (int) Math.min(5L + arraySize + (arraySize / 10), Integer.MAX_VALUE);
    }


}
