-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWallet.cpp
131 lines (119 loc) · 3.41 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
#include "Wallet.h"
#include <iostream>
#include "CSVReader.h"
Wallet::Wallet()
{
// Constructor definition
}
std::ostream& operator<<(std::ostream& os, Wallet& wallet)
{
os << wallet.toString();
return os;
}
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;
}
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::containsCurrency(std::string type, double amount)
{
if (currencies.count(type) == 0) //not there yet
return false;
else
return currencies[type] >= amount;
}
bool Wallet::removeCurrency(std::string type, double amount)
{
if (amount < 0)
{
throw std::exception{};
}
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))
{
currencies[type] -= amount;
return true;
}
else // they have it but not enough
return false;
}
}
bool Wallet::canFulfillOrder(OrderBookEntry order)
{
std::vector<std::string> currs = CSVReader::tokenise(order.product, '/');
if (currs.size() != 2)
{
std::cerr << "Invalid product format: " << order.product << "\n";
return false;
}
if (order.orderType == OrderBookType::ask)
{
if (!containsCurrency(currs[0], order.amount))
{
std::cerr << "Insufficient " << currs[0] << " in wallet for ask of " << order.amount << "\n";
return false;
}
}
else if (order.orderType == OrderBookType::bid)
{
double requiredFunds = order.amount * order.price;
if (!containsCurrency(currs[1], requiredFunds))
{
std::cerr << "Insufficient " << currs[1] << " in wallet for bid of " << requiredFunds << "\n";
return false;
}
}
return true;
}
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;
}
}