File indexing completed on 2025-04-26 08:55:46
0001 #ifndef BOOST_UUID_BASIC_RANDOM_GENERATOR_HPP_INCLUDED
0002 #define BOOST_UUID_BASIC_RANDOM_GENERATOR_HPP_INCLUDED
0003
0004
0005
0006
0007
0008
0009
0010 #include <boost/uuid/uuid.hpp>
0011 #include <boost/uuid/detail/random_provider.hpp>
0012 #include <boost/uuid/detail/endian.hpp>
0013 #include <boost/assert.hpp>
0014 #include <type_traits>
0015 #include <random>
0016 #include <cstdint>
0017
0018 namespace boost {
0019 namespace uuids {
0020
0021 template<class UniformRandomNumberGenerator>
0022 class basic_random_generator
0023 {
0024 private:
0025
0026 UniformRandomNumberGenerator* p_;
0027 UniformRandomNumberGenerator g_;
0028
0029 public:
0030
0031 using result_type = uuid;
0032
0033
0034
0035
0036 basic_random_generator(): p_( 0 ), g_()
0037 {
0038
0039 seed( g_, 0 );
0040 }
0041
0042
0043
0044 explicit basic_random_generator( UniformRandomNumberGenerator& gen ): p_( &gen )
0045 {
0046 }
0047
0048
0049
0050 explicit basic_random_generator( UniformRandomNumberGenerator* gen ): p_( gen )
0051 {
0052 BOOST_ASSERT( gen != 0 );
0053 }
0054
0055 result_type operator()()
0056 {
0057 UniformRandomNumberGenerator& gen = p_? *p_: g_;
0058
0059 std::uniform_int_distribution<std::uint32_t> dist;
0060
0061 result_type u;
0062
0063 detail::store_native_u32( u.data + 0, dist( gen ) );
0064 detail::store_native_u32( u.data + 4, dist( gen ) );
0065 detail::store_native_u32( u.data + 8, dist( gen ) );
0066 detail::store_native_u32( u.data + 12, dist( gen ) );
0067
0068
0069
0070 *(u.begin() + 8) &= 0x3F;
0071 *(u.begin() + 8) |= 0x80;
0072
0073
0074
0075 *(u.begin() + 6) &= 0x0F;
0076 *(u.begin() + 6) |= 0x40;
0077
0078 return u;
0079 }
0080
0081 private:
0082
0083
0084
0085
0086
0087
0088 template<class MaybePseudoRandomNumberGenerator, class En = decltype( std::declval<MaybePseudoRandomNumberGenerator&>().seed() )>
0089 void seed( MaybePseudoRandomNumberGenerator& rng, int )
0090 {
0091 detail::random_provider seeder;
0092 rng.seed(seeder);
0093 }
0094
0095 template<class MaybePseudoRandomNumberGenerator>
0096 void seed( MaybePseudoRandomNumberGenerator&, long )
0097 {
0098 }
0099 };
0100
0101 }}
0102
0103 #endif