stackvec 0.2.1

A crate to use stack-allocated Vectors (performance and/or no-std)
#![allow(dead_code)]

extern crate stackvec;
use stackvec::prelude::*;

use ::std::iter::{
	self,
	Iterator,
};

static NUMBERS: [u8; 9] = [
	5, 8, 9, 10, 6, 7, 4, 6, 7
];

mod counted_instances {
	use ::std::cell::Cell;

	thread_local! {
		static INSTANCES_COUNT: Cell<isize> = Cell::new(0);
	}

	#[derive(Debug)]
	pub struct Instance(());

	impl Default for Instance {
		fn default() -> Self
		{
			INSTANCES_COUNT.with(|slf| slf.set(slf.get() + 1));
			Instance(())
		}
	}


	impl Instance {
		#[allow(non_upper_case_globals)]
		pub const new
			: fn() -> Self
			= Self::default;

		pub fn clone (&self) -> Self { Self::new() }

		pub fn total_count () -> isize
		{
			INSTANCES_COUNT.with(Cell::get)
		}

		pub fn count_assert_balanced ()
		{
			use ::std::cmp::Ordering::*;
			let instance_count = Self::total_count();
			match instance_count.cmp(&0) {
				Less => panic!(
					concat!(
						"Error, instance count {} < 0 ",
						r"=> /!\ double free /!\",
					),
					instance_count,
				),
				Greater => panic!(
					concat!(
						"Error, instance count {} > 0 ",
						r"=> /!\ memory leak /!\",
					),
					instance_count,
				),
				Equal =>(),
			} 
		}
	}

	impl Drop for Instance {
		fn drop (&mut self)
		{
			INSTANCES_COUNT.with(|slf| slf.set(slf.get() - 1))
		}
	}
}

#[test]
fn build ()
{
	let array = StackVec::<[u8; 10]>::from_iter( 
		NUMBERS.iter().cloned()
	);
    println!("{:?}", array);
}

#[test]
fn build_with_drop_full ()
{
	use counted_instances::*;
	{
		let array = StackVec::<[Instance; 3]>::from_iter( 
			iter::repeat_with(Instance::new)
		);
	    println!("{:?}", array);
	}
	Instance::count_assert_balanced();
}

#[test]
fn build_with_drop_partial ()
{
	use counted_instances::*;
	{
		let mut array = StackVec::<[Instance; 3]>::default();
		array.try_push(
			Instance::new()
		).unwrap();
	    println!("{:?}", array);
	}
	Instance::count_assert_balanced();
}

#[test]
fn extend ()
{
	let mut array = StackVec::<[u8; 0x40]>::
		default();
    array.extend(Iterator::chain(
        (0 .. 56).map(|_| 0),
        b"Stackvec".iter().cloned(),
    ));
    println!("{:?}", array);
}


#[test]
fn iter ()
{
	let array = StackVec::<[u8; 10]>::from_iter(
		NUMBERS.iter().cloned()
	);
	for (value, expected_value) in Iterator::zip(array.iter(), &NUMBERS)
	{
	    assert_eq!(value, expected_value);
	};
}

#[test]
fn iter_mut ()
{
	let mut array = StackVec::from([0_u8; 10]);
	for (array_i, &value) in Iterator::zip(array.iter_mut(), &NUMBERS)
	{
		*array_i = value;
	};
	for (value, expected_value) in Iterator::zip(array.iter(), &NUMBERS)
	{
	    assert_eq!(value, expected_value);
	};
}

#[test]
fn into_iter ()
{
	let array = StackVec::<[u8; 10]>::from_iter(
		NUMBERS.iter().cloned()
	);
	assert_eq!(
		Vec::from_iter(array),
		Vec::from_iter(NUMBERS.iter().cloned()),
	);
}

#[test]
fn array_into_iter ()
{
	assert_eq!(
		Vec::from_iter(NUMBERS.into_iter()),
		Vec::from_iter(NUMBERS.iter().cloned()),
	);
}

#[test]
fn into_iter_with_drop_full ()
{
	use counted_instances::*;
	{
		let array = StackVec::<[_; 3]>::from_iter( 
			iter::repeat_with(Instance::new)
		);
	    println!("{:?}", array);
	    for _ in array {} 
	}
	Instance::count_assert_balanced();
}

#[test]
fn into_iter_with_drop_partial_left ()
{
	use counted_instances::*;
	{
		let array = StackVec::<[_; 3]>::from_iter( 
			iter::repeat_with(Instance::new)
		);
	    println!("{:?}", array);
	    let mut iterator = array.into_iter();
	    let _ = iterator.next();
	}
	Instance::count_assert_balanced();
}



#[test]
fn into_iter_with_drop_partial_right ()
{
	use counted_instances::*;
	{
		let array = StackVec::<[_; 3]>::from_iter( 
			iter::repeat_with(Instance::new)
		);
	    println!("{:?}", array);
	    let mut iterator = array.into_iter();
	    let _ = iterator.next_back();
	}
	Instance::count_assert_balanced();
}