15 #ifndef ABSL_RANDOM_INTERNAL_UNIFORM_HELPER_H_
16 #define ABSL_RANDOM_INTERNAL_UNIFORM_HELPER_H_
20 #include <type_traits>
22 #include "absl/base/config.h"
23 #include "absl/meta/type_traits.h"
24 #include "absl/random/internal/traits.h"
29 template <
typename IntType>
32 template <
typename RealType>
38 namespace random_internal {
63 namespace random_internal {
77 template <
typename A,
typename B>
80 is_widening_convertible<B, A>>
::value,
81 typename std::conditional<
100 template <
typename IntType,
typename Tag>
105 std::is_same<Tag, IntervalOpenOpenTag>>>
::value,
111 template <
typename FloatType,
typename Tag>
114 std::is_floating_point<FloatType>,
116 std::is_same<Tag, IntervalOpenOpenTag>>>
::value,
119 return std::nextafter(
a,
b);
122 template <
typename NumType,
typename Tag>
125 std::is_same<Tag, IntervalClosedOpenTag>>
::value,
131 template <
typename IntType,
typename Tag>
136 std::is_same<Tag, IntervalOpenOpenTag>>>
::value,
142 template <
typename FloatType,
typename Tag>
145 std::is_floating_point<FloatType>,
147 std::is_same<Tag, IntervalOpenOpenTag>>>
::value,
153 template <
typename IntType,
typename Tag>
158 std::is_same<Tag, IntervalOpenClosedTag>>>
::value,
164 template <
typename FloatType,
typename Tag>
167 std::is_floating_point<FloatType>,
169 std::is_same<Tag, IntervalOpenClosedTag>>>
::value,
197 template <
typename FloatType>
203 template <
typename IntType>
211 template <
typename NumType>
222 template <
typename NumType>
224 template <
typename TagType>
228 uniform_upper_bound<NumType>(TagType{}, lo, hi)) {}
237 (
std::numeric_limits<NumType>::
max)()) {}
244 #endif // ABSL_RANDOM_INTERNAL_UNIFORM_HELPER_H_