@@ -1,99 +1,101 | |||||
1 | #include <Data/OptionalAxis.h> |
|
1 | #include <Data/OptionalAxis.h> | |
2 |
|
2 | |||
3 | #include "Data/ArrayData.h" |
|
3 | #include "Data/ArrayData.h" | |
4 |
|
4 | |||
5 | OptionalAxis::OptionalAxis() : m_Defined{false}, m_Data{nullptr}, m_Unit{} |
|
5 | OptionalAxis::OptionalAxis() : m_Defined{false}, m_Data{nullptr}, m_Unit{} | |
6 | { |
|
6 | { | |
7 | } |
|
7 | } | |
8 |
|
8 | |||
9 | OptionalAxis::OptionalAxis(std::shared_ptr<ArrayData<1> > data, Unit unit) |
|
9 | OptionalAxis::OptionalAxis(std::shared_ptr<ArrayData<1> > data, Unit unit) | |
10 | : m_Defined{true}, m_Data{data}, m_Unit{std::move(unit)} |
|
10 | : m_Defined{true}, m_Data{data}, m_Unit{std::move(unit)} | |
11 | { |
|
11 | { | |
12 | if (m_Data == nullptr) { |
|
12 | if (m_Data == nullptr) { | |
13 | throw std::invalid_argument{"Data can't be null for a defined axis"}; |
|
13 | throw std::invalid_argument{"Data can't be null for a defined axis"}; | |
14 | } |
|
14 | } | |
15 | } |
|
15 | } | |
16 |
|
16 | |||
17 | OptionalAxis::OptionalAxis(const OptionalAxis &other) |
|
17 | OptionalAxis::OptionalAxis(const OptionalAxis &other) | |
18 | : m_Defined{other.m_Defined}, |
|
18 | : m_Defined{other.m_Defined}, | |
19 | m_Data{other.m_Data ? std::make_shared<ArrayData<1> >(*other.m_Data) : nullptr}, |
|
19 | m_Data{other.m_Data ? std::make_shared<ArrayData<1> >(*other.m_Data) : nullptr}, | |
20 | m_Unit{other.m_Unit} |
|
20 | m_Unit{other.m_Unit} | |
21 | { |
|
21 | { | |
22 | } |
|
22 | } | |
23 |
|
23 | |||
24 | OptionalAxis &OptionalAxis::operator=(OptionalAxis other) |
|
24 | OptionalAxis &OptionalAxis::operator=(OptionalAxis other) | |
25 | { |
|
25 | { | |
26 | std::swap(m_Defined, other.m_Defined); |
|
26 | std::swap(m_Defined, other.m_Defined); | |
27 | std::swap(m_Data, other.m_Data); |
|
27 | std::swap(m_Data, other.m_Data); | |
28 | std::swap(m_Unit, other.m_Unit); |
|
28 | std::swap(m_Unit, other.m_Unit); | |
|
29 | ||||
|
30 | return *this; | |||
29 | } |
|
31 | } | |
30 |
|
32 | |||
31 | bool OptionalAxis::isDefined() const |
|
33 | bool OptionalAxis::isDefined() const | |
32 | { |
|
34 | { | |
33 | return m_Defined; |
|
35 | return m_Defined; | |
34 | } |
|
36 | } | |
35 |
|
37 | |||
36 | double OptionalAxis::at(int index) const |
|
38 | double OptionalAxis::at(int index) const | |
37 | { |
|
39 | { | |
38 | if (m_Defined) { |
|
40 | if (m_Defined) { | |
39 | return (index >= 0 && index < m_Data->size()) ? m_Data->at(index) |
|
41 | return (index >= 0 && index < m_Data->size()) ? m_Data->at(index) | |
40 | : std::numeric_limits<double>::quiet_NaN(); |
|
42 | : std::numeric_limits<double>::quiet_NaN(); | |
41 | } |
|
43 | } | |
42 | else { |
|
44 | else { | |
43 | return std::numeric_limits<double>::quiet_NaN(); |
|
45 | return std::numeric_limits<double>::quiet_NaN(); | |
44 | } |
|
46 | } | |
45 | } |
|
47 | } | |
46 |
|
48 | |||
47 | std::pair<double, double> OptionalAxis::bounds() const |
|
49 | std::pair<double, double> OptionalAxis::bounds() const | |
48 | { |
|
50 | { | |
49 | if (!m_Defined || m_Data->size() == 0) { |
|
51 | if (!m_Defined || m_Data->size() == 0) { | |
50 | return std::make_pair(std::numeric_limits<double>::quiet_NaN(), |
|
52 | return std::make_pair(std::numeric_limits<double>::quiet_NaN(), | |
51 | std::numeric_limits<double>::quiet_NaN()); |
|
53 | std::numeric_limits<double>::quiet_NaN()); | |
52 | } |
|
54 | } | |
53 | else { |
|
55 | else { | |
54 |
|
56 | |||
55 | auto minIt = std::min_element( |
|
57 | auto minIt = std::min_element( | |
56 | m_Data->cbegin(), m_Data->cend(), [](const auto &it1, const auto &it2) { |
|
58 | m_Data->cbegin(), m_Data->cend(), [](const auto &it1, const auto &it2) { | |
57 | return SortUtils::minCompareWithNaN(it1.first(), it2.first()); |
|
59 | return SortUtils::minCompareWithNaN(it1.first(), it2.first()); | |
58 | }); |
|
60 | }); | |
59 |
|
61 | |||
60 | // Gets the iterator on the max of all values data |
|
62 | // Gets the iterator on the max of all values data | |
61 | auto maxIt = std::max_element( |
|
63 | auto maxIt = std::max_element( | |
62 | m_Data->cbegin(), m_Data->cend(), [](const auto &it1, const auto &it2) { |
|
64 | m_Data->cbegin(), m_Data->cend(), [](const auto &it1, const auto &it2) { | |
63 | return SortUtils::maxCompareWithNaN(it1.first(), it2.first()); |
|
65 | return SortUtils::maxCompareWithNaN(it1.first(), it2.first()); | |
64 | }); |
|
66 | }); | |
65 |
|
67 | |||
66 | auto pair = std::make_pair(minIt->first(), maxIt->first()); |
|
68 | auto pair = std::make_pair(minIt->first(), maxIt->first()); | |
67 |
|
69 | |||
68 | return std::make_pair(minIt->first(), maxIt->first()); |
|
70 | return std::make_pair(minIt->first(), maxIt->first()); | |
69 | } |
|
71 | } | |
70 | } |
|
72 | } | |
71 |
|
73 | |||
72 | int OptionalAxis::size() const |
|
74 | int OptionalAxis::size() const | |
73 | { |
|
75 | { | |
74 | return m_Defined ? m_Data->size() : 0; |
|
76 | return m_Defined ? m_Data->size() : 0; | |
75 | } |
|
77 | } | |
76 |
|
78 | |||
77 | Unit OptionalAxis::unit() const |
|
79 | Unit OptionalAxis::unit() const | |
78 | { |
|
80 | { | |
79 | return m_Defined ? m_Unit : Unit{}; |
|
81 | return m_Defined ? m_Unit : Unit{}; | |
80 | } |
|
82 | } | |
81 |
|
83 | |||
82 | bool OptionalAxis::operator==(const OptionalAxis &other) |
|
84 | bool OptionalAxis::operator==(const OptionalAxis &other) | |
83 | { |
|
85 | { | |
84 | // Axis not defined |
|
86 | // Axis not defined | |
85 | if (!m_Defined) { |
|
87 | if (!m_Defined) { | |
86 | return !other.m_Defined; |
|
88 | return !other.m_Defined; | |
87 | } |
|
89 | } | |
88 |
|
90 | |||
89 | // Axis defined |
|
91 | // Axis defined | |
90 | return m_Unit == other.m_Unit |
|
92 | return m_Unit == other.m_Unit | |
91 | && std::equal( |
|
93 | && std::equal( | |
92 | m_Data->cbegin(), m_Data->cend(), other.m_Data->cbegin(), other.m_Data->cend(), |
|
94 | m_Data->cbegin(), m_Data->cend(), other.m_Data->cbegin(), other.m_Data->cend(), | |
93 | [](const auto &it1, const auto &it2) { return it1.values() == it2.values(); }); |
|
95 | [](const auto &it1, const auto &it2) { return it1.values() == it2.values(); }); | |
94 | } |
|
96 | } | |
95 |
|
97 | |||
96 | bool OptionalAxis::operator!=(const OptionalAxis &other) |
|
98 | bool OptionalAxis::operator!=(const OptionalAxis &other) | |
97 | { |
|
99 | { | |
98 | return !(*this == other); |
|
100 | return !(*this == other); | |
99 | } |
|
101 | } |
General Comments 0
You need to be logged in to leave comments.
Login now