#include #include #include struct CurveName { enum class Seniority: std::uint8_t { Senior, Subordinated, SLA }; enum class DocClause: std::uint8_t { XR14, MR14, MM14, CR14 }; std::string full_ticker() const { std::string r = {ticker.begin(), ticker.end()}; return r.append("_").append(str_seniority()). append("_").append(str_doc_clause()); } CurveName(const char* buf) : name(buf) { memcpy(&seniority, buf, sizeof(Seniority)); buf += sizeof(Seniority); memcpy(&doc_clause, buf, sizeof(DocClause)); buf += sizeof(DocClause); ticker = std::string_view((const char*)buf); } CurveName() {}; size_t size() const { return sizeof(Seniority) + sizeof(DocClause) + ticker.size() + 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"; case Seniority::SLA: return "SLA"; }; } 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"; } } inline TDate* defaulted() { return (TDate*)(name - sizeof(TDate)); } const char* name; std::string_view ticker; Seniority seniority; DocClause doc_clause; };