Skip to main content

perpl_sdk/state/l3_book/
order.rs

1//! Book order representation with intrusive linked list pointers.
2
3use std::ops::{Deref, DerefMut};
4
5use crate::{state::Order, types};
6
7/// Individual order in the book with linked list pointers.
8///
9/// Each order belongs to a doubly-linked list at its price level,
10/// enabling O(1) insertion/removal and natural FIFO ordering.
11#[derive(Clone, Debug)]
12pub struct BookOrder {
13    order: Order,
14    /// Previous order in queue (toward head). None if this is the head.
15    prev: Option<types::OrderId>,
16    /// Next order in queue (toward tail). None if this is the tail.
17    next: Option<types::OrderId>,
18}
19
20impl BookOrder {
21    /// Create a new book order (initially unlinked).
22    pub fn new(order: Order) -> Self { Self { order, prev: None, next: None } }
23
24    /// Previous order in the FIFO queue (toward head).
25    pub(crate) fn prev(&self) -> Option<types::OrderId> { self.prev }
26
27    /// Next order in the FIFO queue (toward tail).
28    pub(crate) fn next(&self) -> Option<types::OrderId> { self.next }
29
30    /// Update the underlying order data (for size changes).
31    pub(crate) fn update_order(&mut self, order: Order) { self.order = order; }
32
33    /// Set the previous order pointer.
34    pub(crate) fn set_prev(&mut self, prev: Option<types::OrderId>) { self.prev = prev; }
35
36    /// Set the next order pointer.
37    pub(crate) fn set_next(&mut self, next: Option<types::OrderId>) { self.next = next; }
38}
39
40impl Deref for BookOrder {
41    type Target = Order;
42
43    fn deref(&self) -> &Self::Target { &self.order }
44}
45
46impl DerefMut for BookOrder {
47    fn deref_mut(&mut self) -> &mut Self::Target { &mut self.order }
48}