#include struct CurveName { enum class __attribute__ ((__packed__)) Seniority { Senior, Subordinated }; enum class __attribute__ ((__packed__)) DocClause { XR14, MR14, MM14, CR14 }; void serialize(unsigned char* buf) { memcpy(buf, &seniority, sizeof(Seniority)); buf += sizeof(Seniority); memcpy(buf, &doc_clause, sizeof(DocClause)); buf += sizeof(DocClause); strcpy((char*)buf, ticker.c_str()); }; std::string full_ticker() { std::string r = ticker; return r.append("_").append(str_seniority()). append("_").append(str_doc_clause()); } void serialize(unsigned char* buf, size_t num) { memcpy(buf, &seniority, sizeof(Seniority)); buf += sizeof(Seniority); memcpy(buf, &doc_clause, sizeof(DocClause)); buf += sizeof(DocClause); strncpy((char*)buf, ticker.c_str(), num); }; CurveName(std::string& ticker, Seniority seniority, DocClause doc_clause) : ticker(ticker), seniority(seniority), doc_clause(doc_clause) {}; CurveName(const unsigned char* buf) { memcpy(&seniority, buf, sizeof(Seniority)); buf += sizeof(Seniority); memcpy(&doc_clause, buf, sizeof(DocClause)); buf += sizeof(DocClause); ticker = std::string((char*)buf); } CurveName() {}; size_t size() { return sizeof(Seniority) + sizeof(DocClause) + ticker.length() + 1; }; bool operator<(const CurveName &other) const { return ticker < other.ticker || ((ticker == other.ticker) && (seniority < other.seniority)) || ((ticker == other.ticker) && (seniority == other.seniority) && (doc_clause < other.doc_clause)); } std::string str_seniority() const { switch (seniority) { case Seniority::Senior: return "Senior"; case Seniority::Subordinated: return "Subordinated"; }; } std::string str_doc_clause() const { switch (doc_clause) { case DocClause::XR14: return "XR14"; case DocClause::MR14: return "MR14"; case DocClause::MM14: return "MM14"; case DocClause::CR14: return "CR14"; } } std::string ticker; Seniority seniority; DocClause doc_clause; };