-
Notifications
You must be signed in to change notification settings - Fork 0
/
Wallet.cpp
133 lines (113 loc) · 3.24 KB
/
Wallet.cpp
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "Wallet.h"
#include <iostream>
#include "CSVReader.h"
Wallet::Wallet()
{
}
void Wallet::insertCurrency(std::string type, double amount)
{
double balance;
if (amount < 0)
{
throw std::exception{};
}
if (currencies.count(type) == 0) // not there yet
{
balance = 0;
}
else { // is there
balance = currencies[type];
}
balance += amount;
currencies[type] = balance;
}
bool Wallet::removeCurrency(std::string type, double amount)
{
if (amount < 0)
{
return false;
}
if (currencies.count(type) == 0) // not there yet
{
//std::cout << "No currency for " << type << std::endl;
return false;
}
else { // is there - do we have enough
if (containsCurrency(type, amount))// we have enough
{
//std::cout << "Removing " << type << ": " << amount << std::endl;
currencies[type] -= amount;
return true;
}
else // they have it but not enough.
return false;
}
}
bool Wallet::containsCurrency(std::string type, double amount)
{
if (currencies.count(type) == 0) // not there yet
return false;
else
return currencies[type] >= amount;
}
std::string Wallet::toString()
{
std::string s;
for (std::pair<std::string, double> pair : currencies)
{
std::string currency = pair.first;
double amount = pair.second;
s += currency + " : " + std::to_string(amount) + "\n";
}
return s;
}
bool Wallet::canFulfillOrder(OrderBookEntry order)
{
std::vector<std::string> currs = CSVReader::tokenise(order.product, '/');
// ask
if (order.orderType == OrderBookType::ask)
{
double amount = order.amount;
std::string currency = currs[0];
std::cout << "Wallet::canFulfillOrder " << currency << " : " << amount << std::endl;
return containsCurrency(currency, amount);
}
// bid
if (order.orderType == OrderBookType::bid)
{
double amount = order.amount * order.price;
std::string currency = currs[1];
std::cout << "Wallet::canFulfillOrder " << currency << " : " << amount << std::endl;
return containsCurrency(currency, amount);
}
return false;
}
void Wallet::processSale(OrderBookEntry& sale)
{
std::vector<std::string> currs = CSVReader::tokenise(sale.product, '/');
// ask
if (sale.orderType == OrderBookType::asksale)
{
double outgoingAmount = sale.amount;
std::string outgoingCurrency = currs[0];
double incomingAmount = sale.amount * sale.price;
std::string incomingCurrency = currs[1];
currencies[incomingCurrency] += incomingAmount;
currencies[outgoingCurrency] -= outgoingAmount;
}
// bid
if (sale.orderType == OrderBookType::bidsale)
{
double incomingAmount = sale.amount;
std::string incomingCurrency = currs[0];
double outgoingAmount = sale.amount * sale.price;
std::string outgoingCurrency = currs[1];
currencies[incomingCurrency] += incomingAmount;
currencies[outgoingCurrency] -= outgoingAmount;
}
}
std::ostream& operator<<(std::ostream& os, Wallet& wallet)
{
os << wallet.toString();
return os;
}