// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/ClassReflection.java
// public final class ClassReflection {
// 
//     /**
//      * Returns a {@link Constructor} that represents the public constructor for the supplied class which takes the supplied
//      * parameter types.
//      */
//     public static Constructor getConstructor(Class c, Class... parameterTypes) throws ReflectionException {
//         try {
//             return new Constructor(c.getConstructor(parameterTypes));
//         } catch (SecurityException e) {
//             throw new ReflectionException("Security violation occurred while getting constructor for class: '" + c.getName() + "'.", e);
//         } catch (NoSuchMethodException e) {
//             throw new ReflectionException("Constructor not found for class: " + c.getName(), e);
//         }
//     }
// 
//     /**
//      * Returns a {@link Constructor} that represents the constructor for the supplied class which takes the supplied parameter
//      * types.
//      */
//     public static Constructor getDeclaredConstructor(Class c, Class... parameterTypes) throws ReflectionException {
//         try {
//             return new Constructor(c.getDeclaredConstructor(parameterTypes));
//         } catch (SecurityException e) {
//             throw new ReflectionException("Security violation while getting constructor for class: " + c.getName(), e);
//         } catch (NoSuchMethodException e) {
//             throw new ReflectionException("Constructor not found for class: " + c.getName(), e);
//         }
//     }
// 
// }
// 
// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/Constructor.java
// public final class Constructor {
// 
//     private final java.lang.reflect.Constructor constructor;
// 
//     Constructor(java.lang.reflect.Constructor constructor) {
//         this.constructor = constructor;
//     }
// 
//     /**
//      * Returns an array of Class objects that represent the formal parameter types, in declaration order, of the constructor.
//      */
//     public Class[] getParameterTypes() {
//         return constructor.getParameterTypes();
//     }
// 
//     /**
//      * Returns the Class object representing the class or interface that declares the constructor.
//      */
//     public Class getDeclaringClass() {
//         return constructor.getDeclaringClass();
//     }
// 
//     public void setAccessible(boolean accessible) {
//         constructor.setAccessible(accessible);
//     }
// 
//     /**
//      * Uses the constructor to create and initialize a new instance of the constructor's declaring class, with the supplied
//      * initialization parameters.
//      */
//     public Object newInstance(Object... args) throws ReflectionException {
//         try {
//             return constructor.newInstance(args);
//         } catch (IllegalArgumentException e) {
//             throw new ReflectionException("Illegal argument(s) supplied to constructor for class: " + getDeclaringClass().getName(), e);
//         } catch (InstantiationException e) {
//             throw new ReflectionException("Could not instantiate instance of class: " + getDeclaringClass().getName(), e);
//         } catch (IllegalAccessException e) {
//             throw new ReflectionException("Could not instantiate instance of class: " + getDeclaringClass().getName(), e);
//         } catch (InvocationTargetException e) {
//             throw new ReflectionException("Exception occurred in constructor for class: " + getDeclaringClass().getName(), e);
//         }
//     }
// 
// }
// 
// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/ReflectionException.java
// public class ReflectionException extends Exception {
// 
//     public ReflectionException(String message, Throwable cause) {
//         super(message, cause);
//     }
// }


import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.Constructor;
import com.badlogic.gdx.utils.reflect.ReflectionException;
/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 *
 * 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 com.badlogic.gdx.utils;


/**
 * Pool that creates new instances of a type using reflection. The type must have a zero argument constructor.
 * {@link Constructor#setAccessible(boolean)} will be used if the class and/or constructor is not visible.
 *
 * @author Nathan Sweet
 */
public class ReflectionPool<T> extends Pool<T> {
    private final Constructor constructor;

    public ReflectionPool(Class<T> type) {
        this(type, 16, Integer.MAX_VALUE);
    }

    public ReflectionPool(Class<T> type, int initialCapacity) {
        this(type, initialCapacity, Integer.MAX_VALUE);
    }

