ndarray/
data_traits.rs

1// Copyright 2014-2016 bluss and ndarray developers.
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9//! The data (inner representation) traits for ndarray
10
11#[allow(unused_imports)]
12use rawpointer::PointerExt;
13
14#[cfg(target_has_atomic = "ptr")]
15use alloc::sync::Arc;
16
17#[cfg(not(target_has_atomic = "ptr"))]
18use portable_atomic_util::Arc;
19
20#[cfg(not(feature = "std"))]
21use alloc::vec::Vec;
22use std::mem::MaybeUninit;
23use std::mem::{self, size_of};
24use std::ptr::NonNull;
25
26use crate::{ArcArray, Array, ArrayBase, CowRepr, Dimension, OwnedArcRepr, OwnedRepr, RawViewRepr, ViewRepr};
27
28/// Array representation trait.
29///
30/// For an array that meets the invariants of the `ArrayBase` type. This trait
31/// does not imply any ownership or lifetime; pointers to elements in the array
32/// may not be safe to dereference.
33///
34/// ***Note:*** `RawData` is not an extension interface at this point.
35/// Traits in Rust can serve many different roles. This trait is public because
36/// it is used as a bound on public methods.
37#[allow(clippy::missing_safety_doc)] // not implementable downstream
38pub unsafe trait RawData: Sized
39{
40    /// The array element type.
41    type Elem;
42
43    #[doc(hidden)]
44    fn _is_pointer_inbounds(&self, ptr: *const Self::Elem) -> bool;
45
46    private_decl! {}
47}
48
49/// Array representation trait.
50///
51/// For an array with writable elements.
52///
53/// ***Internal trait, see `RawData`.***
54#[allow(clippy::missing_safety_doc)] // not implementable downstream
55pub unsafe trait RawDataMut: RawData
56{
57    /// If possible, ensures that the array has unique access to its data.
58    ///
59    /// The implementer must ensure that if the input is contiguous, then the
60    /// output has the same strides as input.
61    ///
62    /// Additionally, if `Self` provides safe mutable access to array elements,
63    /// then this method **must** panic or ensure that the data is unique.
64    #[doc(hidden)]
65    fn try_ensure_unique<D>(_: &mut ArrayBase<Self, D>)
66    where
67        Self: Sized,
68        D: Dimension;
69
70    /// If possible, returns whether the array has unique access to its data.
71    ///
72    /// If `Self` provides safe mutable access to array elements, then it
73    /// **must** return `Some(_)`.
74    #[doc(hidden)]
75    fn try_is_unique(&mut self) -> Option<bool>;
76}
77
78/// Array representation trait.
79///
80/// An array representation that can be cloned.
81///
82/// ***Internal trait, see `RawData`.***
83#[allow(clippy::missing_safety_doc)] // not implementable downstream
84pub unsafe trait RawDataClone: RawData
85{
86    #[doc(hidden)]
87    /// Unsafe because, `ptr` must point inside the current storage.
88    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>);
89
90    #[doc(hidden)]
91    unsafe fn clone_from_with_ptr(&mut self, other: &Self, ptr: NonNull<Self::Elem>) -> NonNull<Self::Elem>
92    {
93        let (data, ptr) = other.clone_with_ptr(ptr);
94        *self = data;
95        ptr
96    }
97}
98
99/// Array representation trait.
100///
101/// For an array with elements that can be accessed with safe code.
102///
103/// ***Internal trait, see `RawData`.***
104#[allow(clippy::missing_safety_doc)] // not implementable downstream
105pub unsafe trait Data: RawData
106{
107    /// Converts the array to a uniquely owned array, cloning elements if necessary.
108    #[doc(hidden)]
109    #[allow(clippy::wrong_self_convention)]
110    fn into_owned<D>(self_: ArrayBase<Self, D>) -> Array<Self::Elem, D>
111    where
112        Self::Elem: Clone,
113        D: Dimension;
114
115    /// Converts the array into `Array<A, D>` if this is possible without
116    /// cloning the array elements. Otherwise, returns `self_` unchanged.
117    #[doc(hidden)]
118    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
119    where D: Dimension;
120
121    /// Return a shared ownership (copy on write) array based on the existing one,
122    /// cloning elements if necessary.
123    #[doc(hidden)]
124    #[allow(clippy::wrong_self_convention)]
125    fn to_shared<D>(self_: &ArrayBase<Self, D>) -> ArcArray<Self::Elem, D>
126    where
127        Self::Elem: Clone,
128        D: Dimension,
129    {
130        // clone to shared
131        self_.to_owned().into_shared()
132    }
133}
134
135/// Array representation trait.
136///
137/// For an array with writable elements that can be accessed with safe code.
138///
139/// ***Internal trait, see `Data`.***
140//
141// # For implementers
142//
143// If you implement the `DataMut` trait, you are guaranteeing that the
144// `RawDataMut::try_ensure_unique` implementation always panics or ensures that
145// the data is unique. You are also guaranteeing that `try_is_unique` always
146// returns `Some(_)`.
147#[allow(clippy::missing_safety_doc)] // not implementable downstream
148pub unsafe trait DataMut: Data + RawDataMut
149{
150    /// Ensures that the array has unique access to its data.
151    #[doc(hidden)]
152    #[inline]
153    fn ensure_unique<D>(self_: &mut ArrayBase<Self, D>)
154    where
155        Self: Sized,
156        D: Dimension,
157    {
158        Self::try_ensure_unique(self_)
159    }
160
161    /// Returns whether the array has unique access to its data.
162    #[doc(hidden)]
163    #[inline]
164    #[allow(clippy::wrong_self_convention)] // mut needed for Arc types
165    fn is_unique(&mut self) -> bool
166    {
167        self.try_is_unique().unwrap()
168    }
169}
170
171unsafe impl<A> RawData for RawViewRepr<*const A>
172{
173    type Elem = A;
174
175    #[inline(always)]
176    fn _is_pointer_inbounds(&self, _ptr: *const Self::Elem) -> bool
177    {
178        true
179    }
180
181    private_impl! {}
182}
183
184unsafe impl<A> RawDataClone for RawViewRepr<*const A>
185{
186    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
187    {
188        (*self, ptr)
189    }
190}
191
192unsafe impl<A> RawData for RawViewRepr<*mut A>
193{
194    type Elem = A;
195
196    #[inline(always)]
197    fn _is_pointer_inbounds(&self, _ptr: *const Self::Elem) -> bool
198    {
199        true
200    }
201
202    private_impl! {}
203}
204
205unsafe impl<A> RawDataMut for RawViewRepr<*mut A>
206{
207    #[inline]
208    fn try_ensure_unique<D>(_: &mut ArrayBase<Self, D>)
209    where
210        Self: Sized,
211        D: Dimension,
212    {
213    }
214
215    #[inline]
216    fn try_is_unique(&mut self) -> Option<bool>
217    {
218        None
219    }
220}
221
222unsafe impl<A> RawDataClone for RawViewRepr<*mut A>
223{
224    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
225    {
226        (*self, ptr)
227    }
228}
229
230unsafe impl<A> RawData for OwnedArcRepr<A>
231{
232    type Elem = A;
233
234    fn _is_pointer_inbounds(&self, self_ptr: *const Self::Elem) -> bool
235    {
236        self.0._is_pointer_inbounds(self_ptr)
237    }
238
239    private_impl! {}
240}
241
242// NOTE: Copy on write
243unsafe impl<A> RawDataMut for OwnedArcRepr<A>
244where A: Clone
245{
246    fn try_ensure_unique<D>(self_: &mut ArrayBase<Self, D>)
247    where
248        Self: Sized,
249        D: Dimension,
250    {
251        if Arc::get_mut(&mut self_.data.0).is_some() {
252            return;
253        }
254        if self_.dim.size() <= self_.data.0.len() / 2 {
255            // Clone only the visible elements if the current view is less than
256            // half of backing data.
257            *self_ = self_.to_owned().into_shared();
258            return;
259        }
260        let rcvec = &mut self_.data.0;
261        let a_size = mem::size_of::<A>() as isize;
262        let our_off = if a_size != 0 {
263            (self_.ptr.as_ptr() as isize - rcvec.as_ptr() as isize) / a_size
264        } else {
265            0
266        };
267        let rvec = Arc::make_mut(rcvec);
268        unsafe {
269            self_.ptr = rvec.as_nonnull_mut().offset(our_off);
270        }
271    }
272
273    fn try_is_unique(&mut self) -> Option<bool>
274    {
275        Some(Arc::get_mut(&mut self.0).is_some())
276    }
277}
278
279unsafe impl<A> Data for OwnedArcRepr<A>
280{
281    fn into_owned<D>(mut self_: ArrayBase<Self, D>) -> Array<Self::Elem, D>
282    where
283        A: Clone,
284        D: Dimension,
285    {
286        Self::ensure_unique(&mut self_);
287        let data = Arc::try_unwrap(self_.data.0).ok().unwrap();
288        // safe because data is equivalent
289        unsafe { ArrayBase::from_data_ptr(data, self_.ptr).with_strides_dim(self_.strides, self_.dim) }
290    }
291
292    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
293    where D: Dimension
294    {
295        match Arc::try_unwrap(self_.data.0) {
296            Ok(owned_data) => unsafe {
297                // Safe because the data is equivalent.
298                Ok(ArrayBase::from_data_ptr(owned_data, self_.ptr).with_strides_dim(self_.strides, self_.dim))
299            },
300            Err(arc_data) => unsafe {
301                // Safe because the data is equivalent; we're just
302                // reconstructing `self_`.
303                Err(ArrayBase::from_data_ptr(OwnedArcRepr(arc_data), self_.ptr)
304                    .with_strides_dim(self_.strides, self_.dim))
305            },
306        }
307    }
308
309    #[allow(clippy::wrong_self_convention)]
310    fn to_shared<D>(self_: &ArrayBase<Self, D>) -> ArcArray<Self::Elem, D>
311    where
312        Self::Elem: Clone,
313        D: Dimension,
314    {
315        // to shared using clone of OwnedArcRepr without clone of raw data.
316        self_.clone()
317    }
318}
319
320unsafe impl<A> DataMut for OwnedArcRepr<A> where A: Clone {}
321
322unsafe impl<A> RawDataClone for OwnedArcRepr<A>
323{
324    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
325    {
326        // pointer is preserved
327        (self.clone(), ptr)
328    }
329}
330
331unsafe impl<A> RawData for OwnedRepr<A>
332{
333    type Elem = A;
334
335    fn _is_pointer_inbounds(&self, self_ptr: *const Self::Elem) -> bool
336    {
337        let slc = self.as_slice();
338        let ptr = slc.as_ptr() as *mut A;
339        let end = unsafe { ptr.add(slc.len()) };
340        self_ptr >= ptr && self_ptr <= end
341    }
342
343    private_impl! {}
344}
345
346unsafe impl<A> RawDataMut for OwnedRepr<A>
347{
348    #[inline]
349    fn try_ensure_unique<D>(_: &mut ArrayBase<Self, D>)
350    where
351        Self: Sized,
352        D: Dimension,
353    {
354    }
355
356    #[inline]
357    fn try_is_unique(&mut self) -> Option<bool>
358    {
359        Some(true)
360    }
361}
362
363unsafe impl<A> Data for OwnedRepr<A>
364{
365    #[inline]
366    fn into_owned<D>(self_: ArrayBase<Self, D>) -> Array<Self::Elem, D>
367    where
368        A: Clone,
369        D: Dimension,
370    {
371        self_
372    }
373
374    #[inline]
375    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
376    where D: Dimension
377    {
378        Ok(self_)
379    }
380}
381
382unsafe impl<A> DataMut for OwnedRepr<A> {}
383
384unsafe impl<A> RawDataClone for OwnedRepr<A>
385where A: Clone
386{
387    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
388    {
389        let mut u = self.clone();
390        let mut new_ptr = u.as_nonnull_mut();
391        if size_of::<A>() != 0 {
392            let our_off = (ptr.as_ptr() as isize - self.as_ptr() as isize) / mem::size_of::<A>() as isize;
393            new_ptr = new_ptr.offset(our_off);
394        }
395        (u, new_ptr)
396    }
397
398    unsafe fn clone_from_with_ptr(&mut self, other: &Self, ptr: NonNull<Self::Elem>) -> NonNull<Self::Elem>
399    {
400        let our_off = if size_of::<A>() != 0 {
401            (ptr.as_ptr() as isize - other.as_ptr() as isize) / mem::size_of::<A>() as isize
402        } else {
403            0
404        };
405        self.clone_from(other);
406        self.as_nonnull_mut().offset(our_off)
407    }
408}
409
410unsafe impl<'a, A> RawData for ViewRepr<&'a A>
411{
412    type Elem = A;
413
414    #[inline(always)]
415    fn _is_pointer_inbounds(&self, _ptr: *const Self::Elem) -> bool
416    {
417        true
418    }
419
420    private_impl! {}
421}
422
423unsafe impl<'a, A> Data for ViewRepr<&'a A>
424{
425    fn into_owned<D>(self_: ArrayBase<Self, D>) -> Array<Self::Elem, D>
426    where
427        Self::Elem: Clone,
428        D: Dimension,
429    {
430        self_.to_owned()
431    }
432
433    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
434    where D: Dimension
435    {
436        Err(self_)
437    }
438}
439
440unsafe impl<'a, A> RawDataClone for ViewRepr<&'a A>
441{
442    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
443    {
444        (*self, ptr)
445    }
446}
447
448unsafe impl<'a, A> RawData for ViewRepr<&'a mut A>
449{
450    type Elem = A;
451
452    #[inline(always)]
453    fn _is_pointer_inbounds(&self, _ptr: *const Self::Elem) -> bool
454    {
455        true
456    }
457
458    private_impl! {}
459}
460
461unsafe impl<'a, A> RawDataMut for ViewRepr<&'a mut A>
462{
463    #[inline]
464    fn try_ensure_unique<D>(_: &mut ArrayBase<Self, D>)
465    where
466        Self: Sized,
467        D: Dimension,
468    {
469    }
470
471    #[inline]
472    fn try_is_unique(&mut self) -> Option<bool>
473    {
474        Some(true)
475    }
476}
477
478unsafe impl<'a, A> Data for ViewRepr<&'a mut A>
479{
480    fn into_owned<D>(self_: ArrayBase<Self, D>) -> Array<Self::Elem, D>
481    where
482        Self::Elem: Clone,
483        D: Dimension,
484    {
485        self_.to_owned()
486    }
487
488    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
489    where D: Dimension
490    {
491        Err(self_)
492    }
493}
494
495unsafe impl<'a, A> DataMut for ViewRepr<&'a mut A> {}
496
497/// Array representation trait.
498///
499/// A representation which can be the owner of its data.
500///
501/// ***Internal trait, see `Data`.***
502// The owned storage represents the ownership and allocation of the array's elements.
503// The storage may be unique or shared ownership style; it must be an aliasable owner
504// (permit aliasing pointers, such as our separate array head pointer).
505//
506// The array storage must be initially mutable - copy on write arrays may require copying for
507// unsharing storage before mutating it. The initially allocated storage must be mutable so
508// that it can be mutated directly - through .raw_view_mut_unchecked() - for initialization.
509#[allow(clippy::missing_safety_doc)] // not implementable downstream
510pub unsafe trait DataOwned: Data
511{
512    /// Corresponding owned data with MaybeUninit elements
513    type MaybeUninit: DataOwned<Elem = MaybeUninit<Self::Elem>> + RawDataSubst<Self::Elem, Output = Self>;
514    #[doc(hidden)]
515    fn new(elements: Vec<Self::Elem>) -> Self;
516
517    /// Converts the data representation to a shared (copy on write)
518    /// representation, cloning the array elements if necessary.
519    #[doc(hidden)]
520    #[allow(clippy::wrong_self_convention)]
521    fn into_shared<D>(self_: ArrayBase<Self, D>) -> ArcArray<Self::Elem, D>
522    where
523        Self::Elem: Clone,
524        D: Dimension;
525}
526
527/// Array representation trait.
528///
529/// A representation that is a lightweight view.
530///
531/// ***Internal trait, see `Data`.***
532#[allow(clippy::missing_safety_doc)] // not implementable downstream
533pub unsafe trait DataShared: Clone + Data + RawDataClone {}
534
535unsafe impl<A> DataShared for OwnedArcRepr<A> {}
536unsafe impl<'a, A> DataShared for ViewRepr<&'a A> {}
537
538unsafe impl<A> DataOwned for OwnedRepr<A>
539{
540    type MaybeUninit = OwnedRepr<MaybeUninit<A>>;
541
542    fn new(elements: Vec<A>) -> Self
543    {
544        OwnedRepr::from(elements)
545    }
546
547    fn into_shared<D>(self_: ArrayBase<Self, D>) -> ArcArray<A, D>
548    where
549        A: Clone,
550        D: Dimension,
551    {
552        ArcArray::from(self_)
553    }
554}
555
556unsafe impl<A> DataOwned for OwnedArcRepr<A>
557{
558    type MaybeUninit = OwnedArcRepr<MaybeUninit<A>>;
559
560    fn new(elements: Vec<A>) -> Self
561    {
562        OwnedArcRepr(Arc::new(OwnedRepr::from(elements)))
563    }
564
565    fn into_shared<D>(self_: ArrayBase<Self, D>) -> ArcArray<A, D>
566    where
567        A: Clone,
568        D: Dimension,
569    {
570        self_
571    }
572}
573
574unsafe impl<'a, A> RawData for CowRepr<'a, A>
575{
576    type Elem = A;
577
578    #[inline]
579    fn _is_pointer_inbounds(&self, ptr: *const Self::Elem) -> bool
580    {
581        match self {
582            CowRepr::View(view) => view._is_pointer_inbounds(ptr),
583            CowRepr::Owned(data) => data._is_pointer_inbounds(ptr),
584        }
585    }
586
587    private_impl! {}
588}
589
590unsafe impl<'a, A> RawDataMut for CowRepr<'a, A>
591where A: Clone
592{
593    #[inline]
594    fn try_ensure_unique<D>(array: &mut ArrayBase<Self, D>)
595    where
596        Self: Sized,
597        D: Dimension,
598    {
599        match array.data {
600            CowRepr::View(_) => {
601                let owned = array.to_owned();
602                array.data = CowRepr::Owned(owned.data);
603                array.ptr = owned.ptr;
604                array.dim = owned.dim;
605                array.strides = owned.strides;
606            }
607            CowRepr::Owned(_) => {}
608        }
609    }
610
611    #[inline]
612    fn try_is_unique(&mut self) -> Option<bool>
613    {
614        Some(self.is_owned())
615    }
616}
617
618unsafe impl<'a, A> RawDataClone for CowRepr<'a, A>
619where A: Clone
620{
621    unsafe fn clone_with_ptr(&self, ptr: NonNull<Self::Elem>) -> (Self, NonNull<Self::Elem>)
622    {
623        match self {
624            CowRepr::View(view) => {
625                let (new_view, ptr) = view.clone_with_ptr(ptr);
626                (CowRepr::View(new_view), ptr)
627            }
628            CowRepr::Owned(data) => {
629                let (new_data, ptr) = data.clone_with_ptr(ptr);
630                (CowRepr::Owned(new_data), ptr)
631            }
632        }
633    }
634
635    unsafe fn clone_from_with_ptr(&mut self, other: &Self, ptr: NonNull<Self::Elem>) -> NonNull<Self::Elem>
636    {
637        match (&mut *self, other) {
638            (CowRepr::View(self_), CowRepr::View(other)) => self_.clone_from_with_ptr(other, ptr),
639            (CowRepr::Owned(self_), CowRepr::Owned(other)) => self_.clone_from_with_ptr(other, ptr),
640            (_, CowRepr::Owned(other)) => {
641                let (cloned, ptr) = other.clone_with_ptr(ptr);
642                *self = CowRepr::Owned(cloned);
643                ptr
644            }
645            (_, CowRepr::View(other)) => {
646                let (cloned, ptr) = other.clone_with_ptr(ptr);
647                *self = CowRepr::View(cloned);
648                ptr
649            }
650        }
651    }
652}
653
654unsafe impl<'a, A> Data for CowRepr<'a, A>
655{
656    #[inline]
657    fn into_owned<D>(self_: ArrayBase<CowRepr<'a, A>, D>) -> Array<Self::Elem, D>
658    where
659        A: Clone,
660        D: Dimension,
661    {
662        match self_.data {
663            CowRepr::View(_) => self_.to_owned(),
664            CowRepr::Owned(data) => unsafe {
665                // safe because the data is equivalent so ptr, dims remain valid
666                ArrayBase::from_data_ptr(data, self_.ptr).with_strides_dim(self_.strides, self_.dim)
667            },
668        }
669    }
670
671    fn try_into_owned_nocopy<D>(self_: ArrayBase<Self, D>) -> Result<Array<Self::Elem, D>, ArrayBase<Self, D>>
672    where D: Dimension
673    {
674        match self_.data {
675            CowRepr::View(_) => Err(self_),
676            CowRepr::Owned(data) => unsafe {
677                // safe because the data is equivalent so ptr, dims remain valid
678                Ok(ArrayBase::from_data_ptr(data, self_.ptr).with_strides_dim(self_.strides, self_.dim))
679            },
680        }
681    }
682}
683
684unsafe impl<'a, A> DataMut for CowRepr<'a, A> where A: Clone {}
685
686unsafe impl<'a, A> DataOwned for CowRepr<'a, A>
687{
688    type MaybeUninit = CowRepr<'a, MaybeUninit<A>>;
689
690    fn new(elements: Vec<A>) -> Self
691    {
692        CowRepr::Owned(OwnedRepr::new(elements))
693    }
694
695    fn into_shared<D>(self_: ArrayBase<Self, D>) -> ArcArray<A, D>
696    where
697        A: Clone,
698        D: Dimension,
699    {
700        self_.into_owned().into_shared()
701    }
702}
703
704/// Array representation trait.
705///
706/// The RawDataSubst trait maps the element type of array storage, while
707/// keeping the same kind of storage.
708///
709/// For example, `RawDataSubst<B>` can map the type `OwnedRepr<A>` to `OwnedRepr<B>`.
710pub trait RawDataSubst<A>: RawData
711{
712    /// The resulting array storage of the same kind but substituted element type
713    type Output: RawData<Elem = A>;
714
715    /// Unsafely translate the data representation from one element
716    /// representation to another.
717    ///
718    /// ## Safety
719    ///
720    /// Caller must ensure the two types have the same representation.
721    unsafe fn data_subst(self) -> Self::Output;
722}
723
724impl<A, B> RawDataSubst<B> for OwnedRepr<A>
725{
726    type Output = OwnedRepr<B>;
727
728    unsafe fn data_subst(self) -> Self::Output
729    {
730        self.data_subst()
731    }
732}
733
734impl<A, B> RawDataSubst<B> for OwnedArcRepr<A>
735{
736    type Output = OwnedArcRepr<B>;
737
738    unsafe fn data_subst(self) -> Self::Output
739    {
740        OwnedArcRepr(Arc::from_raw(Arc::into_raw(self.0) as *const OwnedRepr<B>))
741    }
742}
743
744impl<A, B> RawDataSubst<B> for RawViewRepr<*const A>
745{
746    type Output = RawViewRepr<*const B>;
747
748    unsafe fn data_subst(self) -> Self::Output
749    {
750        RawViewRepr::new()
751    }
752}
753
754impl<A, B> RawDataSubst<B> for RawViewRepr<*mut A>
755{
756    type Output = RawViewRepr<*mut B>;
757
758    unsafe fn data_subst(self) -> Self::Output
759    {
760        RawViewRepr::new()
761    }
762}
763
764impl<'a, A: 'a, B: 'a> RawDataSubst<B> for ViewRepr<&'a A>
765{
766    type Output = ViewRepr<&'a B>;
767
768    unsafe fn data_subst(self) -> Self::Output
769    {
770        ViewRepr::new()
771    }
772}
773
774impl<'a, A: 'a, B: 'a> RawDataSubst<B> for ViewRepr<&'a mut A>
775{
776    type Output = ViewRepr<&'a mut B>;
777
778    unsafe fn data_subst(self) -> Self::Output
779    {
780        ViewRepr::new()
781    }
782}
783
784impl<'a, A: 'a, B: 'a> RawDataSubst<B> for CowRepr<'a, A>
785{
786    type Output = CowRepr<'a, B>;
787
788    unsafe fn data_subst(self) -> Self::Output
789    {
790        match self {
791            CowRepr::View(view) => CowRepr::View(view.data_subst()),
792            CowRepr::Owned(owned) => CowRepr::Owned(owned.data_subst()),
793        }
794    }
795}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy