]> gcc.gnu.org Git - gcc.git/commitdiff
libstdc++: Refactor seed sequence constraints in <random>
authorJonathan Wakely <jwakely@redhat.com>
Tue, 4 Oct 2022 11:57:33 +0000 (12:57 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 4 Oct 2022 16:42:59 +0000 (17:42 +0100)
Every use of _If_seed_seq in <random> and <ext/random> uses it with
enable_if. We can just move the enable_if into the helper alias instead
of repeating it everywhere.

libstdc++-v3/ChangeLog:

* include/bits/random.h (__is_seed_seq): Replace with ...
(_If_seed_seq_for): ... this.
* include/ext/random: Adjust to use _If_seed_seq_for.

libstdc++-v3/include/bits/random.h
libstdc++-v3/include/ext/random

index 3e6eb9de7d9caa5f5e0ebf29cc80fe35f065367e..28b37a9e5a51030de3f222cb3a6c813e677ecaa2 100644 (file)
@@ -198,16 +198,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        _Engine& _M_g;
       };
 
+    // Detect whether a template argument _Sseq is a valid seed sequence for
+    // a random number engine _Engine with result type _Res.
+    // Used to constrain _Engine::_Engine(_Sseq&) and _Engine::seed(_Sseq&)
+    // as required by [rand.eng.general].
+
     template<typename _Sseq>
       using __seed_seq_generate_t = decltype(
          std::declval<_Sseq&>().generate(std::declval<uint_least32_t*>(),
                                          std::declval<uint_least32_t*>()));
 
-    // Detect whether _Sseq is a valid seed sequence for
-    // a random number engine _Engine with result type _Res.
     template<typename _Sseq, typename _Engine, typename _Res,
             typename _GenerateCheck = __seed_seq_generate_t<_Sseq>>
-      using __is_seed_seq = __and_<
+      using _If_seed_seq_for = _Require<
         __not_<is_same<__remove_cvref_t<_Sseq>, _Engine>>,
        is_unsigned<typename _Sseq::result_type>,
        __not_<is_convertible<_Sseq, _Res>>
@@ -263,8 +266,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    "template argument substituting __m out of bounds");
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, linear_congruential_engine, _UIntType>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, linear_congruential_engine,
+                                      _UIntType>;
 
     public:
       /** The type of the generated random value. */
@@ -502,8 +506,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    "template argument substituting __f out of bound");
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, mersenne_twister_engine, _UIntType>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, mersenne_twister_engine,
+                                      _UIntType>;
 
     public:
       /** The type of the generated random value. */
@@ -702,8 +707,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    "template argument substituting __w out of bounds");
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, subtract_with_carry_engine, _UIntType>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, subtract_with_carry_engine,
+                                      _UIntType>;
 
     public:
       /** The type of the generated random value. */
@@ -894,8 +900,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef typename _RandomNumberEngine::result_type result_type;
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, discard_block_engine, result_type>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, discard_block_engine,
+                                      result_type>;
 
       // parameter values
       static constexpr size_t block_size = __p;
@@ -1113,8 +1120,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    "template argument substituting __w out of bounds");
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, independent_bits_engine, _UIntType>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, independent_bits_engine,
+                                      _UIntType>;
 
     public:
       /** The type of the generated random value. */
@@ -1336,8 +1344,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef typename _RandomNumberEngine::result_type result_type;
 
       template<typename _Sseq>
-       using _If_seed_seq = typename enable_if<__detail::__is_seed_seq<
-         _Sseq, shuffle_order_engine, result_type>::value>::type;
+       using _If_seed_seq
+         = __detail::_If_seed_seq_for<_Sseq, shuffle_order_engine,
+                                      result_type>;
 
       static constexpr size_t table_size = __k;
 
index 4cc0e25e02510ac53dcb44548f091af5d9e64b30..406b12b5d23417d8d4aa8bd512cad24cd16c66d4 100644 (file)
@@ -89,9 +89,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       template<typename _Sseq>
        using _If_seed_seq
-         = typename std::enable_if<std::__detail::__is_seed_seq<
-           _Sseq, simd_fast_mersenne_twister_engine, result_type>::value
-           >::type;
+         = std::__detail::_If_seed_seq_for<_Sseq,
+                                           simd_fast_mersenne_twister_engine,
+                                           result_type>;
 
     public:
       static constexpr size_t state_size = _M_nstate * (16
This page took 0.073426 seconds and 5 git commands to generate.