nautilus_model/ffi/data/
deltas.rs1use nautilus_core::{UnixNanos, ffi::cvec::CVec};
17
18use crate::{
19 data::{OrderBookDelta, OrderBookDeltas, OrderBookDeltas_API},
20 enums::BookAction,
21 identifiers::InstrumentId,
22};
23
24#[unsafe(no_mangle)]
30pub extern "C" fn orderbook_deltas_new(
31 instrument_id: InstrumentId,
32 deltas: &CVec,
33) -> OrderBookDeltas_API {
34 let CVec { ptr, len, cap } = *deltas;
35 let deltas: Vec<OrderBookDelta> =
36 unsafe { Vec::from_raw_parts(ptr.cast::<OrderBookDelta>(), len, cap) };
37 let cloned_deltas = deltas.clone();
38 #[allow(
39 clippy::mem_forget,
40 reason = "C ABI retains ownership of the original vector; clone is returned to Rust"
41 )]
42 std::mem::forget(deltas);
43 OrderBookDeltas_API::new(OrderBookDeltas::new(instrument_id, cloned_deltas))
44}
45
46#[unsafe(no_mangle)]
47pub extern "C" fn orderbook_deltas_drop(deltas: OrderBookDeltas_API) {
48 drop(deltas); }
50
51#[unsafe(no_mangle)]
52pub extern "C" fn orderbook_deltas_clone(deltas: &OrderBookDeltas_API) -> OrderBookDeltas_API {
53 deltas.clone()
54}
55
56#[unsafe(no_mangle)]
57pub extern "C" fn orderbook_deltas_instrument_id(deltas: &OrderBookDeltas_API) -> InstrumentId {
58 deltas.instrument_id
59}
60
61#[unsafe(no_mangle)]
62pub extern "C" fn orderbook_deltas_vec_deltas(deltas: &OrderBookDeltas_API) -> CVec {
63 deltas.deltas.clone().into()
64}
65
66#[unsafe(no_mangle)]
70pub extern "C" fn orderbook_deltas_is_snapshot(deltas: &OrderBookDeltas_API) -> u8 {
71 deltas
72 .deltas
73 .first()
74 .map_or(0, |first| u8::from(first.action == BookAction::Clear))
75}
76
77#[unsafe(no_mangle)]
78pub extern "C" fn orderbook_deltas_flags(deltas: &OrderBookDeltas_API) -> u8 {
79 deltas.flags
80}
81
82#[unsafe(no_mangle)]
83pub extern "C" fn orderbook_deltas_sequence(deltas: &OrderBookDeltas_API) -> u64 {
84 deltas.sequence
85}
86
87#[unsafe(no_mangle)]
88pub extern "C" fn orderbook_deltas_ts_event(deltas: &OrderBookDeltas_API) -> UnixNanos {
89 deltas.ts_event
90}
91
92#[unsafe(no_mangle)]
93pub extern "C" fn orderbook_deltas_ts_init(deltas: &OrderBookDeltas_API) -> UnixNanos {
94 deltas.ts_init
95}
96
97#[unsafe(no_mangle)]
103pub extern "C" fn orderbook_deltas_vec_drop(v: CVec) {
104 let CVec { ptr, len, cap } = v;
105
106 assert!(
107 len <= cap,
108 "orderbook_deltas_vec_drop: len ({len}) > cap ({cap})"
109 );
110 assert!(
111 len == 0 || !ptr.is_null(),
112 "orderbook_deltas_vec_drop: null ptr with non-zero len ({len})"
113 );
114
115 let deltas: Vec<OrderBookDelta> =
116 unsafe { Vec::from_raw_parts(ptr.cast::<OrderBookDelta>(), len, cap) };
117 drop(deltas); }