summaryrefslogtreecommitdiffstats
path: root/c_layer/survival_curve.hpp
blob: ce71cc16d27ff4224246d263c9853222c0a4e4a7 (plain)
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
#include <string>

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() const {
        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;
};