/*
 *  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 java.nio;

/** Provide factory service of buffer classes.
 * <p>
 * Since all buffer impl classes are package private (except DirectByteBuffer), this factory is the only entrance to access buffer
 * functions from outside of the impl package.
 * </p>
 */
final class BufferFactory {

	/** Returns a new byte buffer based on the specified byte array.
	 * 
	 * @param array The byte array
	 * @return A new byte buffer based on the specified byte array. */
	public static ByteBuffer newByteBuffer (byte array[]) {
		return new ReadWriteHeapByteBuffer(array);
	}

	/** Returns a new array based byte buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based byte buffer with the specified capacity. */
	public static ByteBuffer newByteBuffer (int capacity) {
		return new ReadWriteHeapByteBuffer(capacity);
	}

	/** Returns a new char buffer based on the specified char array.
	 * 
	 * @param array The char array
	 * @return A new char buffer based on the specified char array. */
	public static CharBuffer newCharBuffer (char array[]) {
		return new ReadWriteCharArrayBuffer(array);
	}

	/** Returns a new readonly char buffer based on the specified char sequence.
	 * 
	 * @param chseq The char sequence
	 * @return A new readonly char buffer based on the specified char sequence. */
	public static CharBuffer newCharBuffer (CharSequence chseq) {
		return new CharSequenceAdapter(chseq);
	}

	/** Returns a new array based char buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based char buffer with the specified capacity. */
	public static CharBuffer newCharBuffer (int capacity) {
		return new ReadWriteCharArrayBuffer(capacity);
	}

	/** Returns a new direct byte buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new direct byte buffer with the specified capacity. */
	public static ByteBuffer newDirectByteBuffer (int capacity) {
		return new DirectReadWriteByteBuffer(capacity);
	}

	/** Returns a new double buffer based on the specified double array.
	 * 
	 * @param array The double array
	 * @return A new double buffer based on the specified double array. */
	public static DoubleBuffer newDoubleBuffer (double array[]) {
		return new ReadWriteDoubleArrayBuffer(array);
	}

	/** Returns a new array based double buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based double buffer with the specified capacity. */
	public static DoubleBuffer newDoubleBuffer (int capacity) {
		return new ReadWriteDoubleArrayBuffer(capacity);
	}

	/** Returns a new float buffer based on the specified float array.
	 * 
	 * @param array The float array
	 * @return A new float buffer based on the specified float array. */
	public static FloatBuffer newFloatBuffer (float array[]) {
		return new ReadWriteFloatArrayBuffer(array);
	}

	/** Returns a new array based float buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based float buffer with the specified capacity. */
	public static FloatBuffer newFloatBuffer (int capacity) {
		return new ReadWriteFloatArrayBuffer(capacity);
	}

	/** Returns a new array based int buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based int buffer with the specified capacity. */
	public static IntBuffer newIntBuffer (int capacity) {
		return new ReadWriteIntArrayBuffer(capacity);
	}

	/** Returns a new int buffer based on the specified int array.
	 * 
	 * @param array The int array
	 * @return A new int buffer based on the specified int array. */
	public static IntBuffer newIntBuffer (int array[]) {
		return new ReadWriteIntArrayBuffer(array);
	}

	/** Returns a new array based long buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based long buffer with the specified capacity. */
	public static LongBuffer newLongBuffer (int capacity) {
		return new ReadWriteLongArrayBuffer(capacity);
	}

	/** Returns a new long buffer based on the specified long array.
	 * 
	 * @param array The long array
	 * @return A new long buffer based on the specified long array. */
	public static LongBuffer newLongBuffer (long array[]) {
		return new ReadWriteLongArrayBuffer(array);
	}

	/** Returns a new array based short buffer with the specified capacity.
	 * 
	 * @param capacity The capacity of the new buffer
	 * @return A new array based short buffer with the specified capacity. */
	public static ShortBuffer newShortBuffer (int capacity) {
		return new ReadWriteShortArrayBuffer(capacity);
	}

	/** Returns a new short buffer based on the specified short array.
	 * 
	 * @param array The short array
	 * @return A new short buffer based on the specified short array. */
	public static ShortBuffer newShortBuffer (short array[]) {
		return new ReadWriteShortArrayBuffer(array);
	}

}
