summaryrefslogtreecommitdiffstats
path: root/cpp_layer/curve.hpp
blob: 5d1720d0ce881912c1576e99799f6225695935dd (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
#include <isda/tcurve.h>
#include <isda/cxzerocurve.h>
#include <vector>
#include <memory>

typedef long TDate;

class CurveObject {
public:
    CurveObject(TDate baseDate, std::vector<TDate> dates, std::vector<double> rates,
          double basis, long dayCountConv) {
        _ptr = JpmcdsMakeTCurve(baseDate, dates.data(), rates.data(), dates.size(),
                                basis, dayCountConv);
    }
    CurveObject(TCurve* ptr) {
        _ptr = ptr;
    }
    CurveObject(const CurveObject& other) {
        _ptr = JpmcdsCopyCurve(other._ptr);
    }
    CurveObject(CurveObject&& other) : _ptr(other._ptr) {
        other._ptr = nullptr;
    }
    CurveObject& operator=(const CurveObject& other) {
        if( this != &other) {
            JpmcdsFreeTCurve(_ptr);
            _ptr = JpmcdsCopyCurve(other._ptr);
        }
        return *this;
    }
    CurveObject& operator=(CurveObject&& other) {
        if( this != &other) {
            JpmcdsFreeTCurve(_ptr);
            _ptr = other._ptr;
            other._ptr = nullptr;
        }
        return *this;
    }

    TCurve* data() {
        return _ptr;
    }
    typedef TRatePt* iterator;
    typedef const TRatePt* const_iterator;
    iterator begin() { return _ptr->fArray; }
    iterator end() {return &_ptr->fArray[_ptr->fNumItems];}
    int size() {
        return _ptr->fNumItems;
    }
    TDate BaseDate() {
        return _ptr->fBaseDate;
    }
    double Basis() {
        return _ptr->fBasis;
    }
    double ForwardZeroPrice(TDate d2, TDate d1);
    double ForwardZeroPrice(TDate d2);
    ~CurveObject() {
        if(_ptr != nullptr) {
            JpmcdsFreeTCurve(_ptr);
        }
    }
private:
    TCurve* _ptr;
};

double CurveObject::ForwardZeroPrice(TDate d2, TDate d1) {
    return JpmcdsForwardZeroPrice(_ptr, d1, d2);
}

double CurveObject::ForwardZeroPrice(TDate d2) {
    return JpmcdsForwardZeroPrice(_ptr, _ptr->fBaseDate, d2);
}

std::shared_ptr<TCurve>& make_shared(TCurve* ptr) {
    return std::shared_ptr<TCurve>(ptr, jpmcdsFreeTCurve);
}