17 #ifndef ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
18 #define ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_
21 #include <type_traits>
23 #include "absl/base/config.h"
24 #include "absl/base/internal/fast_type_id.h"
25 #include "absl/utility/utility.h"
29 namespace random_internal {
34 template <
typename URBG>
35 struct DistributionCaller {
37 "You must pass a reference, not a pointer.");
43 template <
template <
class...>
class Trait,
class AlwaysVoid,
class...
Args>
45 template <
template <
class...>
class Trait,
class...
Args>
50 using invoke_mock_t = decltype(std::declval<T*>()->InvokeMock(
51 std::declval<::absl::base_internal::FastTypeIdType>(),
52 std::declval<void*>(), std::declval<void*>()));
57 template <
typename DistrT,
typename...
Args>
60 DistrT dist(std::forward<Args>(
args)...);
66 template <
typename DistrT,
typename...
Args>
70 using ArgTupleT = std::tuple<absl::decay_t<Args>...>;
71 using KeyT = ResultT(DistrT, ArgTupleT);
73 ArgTupleT arg_tuple(std::forward<Args>(
args)...);
75 if (!urbg->InvokeMock(::absl::base_internal::FastTypeId<KeyT>(), &arg_tuple,
77 auto dist = absl::make_from_tuple<DistrT>(arg_tuple);
84 template <
typename DistrT,
typename...
Args>
87 std::forward<Args>(
args)...);
95 #endif // ABSL_RANDOM_INTERNAL_DISTRIBUTION_CALLER_H_