cobia/
cape_array_real.rs

1use crate::{COBIAError, CapeArrayRealInFromProvider, C};
2use crate::cape_array::{CapeArrayIn,CapeArrayOut,ArrayInterface};
3use crate::{CapeArrayRealProviderIn,CapeArrayRealProviderOut};
4
5impl ArrayInterface<C::CapeReal> for C::ICapeArrayReal {
6
7	fn get(&mut self,data:&mut *mut C::CapeReal,size:&mut C::CapeSize) {
8		unsafe { (*self.vTbl).get.unwrap()(self.me,data as *mut *mut C::CapeReal,size) };
9	}
10
11	fn set(&mut self,data:&mut *mut C::CapeReal,size:C::CapeSize) -> C::CapeResult {
12		unsafe { (*self.vTbl).setsize.unwrap()(self.me,size,data as *mut *mut C::CapeReal) }
13	}
14
15	fn get_const(&self,data:&mut *const C::CapeReal,size:&mut C::CapeSize) {
16		unsafe { (*self.vTbl).get.unwrap()(self.me,data as *mut *const C::CapeReal as *mut *mut C::CapeReal,size) };
17	}
18}
19
20/// CapeArrayRealIn wraps an ICapeArrayReal interface pointer.
21///
22/// Given an ICapeArrayReal interface pointer, this allows setting
23///  and getting the elements.
24///
25/// This interface is typically used as arguments to rust methods
26/// on traits that are generated from CAPE-OPEN interfaces that have
27/// ICapeArrayReal input arguments.
28///
29/// # Examples
30///
31/// ```
32/// use cobia::*;
33///
34/// fn test_content(a: &CapeArrayRealIn) {
35///     assert_eq!(a.as_vec(), vec![4.5,6.5]);
36/// }
37/// 
38/// let arr = cobia::CapeArrayRealSlice::new(&[4.5,6.5]);
39/// test_content(&CapeArrayRealInFromProvider::from(&arr).as_cape_array_real_in());
40/// ```
41
42pub type CapeArrayRealIn<'a> = CapeArrayIn<'a,C::CapeReal,C::ICapeArrayReal>;
43
44impl<'a> CapeArrayRealProviderIn for CapeArrayRealIn<'a> {
45	fn as_cape_array_real_in(&self) -> C::ICapeArrayReal {
46		unsafe{**self.interface}
47	}
48}
49
50/// CapeArrayRealOut wraps an ICapeArrayReal interface pointer.
51///
52/// Given an ICapeArrayReal interface pointer, this allows setting
53///  and getting the elements.
54///
55/// This interface is typically used as arguments to rust methods
56/// on traits that are generated from CAPE-OPEN interfaces that have
57/// ICapeArrayReal output arguments.
58///
59/// # Examples
60///
61/// ```
62/// use cobia::*;
63///
64/// fn set_content(a: &mut CapeArrayRealOut) {
65///     a.put_array(&[4.5,6.5]).unwrap();
66/// }
67/// 
68/// let mut arr = cobia::CapeArrayRealVec::new();
69/// set_content(&mut CapeArrayRealOutFromProvider::from(&mut arr).as_cape_array_real_out());
70/// assert_eq!(arr.as_vec(), &vec![4.5,6.5]);
71/// ```
72
73pub type CapeArrayRealOut<'a> = CapeArrayOut<'a,C::CapeReal,C::ICapeArrayReal>;
74
75impl<'a> CapeArrayRealOut<'a> {
76
77	/// Set the content of the real array from any object that implements CapeArrayRealProviderIn.
78	///
79	/// # Arguments
80	/// * `array` - An object that implements CapeArrayRealProviderIn
81	///
82	/// # Examples
83	///
84	/// ```
85	/// use cobia::*;
86	/// let mut arr = cobia::CapeArrayRealVec::new();
87	/// let mut arr1 = cobia::CapeArrayRealVec::from_slice(&vec![125.1,-19.4,3.14]);
88	/// CapeArrayRealOutFromProvider::from(&mut arr).as_cape_array_real_out().set(&arr1);
89	/// assert_eq!(arr.as_vec(), &[125.1,-19.4,3.14]);
90	/// ```
91
92	pub fn set<T:CapeArrayRealProviderIn>(&mut self,array:&T) -> Result<(), COBIAError> {
93		let mut real_array_in_from_provider = CapeArrayRealInFromProvider::from(array);
94		let real_array=real_array_in_from_provider.as_cape_array_real_in();
95		self.resize(real_array.size())?;
96		for i in 0..real_array.size() {
97			self[i]=real_array[i];
98		}
99		Ok(())
100	}
101
102}
103
104impl<'a> CapeArrayRealProviderOut for CapeArrayRealOut<'a> {
105	fn as_cape_array_real_out(&mut self) -> C::ICapeArrayReal {
106		unsafe { **self.interface }
107	}
108}