Horizon
Loading...
Searching...
No Matches
layer_range.hpp
1#pragma once
2#include <algorithm>
3#include <optional>
4#include "nlohmann/json_fwd.hpp"
5
6namespace horizon {
7
8using json = nlohmann::json;
9
10// adapted from KiCad's LAYER_RANGE
12public:
13 LayerRange(const json &j);
14
15 json serialize() const;
16
17 LayerRange() : m_start(10000), m_end(10000){};
18
19 LayerRange(int aStart, int aEnd)
20 {
21 if (aStart > aEnd)
22 std::swap(aStart, aEnd);
23
24 m_start = aStart;
25 m_end = aEnd;
26 }
27
28 LayerRange(int aLayer)
29 {
30 m_start = m_end = aLayer;
31 }
32
33 LayerRange(const LayerRange &aB) : m_start(aB.m_start), m_end(aB.m_end)
34 {
35 }
36
37 LayerRange &operator=(const LayerRange &aB)
38 {
39 m_start = aB.m_start;
40 m_end = aB.m_end;
41 return *this;
42 }
43
44 bool overlaps(const LayerRange &aOther) const
45 {
46 return m_end >= aOther.m_start && m_start <= aOther.m_end;
47 }
48
49 bool overlaps(const int aLayer) const
50 {
51 return aLayer >= m_start && aLayer <= m_end;
52 }
53
54 bool is_multilayer() const
55 {
56 return m_start != m_end;
57 }
58
59 int start() const
60 {
61 return m_start;
62 }
63
64 int end() const
65 {
66 return m_end;
67 }
68
69 void merge(const LayerRange &aOther)
70 {
71 if (m_start == 10000 || m_end == 10000) {
72 m_start = aOther.m_start;
73 m_end = aOther.m_end;
74 return;
75 }
76
77 if (aOther.m_start < m_start)
78 m_start = aOther.m_start;
79
80 if (aOther.m_end > m_end)
81 m_end = aOther.m_end;
82 }
83
84 std::optional<LayerRange> intersection(const LayerRange &other) const
85 {
86 if (overlaps(other))
87 return LayerRange{std::max(m_start, other.m_start), std::min(m_end, other.m_end)};
88 else
89 return {};
90 }
91
92 bool operator==(const LayerRange &aOther) const
93 {
94 return (m_start == aOther.m_start) && (m_end == aOther.m_end);
95 }
96
97 bool operator!=(const LayerRange &aOther) const
98 {
99 return (m_start != aOther.m_start) || (m_end != aOther.m_end);
100 }
101
102 bool operator<(const LayerRange &aOther) const
103 {
104 return std::make_pair(m_start, m_end) < std::make_pair(aOther.m_start, aOther.m_end);
105 }
106
107 bool operator>(const LayerRange &aOther) const
108 {
109 return std::make_pair(m_start, m_end) > std::make_pair(aOther.m_start, aOther.m_end);
110 }
111
112private:
113 int m_start;
114 int m_end;
115};
116} // namespace horizon
Definition layer_range.hpp:11
a class to store JSON values
Definition json.hpp:177
basic_json<> json
default JSON class
Definition json_fwd.hpp:62