about summary refs log tree commit diff
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 cde89bfd75bd..151cefa4bf1b 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 d7afd61c7fb1..e29894f2037f 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 3f28c9069453..3298c2cdb64b 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 8eb6c61ac907..cd50982d8b36 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 34db3b326f4c..96f8bae3918f 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 9e89e5268071..2929407e1497 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)) {}