torch_sys/
io.rs

1use libc::{c_void, size_t};
2use std::io::{Read, Seek, SeekFrom, Write};
3
4pub trait ReadStream: Read + Seek {}
5
6#[no_mangle]
7extern "C" fn tch_write_stream_destructor(stream_ptr: *mut c_void) {
8    unsafe {
9        let boxed_stream: Box<Box<dyn Write>> = Box::from_raw(stream_ptr as *mut Box<dyn Write>);
10        drop(boxed_stream)
11    }
12}
13
14#[no_mangle]
15extern "C" fn tch_write_stream_write(
16    stream_ptr: *mut c_void,
17    buf: *const u8,
18    size: size_t,
19    out_size: *mut size_t,
20) -> bool {
21    unsafe {
22        let boxed_stream = stream_ptr as *mut Box<dyn Write>;
23        let buffer = std::slice::from_raw_parts(buf, size);
24        match (*boxed_stream).write(buffer) {
25            Ok(x) => {
26                *out_size = x;
27                true
28            }
29            Err(_) => false,
30        }
31    }
32}
33
34#[no_mangle]
35extern "C" fn tch_read_stream_destructor(stream_ptr: *mut c_void) {
36    unsafe {
37        let boxed_stream: Box<Box<dyn ReadStream>> =
38            Box::from_raw(stream_ptr as *mut Box<dyn ReadStream>);
39        drop(boxed_stream)
40    }
41}
42
43#[no_mangle]
44extern "C" fn tch_read_stream_stream_position(stream_ptr: *mut c_void, current: *mut u64) -> bool {
45    unsafe {
46        let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
47        match (*boxed_stream).stream_position() {
48            Ok(ret) => {
49                *current = ret;
50                true
51            }
52            Err(_) => false,
53        }
54    }
55}
56
57#[no_mangle]
58extern "C" fn tch_read_stream_seek_start(
59    stream_ptr: *mut c_void,
60    pos: u64,
61    new_pos: *mut u64,
62) -> bool {
63    unsafe {
64        let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
65        match (*boxed_stream).seek(SeekFrom::Start(pos)) {
66            Ok(ret) => {
67                *new_pos = ret;
68                true
69            }
70            Err(_) => false,
71        }
72    }
73}
74
75#[no_mangle]
76extern "C" fn tch_read_stream_seek_end(
77    stream_ptr: *mut c_void,
78    pos: i64,
79    new_pos: *mut u64,
80) -> bool {
81    unsafe {
82        let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
83        match (*boxed_stream).seek(SeekFrom::End(pos)) {
84            Ok(ret) => {
85                *new_pos = ret;
86                true
87            }
88            Err(_) => false,
89        }
90    }
91}
92
93#[no_mangle]
94extern "C" fn tch_read_stream_read(
95    stream_ptr: *mut c_void,
96    buf: *mut u8,
97    size: size_t,
98    read_size: *mut size_t,
99) -> bool {
100    unsafe {
101        let boxed_stream = stream_ptr as *mut Box<dyn ReadStream>;
102        let buffer = std::slice::from_raw_parts_mut(buf, size);
103        match (*boxed_stream).read(buffer) {
104            Ok(ret) => {
105                *read_size = ret;
106                true
107            }
108            Err(_) => false,
109        }
110    }
111}