Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Let Fill target element types; move to rand_core; support min_specialization by dhardy · Pull Request #1651 · rust-random/rand · GitHub
Skip to content

Let Fill target element types; move to rand_core; support min_specialization - #1651

Closed
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn
Closed

Let Fill target element types; move to rand_core; support min_specialization#1651
dhardy wants to merge 11 commits into
masterfrom
push-wvwwyutpkynn

Conversation

@dhardy

@dhardydhardy commented Jul 30, 2025

Copy link
Copy Markdown
Member
  • Added a CHANGELOG.md entry

Summary

Motivation

This trait was added to fill a capability gap: a safe interface for fast filling of slices like [i16]. The impls for [bool], [f32] etc. are extra complexity beyond this and unnecessary since they offer no benefit over element-wise generation in user-code.

Further, we can now support specialization like this:

structMyRng;implRngCoreforMyRng{// [method impls omitted]}#[cfg(feature = "min_specialization")]implFill<MyRng>foru64{fnfill_slice(this:&mut[Self],rng:&mutMyRng){todo!()}}

Alternatives

The specialization option motivated removal of support for element-wise types ([f32] etc.), moving to rand_core and moving the generics to the trait. I don't think any of these are bad changes however.

Via RngCore

We could add fill_u32_slice, fill_u64_slice to RngCore. Adding these methods would be more disruptive, but possibly more useful overall (dyn trait support, no dependence on unstable features).

Forget these specializations

... there's no strong evidence we need them.

These impls contradict the doc that fn fill is implemented
for types which may be reinterpreted as [u8].
@dhardy

Copy link
Copy Markdown
MemberAuthor

Note: it might seem more natural to reverse the generics and parameters of Fill to this:

pubtraitFill<T>{fnfill_slice(&mutself,slice:&mut[T]);}

Indeed, it is more natural. Unfortunately it does not support external impls for externally-defined types like MyInt over any R: RngCore + ?Sized: orphan rules would require that R be covered by another type. This is due to parameter ordering (see orphan rules).

@newpavlov

Copy link
Copy Markdown
Member

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

@dhardy
dhardyforce-pushed the push-wvwwyutpkynn branch from 8867221 to c13c5a2CompareJuly 30, 2025 15:37
@dhardy

Copy link
Copy Markdown
MemberAuthor

Wouldn't it be better to rely on zerocopy::FromBytes for this? On the first glance, moving Fill to rand_core does not look like a good solution to me.

Aside from #1574, that wouldn't support RNG specializations. It also would require unsafe code to implement for user-defined types (though some impls will require that anyway).

@dhardy

Copy link
Copy Markdown
MemberAuthor

What do you not like about moving Fill to rand_core? This would prevent (or make it harder to) add element-wise impls for f32 etc. in the future, but I don't think we want that (at least, so far we haven't bothered with float-specific RNGs like xoshiro256+).

@newpavlov

newpavlov commented Jul 30, 2025

Copy link
Copy Markdown
Member

I don't think RNG specialization is that important. The only difference between filling [u8; 256] instead of [u32; 64] for an RNG which internally generates u32s is a matter of unaligned stores and even that in most cases should be easily optimized out by the compiler.

It also would require unsafe code to implement for user-defined types

No, if user has successfully derived FromBytes for a custom type, then no unsafe code would be needed (obviously, in user code, not in general).

What do you not like about moving Fill to rand_core?

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

@dhardy

Copy link
Copy Markdown
MemberAuthor

This feels like a wrong place for it. It goes against the goal of providing the fundamental RNG APIs.

I agree except that I've been reconsidering what the fundamental RNG APIs should be. This is sort-of a part of that. The "sort-of" part is where this proposal falls flat though IMO since trait Fill doesn't (and shouldn't) replace RngCore::fill_bytes.


Do you think this Fill trait should replace the current one in rand?

@dhardydhardy added the B-API Breakage: API label Jul 30, 2025
@newpavlov

Copy link
Copy Markdown
Member

Do you think this Fill trait should replace the current one in rand?

I haven't used Fill much in practice, so it's hard for me to say. One potential problem with a FromBytes-based Fill is that it could be somewhat error-prone, e.g. FromBytes is implemented for f32 and re-interpreting random bytes as f32 is probably not what most users want.

@dhardy

Copy link
Copy Markdown
MemberAuthor

#1652 was merged instead.

@dhardydhardy closed this Aug 12, 2025
@dhardy
dhardy deleted the push-wvwwyutpkynn branch August 12, 2025 12:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

B-APIBreakage: API

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CHANGE: Allow Fill to be implemented for third-party types

2 participants

@dhardy@newpavlov