Skip to main content

af_iperps/
order_id.rs

1use crate::order_helpers::Side;
2
3/// Return the side of the order
4pub const fn order_side(order_id: u128) -> Side {
5    if order_id < 0x8000_0000_0000_0000_0000_0000_0000_0000 {
6        Side::Ask
7    } else {
8        Side::Bid
9    }
10}
11
12/// Return order ID for `price` and `counter` on given `side`
13pub const fn order_id(price: u64, counter: u64, side: Side) -> u128 {
14    // Return corresponding order ID type based on side
15    match side {
16        Side::Ask => order_id_ask(price, counter),
17        Side::Bid => order_id_bid(price, counter),
18    }
19}
20
21/// Return order ID for ask with `price` and `counter`
22pub const fn order_id_ask(price: u64, counter: u64) -> u128 {
23    ((price as u128) << 64) | (counter as u128)
24}
25
26/// Return order ID for bid with `price` and `counter`
27pub const fn order_id_bid(price: u64, counter: u64) -> u128 {
28    (((price ^ 0xffff_ffff_ffff_ffff) as u128) << 64) | (counter as u128)
29}
30
31/// Returns price of a given `order_id`.
32pub const fn price(order_id: u128) -> u64 {
33    match order_side(order_id) {
34        Side::Ask => price_ask(order_id),
35        Side::Bid => price_bid(order_id),
36    }
37}
38
39/// Returns price of a given ask `order_id`.
40pub const fn price_ask(order_id: u128) -> u64 {
41    (order_id >> 64) as u64
42}
43
44/// Returns price of a given bid `order_id`.
45pub const fn price_bid(order_id: u128) -> u64 {
46    ((order_id >> 64) as u64) ^ 0xffff_ffff_ffff_ffff
47}
48
49/// Returns counter of a given `order_id`.
50pub const fn counter(order_id: u128) -> u64 {
51    (order_id & 0x0000_0000_0000_0000_ffff_ffff_ffff_ffff) as u64
52}