    public ReflectionPool(Class<T> type, int initialCapacity, int max) {
        super(initialCapacity, max);
        constructor = findConstructor(type);
        if (constructor == null) {
            throw new RuntimeException("Class cannot be created (missing no-arg constructor): " + type.getName());
        }
    }

// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/ClassReflection.java
// public final class ClassReflection {
// 
//     /**
//      * Returns a {@link Constructor} that represents the public constructor for the supplied class which takes the supplied
//      * parameter types.
//      */
//     public static Constructor getConstructor(Class c, Class... parameterTypes) throws ReflectionException {
//         try {
//             return new Constructor(c.getConstructor(parameterTypes));
//         } catch (SecurityException e) {
//             throw new ReflectionException("Security violation occurred while getting constructor for class: '" + c.getName() + "'.", e);
//         } catch (NoSuchMethodException e) {
//             throw new ReflectionException("Constructor not found for class: " + c.getName(), e);
//         }
//     }
// 
//     /**
//      * Returns a {@link Constructor} that represents the constructor for the supplied class which takes the supplied parameter
//      * types.
//      */
//     public static Constructor getDeclaredConstructor(Class c, Class... parameterTypes) throws ReflectionException {
//         try {
//             return new Constructor(c.getDeclaredConstructor(parameterTypes));
//         } catch (SecurityException e) {
//             throw new ReflectionException("Security violation while getting constructor for class: " + c.getName(), e);
//         } catch (NoSuchMethodException e) {
//             throw new ReflectionException("Constructor not found for class: " + c.getName(), e);
//         }
//     }
// 
// }
// 
// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/Constructor.java
// public final class Constructor {
// 
//     private final java.lang.reflect.Constructor constructor;
// 
//     Constructor(java.lang.reflect.Constructor constructor) {
//         this.constructor = constructor;
//     }
// 
//     /**
//      * Returns an array of Class objects that represent the formal parameter types, in declaration order, of the constructor.
//      */
//     public Class[] getParameterTypes() {
//         return constructor.getParameterTypes();
//     }
// 
//     /**
//      * Returns the Class object representing the class or interface that declares the constructor.
//      */
//     public Class getDeclaringClass() {
//         return constructor.getDeclaringClass();
//     }
// 
//     public void setAccessible(boolean accessible) {
//         constructor.setAccessible(accessible);
//     }
// 
//     /**
//      * Uses the constructor to create and initialize a new instance of the constructor's declaring class, with the supplied
//      * initialization parameters.
//      */
//     public Object newInstance(Object... args) throws ReflectionException {
//         try {
//             return constructor.newInstance(args);
//         } catch (IllegalArgumentException e) {
//             throw new ReflectionException("Illegal argument(s) supplied to constructor for class: " + getDeclaringClass().getName(), e);
//         } catch (InstantiationException e) {
//             throw new ReflectionException("Could not instantiate instance of class: " + getDeclaringClass().getName(), e);
//         } catch (IllegalAccessException e) {
//             throw new ReflectionException("Could not instantiate instance of class: " + getDeclaringClass().getName(), e);
//         } catch (InvocationTargetException e) {
//             throw new ReflectionException("Exception occurred in constructor for class: " + getDeclaringClass().getName(), e);
//         }
//     }
// 
// }
// 
// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/reflect/ReflectionException.java
// public class ReflectionException extends Exception {
// 
//     public ReflectionException(String message, Throwable cause) {
//         super(message, cause);
//     }
// }


// Path: gdx-lib/src/main/java/com/badlogic/gdx/utils/ReflectionPool.java
import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.Constructor;
import com.badlogic.gdx.utils.reflect.ReflectionException;

/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 *
 * 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 com.badlogic.gdx.utils;


/**
 * Pool that creates new instances of a type using reflection. The type must have a zero argument constructor.
 * {@link Constructor#setAccessible(boolean)} will be used if the class and/or constructor is not visible.
 *
 * @author Nathan Sweet
 */
public class ReflectionPool<T> extends Pool<T> {
    private final Constructor constructor;

    public ReflectionPool(Class<T> type) {
        this(type, 16, Integer.MAX_VALUE);
    }

    public ReflectionPool(Class<T> type, int initialCapacity) {
        this(type, initialCapacity, Integer.MAX_VALUE);
    }

    public ReflectionPool(Class<T> type, int initialCapacity, int max) {
        super(initialCapacity, max);
        constructor = findConstructor(type);
        if (constructor == null) {
            throw new RuntimeException("Class cannot be created (missing no-arg constructor): " + type.getName());
        }
    }

    private Constructor findConstructor(Class<T> type) {