All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.bytebuddy.utility.QueueFactory Maven / Gradle / Ivy

/*
 * Copyright 2014 - Present Rafael Winterhalter
 *
 * 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 net.bytebuddy.utility;

import net.bytebuddy.build.AccessControllerPlugin;
import net.bytebuddy.build.HashCodeAndEqualsPlugin;
import net.bytebuddy.utility.dispatcher.JavaDispatcher;
import net.bytebuddy.utility.nullability.MaybeNull;

import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Queue;

/**
 * A factory for creating a {@link Queue}. For Java 5, a {@link LinkedList} is created whereas a
 * {@code java.util.ArrayDeque} is used for any future JVM version.
 */
@HashCodeAndEqualsPlugin.Enhance
public class QueueFactory {

    /**
     * The singleton instance.
     */
    private static final QueueFactory INSTANCE = new QueueFactory();

    /**
     * The dispatcher to use.
     */
    private final Dispatcher dispatcher;

    /**
     * Creates a new queue factory.
     */
    private QueueFactory() {
        dispatcher = doPrivileged(JavaDispatcher.of(Dispatcher.class));
    }

    /**
     * Creates a new queue.
     *
     * @param  The type of the queue elements.
     * @return An appropriate queue.
     */
    public static  Queue make() {
        Queue queue = INSTANCE.dispatcher.arrayDeque();
        return queue == null
                ? new LinkedList()
                : queue;
    }

    /**
     * Creates a new queue.
     *
     * @param       The type of the queue elements.
     * @param elements The elements to provide to the queue constructor.
     * @return An appropriate queue.
     */
    public static  Queue make(Collection elements) {
        Queue queue = INSTANCE.dispatcher.arrayDeque(elements);
        return queue == null
                ? new LinkedList(elements)
                : queue;
    }

    /**
     * A proxy for {@code java.security.AccessController#doPrivileged} that is activated if available.
     *
     * @param action The action to execute from a privileged context.
     * @param     The type of the action's resolved value.
     * @return The action's resolved value.
     */
    @AccessControllerPlugin.Enhance
    private static  T doPrivileged(PrivilegedAction action) {
        return action.run();
    }

    /**
     * A dispatcher for creating an {@code java.util.ArrayDeque}.
     */
    @JavaDispatcher.Defaults
    @JavaDispatcher.Proxied("java.util.ArrayDeque")
    protected interface Dispatcher {

        /**
         * Creates a new array deque.
         *
         * @param  The type of the action's resolved value.
         * @return An array deque or {@code null} if this class is not supplied by the current VM.
         */
        @MaybeNull
        @JavaDispatcher.IsConstructor
         Queue arrayDeque();

        /**
         * Creates a new array deque.
         *
         * @param       The type of the action's resolved value.
         * @param elements The elements to provide to the queue constructor.
         * @return An array deque or {@code null} if this class is not supplied by the current VM.
         */
        @MaybeNull
        @JavaDispatcher.IsConstructor
         Queue arrayDeque(Collection elements);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy