Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add maybe_uninit constructor and .assume_init() method #803

Merged
merged 7 commits into from
Apr 18, 2020

Conversation

bluss
Copy link
Member

@bluss bluss commented Apr 18, 2020

Add new constructor - Array::maybe_uninit() that makes an uninitialized array. This is represented in the type system as the array having the element type MaybeUninit<T>, and can be converted to a proper array of T when it has been fully initialized.

Fixes #685

Zip's apply_assign_into can write to MaybeUninit elements, but more than that, it is pretty manual work, but it can at least be done in safe code. The only unsafe step is to promise all elements are initialized, and calling .assume_init().

The updated example - sort-axis.rs shows how usage remains similar to the old constructor, but it is much easier to be confident about having done it correctly - and it supports non-Copy elements.

ManuallyDrop has the benefit that we use it up front, instead of after
any "critical" operations.
Add representation trait RawDataSubst that array storage types correctly
(emulation of higher kinded types). Implement it as a transmute-like
operation, using the representation guarantees that MaybeUninit
documents. Make it a public method - avaialable on all array types -
owned arrays, arcarray, array views and so on.

The safety percussions of exposing this transformation are only explored
to an extent, but it's a type change without value conversion so there
should not be much that can go wrong.

Interesting aspects include being able to have one ArcArray handle with
the old type and one with the new type, or one owned array with old and
a view with new.
@bluss bluss merged commit 1229eea into master Apr 18, 2020
@bluss bluss deleted the generic-maybe-uninit branch April 18, 2020 20:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Change uninitialized to return an array of MaybeUninit
1 participant