Program Listing for File mersenne.hpp

Return to documentation for file (libtcod/mersenne.hpp)

/* BSD 3-Clause License
 *
 * Copyright © 2008-2026, Jice and the libtcod contributors.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#ifndef TCOD_RANDOM_HPP_
#define TCOD_RANDOM_HPP_

#include <utility>

#include "mersenne.h"

// clang-format off
class TCODLIB_API TCODRandom {
  public :
    static TCODRandom * getInstance(void);

    TCODRandom(TCOD_random_algo_t algo = TCOD_RNG_CMWC, bool allocate = true);

    TCODRandom(uint32_t seed, TCOD_random_algo_t algo = TCOD_RNG_CMWC);

  // clang-format on
  explicit TCODRandom(TCOD_Random* mersenne) : data{mersenne} {}

  TCODRandom(const TCODRandom&) = delete;
  TCODRandom& operator=(const TCODRandom&) = delete;
  TCODRandom(TCODRandom&& rhs) : data{nullptr} { std::swap(data, rhs.data); }
  TCODRandom& operator=(TCODRandom&& rhs) noexcept {
    std::swap(data, rhs.data);
    return *this;
  }

  // clang-format off
    virtual ~TCODRandom();

    inline void setDistribution (TCOD_distribution_t distribution) { TCOD_random_set_distribution(data,distribution); }

    inline int getInt (int min, int max, int mean = 0) { return (mean <= 0) ? TCOD_random_get_int(data,min,max) : TCOD_random_get_int_mean(data,min,max,mean); }
    inline int get (int min, int max, int mean = 0) { return (mean <= 0) ? TCOD_random_get_int(data,min,max) : TCOD_random_get_int_mean(data,min,max,mean); }

    inline float getFloat (float min, float max, float mean = 0.0f) { return (mean <= 0) ? TCOD_random_get_float(data,min,max) : TCOD_random_get_float_mean(data,min,max,mean); }
    inline float get (float min, float max, float mean = 0.0f) { return (mean <= 0.0f) ? TCOD_random_get_float(data,min,max) : TCOD_random_get_float_mean(data,min,max,mean); }

    inline double getDouble (double min, double max, double mean = 0.0) { return (mean <= 0) ? TCOD_random_get_double(data,min,max) : TCOD_random_get_double_mean(data,min,max,mean); }
    inline double get (double min, double max, double mean = 0.0f) { return (mean <= 0.0) ? TCOD_random_get_double(data,min,max) : TCOD_random_get_double_mean(data,min,max,mean); }

    TCODRandom * save() const;

    void restore(const TCODRandom *backup);

    //dice
    inline TCOD_dice_t dice (const char * s) { return TCOD_random_dice_new(s); }
    inline int diceRoll (TCOD_dice_t dice) { return TCOD_random_dice_roll(data,dice); }
    inline int diceRoll (const char * s) { return TCOD_random_dice_roll(data,TCOD_random_dice_new(s)); }

    TCOD_Random* get_data() noexcept
    {
      return data;
    }
    const TCOD_Random* get_data() const noexcept
    {
      return data;
    }
  protected :
    friend class TCODLIB_API TCODNoise;
    friend class TCODLIB_API TCODHeightMap;
    friend class TCODLIB_API TCODNamegen;
    friend class TCODNameGenerator; // Used for SWIG interface, does NOT need TCODLIB_API
    TCOD_Random* data{};
};
#endif // TCOD_RANDOM_HPP_