1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use std::slice;
use ffi;
use std::ptr::Unique;
pub struct Blob {
blob: Unique<ffi::Struct_CaffeBlob>,
}
impl Blob {
pub fn wrap(blob: Unique<ffi::Struct_CaffeBlob>) -> Blob {
assert!(!blob.is_null());
Blob { blob: blob }
}
pub fn len(&self) -> usize {
unsafe { ffi::CaffeBlobCount(self.blob.get()) as usize }
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn as_slice(&self) -> &[f32] {
let count: usize = self.len();
unsafe {
let data = ffi::CaffeBlobCPUData(self.blob.get());
slice::from_raw_parts(data, count)
}
}
pub fn as_mut_slice(&mut self) -> &mut [f32] {
let count: usize = self.len();
unsafe {
let data = ffi::CaffeBlobMutableCPUData(self.blob.get_mut());
slice::from_raw_parts_mut(data, count)
}
}
pub fn set_data(&mut self, data: &mut [f32]) -> () {
assert_eq!(data.len(), self.len());
unsafe {
ffi::CaffeBlobSetCPUData(self.blob.get_mut(), data.as_mut_ptr())
}
}
}
impl Drop for Blob {
fn drop(&mut self) {
unsafe { ffi::CaffeBlobFree(self.blob.get_mut()) }
}
}