#include "hmbdc/app/Base.hpp"
#include "hmbdc/os/Signals.hpp"
#include <iostream>
#include <string>
#include <iterator>
struct MarketData
MarketData(string const& s) {
strncpy(symbol, s.c_str(), sizeof(symbol));
}
char symbol[16];
};
struct MarketDataPropagator
:
Client<MarketDataPropagator> {
MarketDataPropagator()
: ctx_("market-data") {
}
void readMarketData() {
for (auto iit = istream_iterator<string>(cin)
; iit != istream_iterator<string>()
; iit ++) {
ctx_.sendInPlace<MarketData>(*iit);
}
}
private:
SenderContext ctx_;
};
void runSource() {
MarketDataPropagator mp;
mp.readMarketData();
}
struct TradingModel
:
Client<TradingModel, MarketData> {
TradingModel(char const* symbol)
: symbol_(symbol) {
}
void handleMessageCb(MarketData const& m) {
if (symbol_ == m.symbol) {
cout << "recv market data for " << symbol_ << endl;
}
}
private:
string symbol_;
};
void runRecv() {
RecvContext ctx("market-data");
TradingModel fastModel("gld");
TradingModel poolModels[] = {"msft", "goog", "amzn", "hpq", "ibm", "csco"};
ctx.start(2, 0x03);
for (auto& m : poolModels) {
ctx.addToPool(m);
}
ctx.start(fastModel, 0x04);
[&ctx] {
ctx.stop();
}
);
ctx.join();
}
int main(int argc, char** argv) {
if (argc == 1) {
runSource();
} else {
runRecv();
}
}