-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathordermap.h
More file actions
40 lines (38 loc) · 1.09 KB
/
ordermap.h
File metadata and controls
40 lines (38 loc) · 1.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once
#include "order.h"
/**
* @brief lock-free map of external order ID -> Order
*/
class OrderMap {
static const int TABLE_SIZE = 1000000;
std::atomic<Order*> table[TABLE_SIZE];
public:
void add(Order *order){
int bucket = order->exchangeId % TABLE_SIZE;
Order* expected = table[bucket].load();
order->next = expected;
while(!table[bucket].compare_exchange_weak(expected,order)) {
order->next = expected;
}
}
Order* get(long exchangeId) {
int bucket = exchangeId % TABLE_SIZE;
Order *order = table[bucket].load();
while(order!=nullptr) {
if(order->exchangeId==exchangeId) return order;
order = order->next;
}
return nullptr;
}
std::vector<const Order*> all() {
std::vector<const Order*> orders;
for(int i=0;i<TABLE_SIZE;i++) {
Order *order = table[i].load();
while(order!=nullptr) {
orders.push_back(order);
order = order->next;
}
}
return orders;
}
};