parent
9bd5698b9d
commit
b8b2793d2b
@ -0,0 +1,95 @@
|
||||
use super::*;
|
||||
use std::{
|
||||
marker::PhantomData,
|
||||
};
|
||||
|
||||
pub struct InitIter<'a, T>
|
||||
{
|
||||
from: &'a mut HeapArray<T>,
|
||||
current_idex: usize,
|
||||
}
|
||||
|
||||
pub struct Init<'a, T>
|
||||
{
|
||||
ptr: *mut T,
|
||||
init_ok: bool,
|
||||
_marker: PhantomData<&'a T>,
|
||||
}
|
||||
|
||||
impl<'a, T> InitIter<'a, T>
|
||||
{
|
||||
pub(crate) fn new(from: &'a mut HeapArray<T>, current_idex: usize) -> InitIter<'a, T>
|
||||
{
|
||||
InitIter {
|
||||
from,
|
||||
current_idex,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> Iterator for InitIter<'a, T>
|
||||
{
|
||||
type Item = Init<'a, T>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item>
|
||||
{
|
||||
if self.current_idex >= self.from.len() {
|
||||
None
|
||||
} else {
|
||||
self.current_idex+=1;
|
||||
unsafe {
|
||||
Some(Init{
|
||||
ptr: self.from.as_mut_ptr().offset((self.current_idex as isize)-1),
|
||||
init_ok: false,
|
||||
_marker: PhantomData,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> Init<'a, T>
|
||||
{
|
||||
pub fn is_init(&self) -> bool
|
||||
{
|
||||
self.init_ok
|
||||
}
|
||||
pub unsafe fn assume_init(&mut self)
|
||||
{
|
||||
self.init_ok = true;
|
||||
}
|
||||
pub fn put(&mut self, value: T) -> &mut T
|
||||
{
|
||||
if self.init_ok {
|
||||
unsafe {
|
||||
*self.ptr = value;
|
||||
return &mut (*self.ptr);
|
||||
}
|
||||
}
|
||||
self.init_ok = true;
|
||||
unsafe {
|
||||
ptr::put(self.ptr, value);
|
||||
&mut (*self.ptr)
|
||||
}
|
||||
}
|
||||
pub fn get(&self) -> Option<&T>
|
||||
{
|
||||
unsafe {
|
||||
if self.init_ok {
|
||||
Some(& (*self.ptr))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
pub fn get_mut(&mut self) -> Option<&mut T>
|
||||
{
|
||||
unsafe {
|
||||
if self.init_ok {
|
||||
Some(&mut (*self.ptr))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue