summaryrefslogtreecommitdiff
path: root/absl/random
diff options
context:
space:
mode:
Diffstat (limited to 'absl/random')
-rw-r--r--absl/random/CMakeLists.txt2
-rw-r--r--absl/random/beta_distribution.h2
-rw-r--r--absl/random/distribution_format_traits.h39
-rw-r--r--absl/random/internal/BUILD.bazel9
-rw-r--r--absl/random/internal/distributions.h12
-rw-r--r--absl/random/internal/uniform_helper.h2
6 files changed, 49 insertions, 17 deletions
diff --git a/absl/random/CMakeLists.txt b/absl/random/CMakeLists.txt
index cde89bfd..151cefa4 100644
--- a/absl/random/CMakeLists.txt
+++ b/absl/random/CMakeLists.txt
@@ -1025,6 +1025,8 @@ absl_cc_test(
random_internal_iostream_state_saver_test
SRCS
"internal/iostream_state_saver_test.cc"
+ COPTS
+ ${ABSL_TEST_COPTS}
LINKOPTS
${ABSL_DEFAULT_LINKOPTS}
DEPS
diff --git a/absl/random/beta_distribution.h b/absl/random/beta_distribution.h
index d7afd61c..e29894f2 100644
--- a/absl/random/beta_distribution.h
+++ b/absl/random/beta_distribution.h
@@ -129,7 +129,7 @@ class beta_distribution {
private:
friend class beta_distribution;
-#ifdef COMPILER_MSVC
+#ifdef _MSC_VER
// MSVC does not have constexpr implementations for std::log and std::exp
// so they are computed at runtime.
#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
diff --git a/absl/random/distribution_format_traits.h b/absl/random/distribution_format_traits.h
index 3f28c906..3298c2cd 100644
--- a/absl/random/distribution_format_traits.h
+++ b/absl/random/distribution_format_traits.h
@@ -36,6 +36,12 @@
#include "absl/types/span.h"
namespace absl {
+
+struct IntervalClosedClosedTag;
+struct IntervalClosedOpenTag;
+struct IntervalOpenClosedTag;
+struct IntervalOpenOpenTag;
+
namespace random_internal {
// ScalarTypeName defines a preferred hierarchy of preferred type names for
@@ -243,6 +249,39 @@ struct DistributionFormatTraits<absl::log_uniform_int_distribution<R>> {
}
};
+template <typename TagType, typename NumType>
+struct UniformDistributionWrapper;
+
+template <typename TagType, typename NumType>
+struct DistributionFormatTraits<UniformDistributionWrapper<TagType, NumType>> {
+ using distribution_t = UniformDistributionWrapper<TagType, NumType>;
+ using result_t = NumType;
+
+ static constexpr const char* Name() { return "Uniform"; }
+
+ static std::string FunctionName() {
+ return absl::StrCat(Name(), "<", ScalarTypeName<NumType>(), ">");
+ }
+ static std::string FormatArgs(const distribution_t& d) {
+ absl::string_view tag;
+ if (std::is_same<TagType, IntervalClosedClosedTag>::value) {
+ tag = "IntervalClosedClosed";
+ } else if (std::is_same<TagType, IntervalClosedOpenTag>::value) {
+ tag = "IntervalClosedOpen";
+ } else if (std::is_same<TagType, IntervalOpenClosedTag>::value) {
+ tag = "IntervalOpenClosed";
+ } else if (std::is_same<TagType, IntervalOpenOpenTag>::value) {
+ tag = "IntervalOpenOpen";
+ } else {
+ tag = "[[unknown tag type]]";
+ }
+ return absl::StrCat(tag, ", ", (d.min)(), ", ", (d.max)());
+ }
+ static std::string FormatResults(absl::Span<const result_t> results) {
+ return absl::StrJoin(results, ", ");
+ }
+};
+
} // namespace random_internal
} // namespace absl
diff --git a/absl/random/internal/BUILD.bazel b/absl/random/internal/BUILD.bazel
index 8eb6c61a..cd50982d 100644
--- a/absl/random/internal/BUILD.bazel
+++ b/absl/random/internal/BUILD.bazel
@@ -60,13 +60,11 @@ cc_library(
linkopts = ABSL_DEFAULT_LINKOPTS,
deps = [
":distribution_caller",
- ":fast_uniform_bits",
- ":fastmath",
":traits",
":uniform_helper",
+ "//absl/base",
"//absl/meta:type_traits",
"//absl/strings",
- "//absl/types:span",
],
)
@@ -618,11 +616,6 @@ cc_library(
copts = ABSL_DEFAULT_COPTS,
linkopts = ABSL_DEFAULT_LINKOPTS,
deps = [
- ":distribution_impl",
- ":fast_uniform_bits",
- ":iostream_state_saver",
- ":traits",
- "//absl/base:core_headers",
"//absl/meta:type_traits",
],
)
diff --git a/absl/random/internal/distributions.h b/absl/random/internal/distributions.h
index 34db3b32..96f8bae3 100644
--- a/absl/random/internal/distributions.h
+++ b/absl/random/internal/distributions.h
@@ -39,22 +39,20 @@ NumType UniformImpl(TagType tag,
"absl::Uniform<T>() must use an integer or real parameter type.");
using distribution_t =
- typename std::conditional<std::is_integral<NumType>::value,
- absl::uniform_int_distribution<NumType>,
- absl::uniform_real_distribution<NumType>>::type;
+ UniformDistributionWrapper<absl::decay_t<TagType>, NumType>;
using format_t = random_internal::DistributionFormatTraits<distribution_t>;
+ auto a = uniform_lower_bound(tag, lo, hi);
+ auto b = uniform_upper_bound(tag, lo, hi);
- auto a = random_internal::uniform_lower_bound<NumType>(tag, lo, hi);
- auto b = random_internal::uniform_upper_bound<NumType>(tag, lo, hi);
// TODO(lar): it doesn't make a lot of sense to ask for a random number in an
// empty range. Right now we just return a boundary--even though that
// boundary is not an acceptable value! Is there something better we can do
// here?
+ if (a > b) return a;
using gen_t = absl::decay_t<URBG>;
- if (a > b) return a;
return DistributionCaller<gen_t>::template Call<distribution_t, format_t>(
- &urbg, a, b);
+ &urbg, tag, lo, hi);
}
// In the absence of an explicitly provided return-type, the template
diff --git a/absl/random/internal/uniform_helper.h b/absl/random/internal/uniform_helper.h
index 9e89e526..2929407e 100644
--- a/absl/random/internal/uniform_helper.h
+++ b/absl/random/internal/uniform_helper.h
@@ -156,7 +156,7 @@ using UniformDistribution =
template <typename TagType, typename NumType>
struct UniformDistributionWrapper : public UniformDistribution<NumType> {
- explicit UniformDistributionWrapper(NumType lo, NumType hi)
+ explicit UniformDistributionWrapper(TagType, NumType lo, NumType hi)
: UniformDistribution<NumType>(
uniform_lower_bound<NumType>(TagType{}, lo, hi),
uniform_upper_bound<NumType>(TagType{}, lo, hi)) {}