| // Copyright (C) 2019-2023 Free Software Foundation, Inc. |
| // |
| // This file is part of the GNU ISO C++ Library. This library is free |
| // software; you can redistribute it and/or modify it under the |
| // terms of the GNU General Public License as published by the |
| // Free Software Foundation; either version 3, or (at your option) |
| // any later version. |
| |
| // This library is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| // You should have received a copy of the GNU General Public License along |
| // with this library; see the file COPYING3. If not see |
| // <http://www.gnu.org/licenses/>. |
| |
| // { dg-options "-std=gnu++2a" } |
| // { dg-do compile { target c++2a } } |
| // { dg-require-cstdint "" } |
| |
| #include <random> |
| |
| static_assert( std::uniform_random_bit_generator<std::default_random_engine> ); |
| static_assert( std::uniform_random_bit_generator<std::minstd_rand0> ); |
| static_assert( std::uniform_random_bit_generator<std::mt19937> ); |
| |
| struct G1 |
| { |
| unsigned char operator()(); |
| static constexpr unsigned char min() { return 0; } |
| static constexpr unsigned char max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G1> ); |
| |
| struct G2 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return -1U; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G2> ); |
| |
| struct G3 |
| { |
| unsigned long long operator()(); |
| static constexpr unsigned long long min() { return 0; } |
| static constexpr unsigned long long max() { return -1ULL; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G3> ); |
| |
| struct G4 |
| { |
| unsigned operator()(int = 0, int = 0); // extra params, with default args |
| static constexpr unsigned min(long = 0) { return 0; } |
| static constexpr unsigned max(void* = nullptr) { return -1U; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G4> ); |
| |
| struct G5 |
| { |
| unsigned operator()() &; // ref-qualifier |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G5> ); |
| |
| struct G6 |
| { |
| unsigned operator()() const; // cv-qualifier |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G6> ); |
| |
| struct G7 |
| { |
| unsigned operator()() volatile; // cv-qualifier |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G7> ); |
| |
| struct G8 |
| { |
| unsigned operator()() const volatile; // cv-qualifiers |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G8> ); |
| |
| struct G9 |
| { |
| unsigned operator()() const volatile; // cv-qualifiers |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G9> ); |
| |
| struct G10 |
| { |
| unsigned operator()() const volatile & noexcept; // cv/ref/noexcept |
| static constexpr unsigned min() noexcept { return 0; } |
| static constexpr unsigned max() noexcept { return 10; } |
| }; |
| |
| static_assert( std::uniform_random_bit_generator<G10> ); |
| |
| // Negative tests. |
| |
| static_assert( ! std::uniform_random_bit_generator<void> ); |
| static_assert( ! std::uniform_random_bit_generator<int> ); |
| static_assert( ! std::uniform_random_bit_generator<unsigned(*)()> ); |
| |
| struct N1 |
| { |
| unsigned operator()(); |
| constexpr unsigned min() { return 0; } // non-static |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N1> ); |
| |
| struct N2 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 0; } |
| constexpr unsigned max() { return 1; } // non-static |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N2> ); |
| |
| struct N3 |
| { |
| unsigned operator()(); |
| // no N3::min() |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N3> ); |
| |
| struct N4 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 0; } |
| // no N4::max() |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N4> ); |
| |
| struct N5 |
| { |
| // no operator() |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N5> ); |
| |
| struct N6 |
| { |
| int operator()(); // returns signed integral |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N6> ); |
| |
| struct N7 |
| { |
| unsigned operator()(); |
| static constexpr unsigned long min() { return 0; } // different return type |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N7> ); |
| |
| struct N8 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned long max() { return 1; } // different return type |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N8> ); |
| |
| struct N9 |
| { |
| unsigned operator()(); |
| static constexpr unsigned long min() { return 0; } // different return type |
| static constexpr unsigned long max() { return 1; } // different return type |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N9> ); |
| |
| struct N10 |
| { |
| unsigned operator()() &&; // ref-qualifier |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N10> ); |
| |
| struct N11 |
| { |
| unsigned operator()() const &&; // ref-qualifier |
| static constexpr unsigned min() { return 0; } |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N11> ); |
| |
| struct N12 |
| { |
| unsigned operator()(); |
| static unsigned min() { return 0; } // not constexpr |
| static constexpr unsigned max() { return 1; } |
| }; |
| |
| #if __cpp_implicit_constexpr |
| static_assert( std::uniform_random_bit_generator<N12> ); // LWG 3150 |
| #else |
| static_assert( ! std::uniform_random_bit_generator<N12> ); // LWG 3150 |
| #endif |
| |
| struct N13 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 0; } |
| static unsigned max() { return 1; } // not constexpr |
| }; |
| |
| #if __cpp_implicit_constexpr |
| static_assert( std::uniform_random_bit_generator<N13> ); // LWG 3150 |
| #else |
| static_assert( ! std::uniform_random_bit_generator<N13> ); // LWG 3150 |
| #endif |
| |
| struct N14 |
| { |
| unsigned operator()(); |
| static constexpr unsigned min() { return 1; } |
| static constexpr unsigned max() { return 0; } // max not greater than min |
| }; |
| |
| static_assert( ! std::uniform_random_bit_generator<N14> ); // LWG 3150 |