nautilus_backtest/ffi/
engine.rs1use std::{
17 fmt::Debug,
18 ops::{Deref, DerefMut},
19};
20
21use nautilus_common::ffi::{clock::TestClock_API, timer::TimeEventHandler};
22use nautilus_core::{
23 UnixNanos,
24 ffi::{cvec::CVec, parsing::u8_as_bool},
25};
26
27use crate::accumulator::TimeEventAccumulator;
28
29#[repr(C)]
30pub struct TimeEventAccumulatorAPI(Box<TimeEventAccumulator>);
31
32impl Deref for TimeEventAccumulatorAPI {
33 type Target = TimeEventAccumulator;
34
35 fn deref(&self) -> &Self::Target {
36 &self.0
37 }
38}
39
40impl Debug for TimeEventAccumulatorAPI {
41 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42 write!(f, "TimeEventAccumulatorAPI({:p})", &*self.0)
45 }
46}
47
48impl DerefMut for TimeEventAccumulatorAPI {
49 fn deref_mut(&mut self) -> &mut Self::Target {
50 &mut self.0
51 }
52}
53
54#[unsafe(no_mangle)]
55pub extern "C" fn time_event_accumulator_new() -> TimeEventAccumulatorAPI {
56 TimeEventAccumulatorAPI(Box::default())
57}
58
59#[unsafe(no_mangle)]
60pub extern "C" fn time_event_accumulator_drop(accumulator: TimeEventAccumulatorAPI) {
61 drop(accumulator); }
63
64#[unsafe(no_mangle)]
65pub extern "C" fn time_event_accumulator_advance_clock(
66 accumulator: &mut TimeEventAccumulatorAPI,
67 clock: &mut TestClock_API,
68 to_time_ns: UnixNanos,
69 set_time: u8,
70) {
71 accumulator.advance_clock(clock, to_time_ns, u8_as_bool(set_time));
72}
73
74#[unsafe(no_mangle)]
75pub extern "C" fn time_event_accumulator_drain(accumulator: &mut TimeEventAccumulatorAPI) -> CVec {
76 let handlers: Vec<TimeEventHandler> = accumulator.drain().into_iter().map(Into::into).collect();
77 handlers.into()
78}