Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d0a49f5
Require Standard URBGs, delete machinery for TR1 generators.
StephanTLavavej Sep 23, 2025
168a5f1
Remove `_HAS_TR1_NAMESPACE`.
StephanTLavavej Sep 21, 2025
50deac8
Remove `_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING`.
StephanTLavavej Sep 7, 2025
24baecb
Remove `_SILENCE_TR1_RANDOM_DEPRECATION_WARNING`.
StephanTLavavej Sep 7, 2025
8c431f9
Simplify test for removed non-Standard names.
StephanTLavavej Sep 7, 2025
04f22b5
Drop `_Swc_base` `operator>>()` and `operator<<()`, and `_Swc_traits:…
StephanTLavavej Sep 21, 2025
785aa50
Drop `_Swc_base` `min()` and `max()`, and `_Swc_traits::_Max`.
StephanTLavavej Sep 21, 2025
8d2f894
Fuse `_Swc_base` `operator()()` with strengthened `noexcept`.
StephanTLavavej Sep 21, 2025
58054da
Fuse `_Swc_base` `discard()`.
StephanTLavavej Sep 21, 2025
02a6f8c
Fuse `_Swc_base` `operator==()`.
StephanTLavavej Sep 21, 2025
aa04aff
Fuse `_Swc_base` `default_seed`.
StephanTLavavej Sep 21, 2025
6d1aacc
Introduce and consistently use `_Mytraits` in `_Swc_base` and `subtra…
StephanTLavavej Sep 21, 2025
5f8798e
Fuse `_Swc_base` `_Write_full()`.
StephanTLavavej Sep 21, 2025
b388b08
Drop `_Swc_base` default ctor and ctor/`seed()` from `_Gen&`.
StephanTLavavej Sep 21, 2025
8d3a924
Fuse `_Swc_base` construction.
StephanTLavavej Sep 21, 2025
3b35f57
Fuse `_Swc_base` `seed()`.
StephanTLavavej Sep 21, 2025
33dc8d1
Finish fusing `_Swc_base`.
StephanTLavavej Sep 21, 2025
46260b6
`_Carry` is now a direct data member.
StephanTLavavej Sep 21, 2025
35f43e6
Simplify `_Swc_traits::_Reset()` as `_Readcy` is always `false`.
StephanTLavavej Sep 21, 2025
2126631
Fuse `_Swc_traits` `_Cy` and `_Mod`, avoiding shadowing in `_Write_fu…
StephanTLavavej Sep 21, 2025
03d59d4
Fuse `_Swc_traits` `_Write_full()`.
StephanTLavavej Sep 21, 2025
55c4244
Finish fusing `_Swc_traits`.
StephanTLavavej Sep 21, 2025
6727c66
Fuse `_Reset()` into `seed()`.
StephanTLavavej Sep 21, 2025
dc6f590
Consistently use `%=`.
StephanTLavavej Sep 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 1 addition & 28 deletions benchmarks/src/random_integer_generation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ BENCHMARK(BM_discard<std::mt19937>)->Range(0, 1 << 18);
BENCHMARK(BM_discard<std::mt19937_64>)->Range(0, 1 << 18);
BENCHMARK(BM_discard<std::minstd_rand>)->Range(0, 1 << 18);

/// Support machinery for testing _Rng_from_urng and _Rng_from_urng_v2
/// Support machinery for testing _Rng_from_urng_v2

std::uint32_t GetMax() {
std::mt19937 gen;
Expand All @@ -58,15 +58,6 @@ const std::uint32_t maximum = GetMax(); // random divisor to prevent strength re

/// Test mt19937

void BM_raw_mt19937_old(benchmark::State& state) {
std::mt19937 gen;
std::_Rng_from_urng<std::uint32_t, decltype(gen)> rng(gen);
for (auto _ : state) {
benchmark::DoNotOptimize(rng(maximum));
}
}
BENCHMARK(BM_raw_mt19937_old);

void BM_raw_mt19937_new(benchmark::State& state) {
std::mt19937 gen;
std::_Rng_from_urng_v2<std::uint32_t, decltype(gen)> rng(gen);
Expand All @@ -78,15 +69,6 @@ BENCHMARK(BM_raw_mt19937_new);

/// Test mt19937_64

void BM_raw_mt19937_64_old(benchmark::State& state) {
std::mt19937_64 gen;
std::_Rng_from_urng<std::uint64_t, decltype(gen)> rng(gen);
for (auto _ : state) {
benchmark::DoNotOptimize(rng(maximum));
}
}
BENCHMARK(BM_raw_mt19937_64_old);

void BM_raw_mt19937_64_new(benchmark::State& state) {
std::mt19937_64 gen;
std::_Rng_from_urng_v2<std::uint64_t, decltype(gen)> rng(gen);
Expand All @@ -98,15 +80,6 @@ BENCHMARK(BM_raw_mt19937_64_new);

/// Test minstd_rand

void BM_raw_lcg_old(benchmark::State& state) {
std::minstd_rand gen;
std::_Rng_from_urng<std::uint32_t, decltype(gen)> rng(gen);
for (auto _ : state) {
benchmark::DoNotOptimize(rng(maximum));
}
}
BENCHMARK(BM_raw_lcg_old);

void BM_raw_lcg_new(benchmark::State& state) {
std::minstd_rand gen;
std::_Rng_from_urng_v2<std::uint32_t, decltype(gen)> rng(gen);
Expand Down
92 changes: 6 additions & 86 deletions stl/inc/algorithm
Original file line number Diff line number Diff line change
Expand Up @@ -5953,73 +5953,6 @@ namespace ranges {
#endif // _HAS_CXX20
#endif // _HAS_CXX17

template <class _Diff, class _Urng>
class _Rng_from_urng { // wrap a URNG as an RNG
public:
using _Ty0 = make_unsigned_t<_Diff>;
using _Ty1 = _Invoke_result_t<_Urng&>;

using _Udiff = conditional_t<sizeof(_Ty1) < sizeof(_Ty0), _Ty0, _Ty1>;

explicit _Rng_from_urng(_Urng& _Func)
: _Ref(_Func), _Bits(CHAR_BIT * sizeof(_Udiff)), _Bmask(static_cast<_Udiff>(-1)) {
for (; static_cast<_Udiff>((_Urng::max) () - (_Urng::min) ()) < _Bmask; _Bmask >>= 1) {
--_Bits;
}
}

_Diff operator()(_Diff _Index) { // adapt _Urng closed range to [0, _Index)
for (;;) { // try a sample random value
_Udiff _Ret = 0; // random bits
_Udiff _Mask = 0; // 2^N - 1, _Ret is within [0, _Mask]

while (_Mask < static_cast<_Udiff>(_Index - 1)) { // need more random bits
_Ret <<= _Bits - 1; // avoid full shift
_Ret <<= 1;
_Ret |= _Get_bits();
_Mask <<= _Bits - 1; // avoid full shift
_Mask <<= 1;
_Mask |= _Bmask;
}

// _Ret is [0, _Mask], _Index - 1 <= _Mask, return if unbiased
if (_Ret / _Index < _Mask / _Index || _Mask % _Index == static_cast<_Udiff>(_Index - 1)) {
return static_cast<_Diff>(_Ret % _Index);
}
}
}

_Udiff _Get_all_bits() {
_Udiff _Ret = 0;

for (size_t _Num = 0; _Num < CHAR_BIT * sizeof(_Udiff); _Num += _Bits) { // don't mask away any bits
_Ret <<= _Bits - 1; // avoid full shift
_Ret <<= 1;
_Ret |= _Get_bits();
}

return _Ret;
}

_Rng_from_urng(const _Rng_from_urng&) = delete;
_Rng_from_urng& operator=(const _Rng_from_urng&) = delete;

private:
_Udiff _Get_bits() { // return a random value within [0, _Bmask]
for (;;) { // repeat until random value is in range
const _Udiff _Val = static_cast<_Udiff>(_Ref() - (_Urng::min) ());

if (_Val <= _Bmask) {
return _Val;
}
}
}

_Urng& _Ref; // reference to URNG
size_t _Bits; // number of random bits generated by _Get_bits()
_Udiff _Bmask; // 2^_Bits - 1
};

template <class _Diff, class _Urng>
class _Rng_from_urng_v2 { // wrap a URNG as an RNG
public:
Expand Down Expand Up @@ -6142,19 +6075,6 @@ private:
static constexpr _Udiff _Bmask = static_cast<_Udiff>(-1) >> (_Udiff_bits - _Bits); // 2^_Bits - 1
};

template <class _Gen, class = void>
constexpr bool _Has_static_min_max = false;

// This checks a requirement of N4981 [rand.req.urng] `concept uniform_random_bit_generator` but doesn't attempt
// to implement the whole concept - we just need to distinguish Standard machinery from tr1 machinery.
template <class _Gen>
constexpr bool _Has_static_min_max<_Gen, void_t<decltype(bool_constant<(_Gen::min) () < (_Gen::max) ()>::value)>> =
true;

template <class _Diff, class _Urng>
using _Rng_from_urng_v1_or_v2 =
conditional_t<_Has_static_min_max<_Urng>, _Rng_from_urng_v2<_Diff, _Urng>, _Rng_from_urng<_Diff, _Urng>>;

#if _HAS_CXX17
template <class _PopIt, class _SampleIt, class _Diff, class _RngFn>
_SampleIt _Sample_reservoir_unchecked(
Expand Down Expand Up @@ -6212,7 +6132,7 @@ _SampleIt sample(_PopIt _First, _PopIt _Last, _SampleIt _Dest, _Diff _Count, _Ur
auto _UFirst = _STD _Get_unwrapped(_First);
auto _ULast = _STD _Get_unwrapped(_Last);
using _PopDiff = _Iter_diff_t<_PopIt>;
_Rng_from_urng_v1_or_v2<_PopDiff, remove_reference_t<_Urng>> _RngFunc(_Func);
_Rng_from_urng_v2<_PopDiff, remove_reference_t<_Urng>> _RngFunc(_Func);
if constexpr (_Is_ranges_fwd_iter_v<_PopIt>) {
// source is forward: use selection sampling (stable)
using _CT = common_type_t<_Diff, _PopDiff>;
Expand Down Expand Up @@ -6255,7 +6175,7 @@ namespace ranges {
return _Output;
}

_Rng_from_urng_v1_or_v2<iter_difference_t<_It>, remove_reference_t<_Urng>> _RngFunc(_Func);
_Rng_from_urng_v2<iter_difference_t<_It>, remove_reference_t<_Urng>> _RngFunc(_Func);
if constexpr (forward_iterator<_It>) {
auto _UFirst = _RANGES _Unwrap_iter<_Se>(_STD move(_First));
auto _Pop_size = _RANGES distance(_UFirst, _RANGES _Unwrap_sent<_It>(_STD move(_Last)));
Expand All @@ -6276,7 +6196,7 @@ namespace ranges {
return _Output;
}

_Rng_from_urng_v1_or_v2<range_difference_t<_Rng>, remove_reference_t<_Urng>> _RngFunc(_Func);
_Rng_from_urng_v2<range_difference_t<_Rng>, remove_reference_t<_Urng>> _RngFunc(_Func);
if constexpr (forward_range<_Rng>) {
auto _UFirst = _Ubegin(_Range);
auto _Pop_size = _RANGES distance(_UFirst, _Uend(_Range));
Expand Down Expand Up @@ -6379,7 +6299,7 @@ void _Random_shuffle1(_RanIt _First, _RanIt _Last, _RngFn& _RngFunc) {
_EXPORT_STD template <class _RanIt, class _Urng>
void shuffle(_RanIt _First, _RanIt _Last, _Urng&& _Func) { // shuffle [_First, _Last) using URNG _Func
using _Urng0 = remove_reference_t<_Urng>;
_Rng_from_urng_v1_or_v2<_Iter_diff_t<_RanIt>, _Urng0> _RngFunc(_Func);
_Rng_from_urng_v2<_Iter_diff_t<_RanIt>, _Urng0> _RngFunc(_Func);
_STD _Random_shuffle1(_First, _Last, _RngFunc);
}

Expand All @@ -6392,7 +6312,7 @@ namespace ranges {
_STATIC_CALL_OPERATOR _It operator()(_It _First, _Se _Last, _Urng&& _Func) _CONST_CALL_OPERATOR {
_STD _Adl_verify_range(_First, _Last);

_Rng_from_urng_v1_or_v2<iter_difference_t<_It>, remove_reference_t<_Urng>> _RngFunc(_Func);
_Rng_from_urng_v2<iter_difference_t<_It>, remove_reference_t<_Urng>> _RngFunc(_Func);
auto _UResult = _Shuffle_unchecked(
_RANGES _Unwrap_iter<_Se>(_STD move(_First)), _RANGES _Unwrap_sent<_It>(_STD move(_Last)), _RngFunc);

Expand All @@ -6403,7 +6323,7 @@ namespace ranges {
template <random_access_range _Rng, class _Urng>
requires permutable<iterator_t<_Rng>> && uniform_random_bit_generator<remove_reference_t<_Urng>>
_STATIC_CALL_OPERATOR borrowed_iterator_t<_Rng> operator()(_Rng&& _Range, _Urng&& _Func) _CONST_CALL_OPERATOR {
_Rng_from_urng_v1_or_v2<range_difference_t<_Rng>, remove_reference_t<_Urng>> _RngFunc(_Func);
_Rng_from_urng_v2<range_difference_t<_Rng>, remove_reference_t<_Urng>> _RngFunc(_Func);

return _RANGES _Rewrap_iterator(_Range, _Shuffle_unchecked(_Ubegin(_Range), _Uend(_Range), _RngFunc));
}
Expand Down
17 changes: 0 additions & 17 deletions stl/inc/array
Original file line number Diff line number Diff line change
Expand Up @@ -420,12 +420,6 @@ public:

using _Library_defined = array;

#if _HAS_TR1_NAMESPACE
_DEPRECATE_TR1_NAMESPACE void assign(const _Ty& _Value) {
_STD fill_n(_Elems, _Size, _Value);
}
#endif // _HAS_TR1_NAMESPACE

_CONSTEXPR20 void fill(const _Ty& _Value) {
_STD fill_n(_Elems, _Size, _Value);
}
Expand Down Expand Up @@ -610,10 +604,6 @@ public:

using _Library_defined = array;

#if _HAS_TR1_NAMESPACE
_DEPRECATE_TR1_NAMESPACE void assign(const _Ty&) {}
#endif // _HAS_TR1_NAMESPACE

_CONSTEXPR20 void fill(const _Ty&) {}

_CONSTEXPR20 void swap(array&) noexcept {}
Expand Down Expand Up @@ -896,13 +886,6 @@ _NODISCARD constexpr const _Ty&& get(const array<_Ty, _Size>&& _Arr) noexcept {
return _STD move(_Arr[_Idx]);
}
}

#if _HAS_TR1_NAMESPACE
namespace _DEPRECATE_TR1_NAMESPACE tr1 {
using _STD array;
using _STD get;
} // namespace _DEPRECATE_TR1_NAMESPACE tr1
#endif // _HAS_TR1_NAMESPACE
_STD_END

#pragma pop_macro("new")
Expand Down
36 changes: 0 additions & 36 deletions stl/inc/cstdint
Original file line number Diff line number Diff line change
Expand Up @@ -49,42 +49,6 @@ _EXPORT_STD using _CSTD intmax_t;
_EXPORT_STD using _CSTD intptr_t;
_EXPORT_STD using _CSTD uintmax_t;
_EXPORT_STD using _CSTD uintptr_t;

#if _HAS_TR1_NAMESPACE
namespace _DEPRECATE_TR1_NAMESPACE tr1 {
using _CSTD int8_t;
using _CSTD int16_t;
using _CSTD int32_t;
using _CSTD int64_t;
using _CSTD uint8_t;
using _CSTD uint16_t;
using _CSTD uint32_t;
using _CSTD uint64_t;

using _CSTD int_least8_t;
using _CSTD int_least16_t;
using _CSTD int_least32_t;
using _CSTD int_least64_t;
using _CSTD uint_least8_t;
using _CSTD uint_least16_t;
using _CSTD uint_least32_t;
using _CSTD uint_least64_t;

using _CSTD int_fast8_t;
using _CSTD int_fast16_t;
using _CSTD int_fast32_t;
using _CSTD int_fast64_t;
using _CSTD uint_fast8_t;
using _CSTD uint_fast16_t;
using _CSTD uint_fast32_t;
using _CSTD uint_fast64_t;

using _CSTD intmax_t;
using _CSTD intptr_t;
using _CSTD uintmax_t;
using _CSTD uintptr_t;
} // namespace _DEPRECATE_TR1_NAMESPACE tr1
#endif // _HAS_TR1_NAMESPACE
_STD_END

#pragma pop_macro("new")
Expand Down
16 changes: 0 additions & 16 deletions stl/inc/functional
Original file line number Diff line number Diff line change
Expand Up @@ -3148,22 +3148,6 @@ namespace ranges {
};
} // namespace ranges
#endif // _HAS_CXX20

#if _HAS_TR1_NAMESPACE
namespace _DEPRECATE_TR1_NAMESPACE tr1 {
using _STD bad_function_call;
using _STD bind;
using _STD function;
using _STD is_bind_expression;
using _STD is_placeholder;
using _STD mem_fn;
using _STD swap;
namespace placeholders {
using namespace _STD placeholders;
}
} // namespace _DEPRECATE_TR1_NAMESPACE tr1
#endif // _HAS_TR1_NAMESPACE

_STD_END

// TRANSITION, non-_Ugly attribute tokens
Expand Down
7 changes: 0 additions & 7 deletions stl/inc/ios
Original file line number Diff line number Diff line change
Expand Up @@ -300,13 +300,6 @@ _EXPORT_STD inline ios_base& __CLRCALL_OR_CDECL uppercase(ios_base& _Iosbase) {
_Iosbase.setf(ios_base::uppercase);
return _Iosbase;
}

#if _HAS_TR1_NAMESPACE
namespace _DEPRECATE_TR1_NAMESPACE tr1 {
using _STD hexfloat;
}
#endif // _HAS_TR1_NAMESPACE

_STD_END

#pragma pop_macro("new")
Expand Down
17 changes: 0 additions & 17 deletions stl/inc/memory
Original file line number Diff line number Diff line change
Expand Up @@ -4528,23 +4528,6 @@ _NODISCARD auto inout_ptr(_SmartPtr& _Smart_ptr, _ArgsT&&... _Args) {
}
}
#endif // _HAS_CXX23

#if _HAS_TR1_NAMESPACE
namespace _DEPRECATE_TR1_NAMESPACE tr1 {
using _STD allocate_shared;
using _STD bad_weak_ptr;
using _STD const_pointer_cast;
using _STD dynamic_pointer_cast;
using _STD enable_shared_from_this;
using _STD get_deleter;
using _STD make_shared;
using _STD shared_ptr;
using _STD static_pointer_cast;
using _STD swap;
using _STD weak_ptr;
} // namespace _DEPRECATE_TR1_NAMESPACE tr1
#endif // _HAS_TR1_NAMESPACE

_STD_END

// TRANSITION, non-_Ugly attribute tokens
Expand Down
Loading