/*
 * 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 org.apache.commons.rng.examples.jmh;

import org.apache.commons.rng.simple.RandomSource;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;

/**
 * A benchmark state that can retrieve the various {@link RandomSource} values.
 *
 * <p>The state will include only those that do not require additional constructor arguments.</p>
 */
@State(Scope.Benchmark)
public class RandomSourceValues {
    /**
     * RNG providers. This list is maintained in the order of the {@link RandomSource} enum.
     *
     * <p>Include only those that do not require additional constructor arguments.</p>
     *
     * <p>Note: JMH does support using an Enum for the {@code @Param} annotation. However
     * the default set will encompass all the enum values, including those that require
     * additional constructor arguments. So this list is maintained manually.</p>
     */
    @Param({"JDK",
            "WELL_512_A",
            "WELL_1024_A",
            "WELL_19937_A",
            "WELL_19937_C",
            "WELL_44497_A",
            "WELL_44497_B",
            "MT",
            "ISAAC",
            "SPLIT_MIX_64",
            "XOR_SHIFT_1024_S",
            "TWO_CMRES",
            "MT_64",
            "MWC_256",
            "KISS",
            "XOR_SHIFT_1024_S_PHI",
            "XO_RO_SHI_RO_64_S",
            "XO_RO_SHI_RO_64_SS",
            "XO_SHI_RO_128_PLUS",
            "XO_SHI_RO_128_SS",
            "XO_RO_SHI_RO_128_PLUS",
            "XO_RO_SHI_RO_128_SS",
            "XO_SHI_RO_256_PLUS",
            "XO_SHI_RO_256_SS",
            "XO_SHI_RO_512_PLUS",
            "XO_SHI_RO_512_SS",
            "PCG_XSH_RR_32",
            "PCG_XSH_RS_32",
            "PCG_RXS_M_XS_64",
            "PCG_MCG_XSH_RR_32",
            "PCG_MCG_XSH_RS_32",
            "MSWS",
            "SFC_32",
            "SFC_64",
            "JSF_32",
            "JSF_64",
            "XO_SHI_RO_128_PP",
            "XO_RO_SHI_RO_128_PP",
            "XO_SHI_RO_256_PP",
            "XO_SHI_RO_512_PP",
            "XO_RO_SHI_RO_1024_PP",
            "XO_RO_SHI_RO_1024_S",
            "XO_RO_SHI_RO_1024_SS",
            "PCG_XSH_RR_32_OS",
            "PCG_XSH_RS_32_OS",
            "PCG_RXS_M_XS_64_OS",
            })
    private String randomSourceName;

    /** The RandomSource. */
    private RandomSource randomSource;

    /**
     * Gets the random source.
     *
     * @return the random source
     */
    public RandomSource getRandomSource() {
        return randomSource;
    }

    /**
     * Look-up the {@link RandomSource} from the name.
     */
    @Setup
    public void setup() {
        randomSource = RandomSource.valueOf(randomSourceName);
    }
}
