Program Listing for File mersenne.hpp¶
↰ Return to documentation for file (libtcod/mersenne.hpp)
/* BSD 3-Clause License
*
* Copyright © 2008-2025, 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_