Horizon
layer_range.hpp
1#pragma once
2#include <algorithm>
3
4namespace horizon {
5
6// adapted from KiCad's LAYER_RANGE
7class LayerRange {
8public:
9 LayerRange() : m_start(10000), m_end(10000){};
10
11 LayerRange(int aStart, int aEnd)
12 {
13 if (aStart > aEnd)
14 std::swap(aStart, aEnd);
15
16 m_start = aStart;
17 m_end = aEnd;
18 }
19
20 LayerRange(int aLayer)
21 {
22 m_start = m_end = aLayer;
23 }
24
25 LayerRange(const LayerRange &aB) : m_start(aB.m_start), m_end(aB.m_end)
26 {
27 }
28
29 LayerRange &operator=(const LayerRange &aB)
30 {
31 m_start = aB.m_start;
32 m_end = aB.m_end;
33 return *this;
34 }
35
36 bool overlaps(const LayerRange &aOther) const
37 {
38 return m_end >= aOther.m_start && m_start <= aOther.m_end;
39 }
40
41 bool overlaps(const int aLayer) const
42 {
43 return aLayer >= m_start && aLayer <= m_end;
44 }
45
46 bool is_multilayer() const
47 {
48 return m_start != m_end;
49 }
50
51 int start() const
52 {
53 return m_start;
54 }
55
56 int end() const
57 {
58 return m_end;
59 }
60
61 void merge(const LayerRange &aOther)
62 {
63 if (m_start == 10000 || m_end == 10000) {
64 m_start = aOther.m_start;
65 m_end = aOther.m_end;
66 return;
67 }
68
69 if (aOther.m_start < m_start)
70 m_start = aOther.m_start;
71
72 if (aOther.m_end > m_end)
73 m_end = aOther.m_end;
74 }
75
76 bool operator==(const LayerRange &aOther) const
77 {
78 return (m_start == aOther.m_start) && (m_end == aOther.m_end);
79 }
80
81 bool operator!=(const LayerRange &aOther) const
82 {
83 return (m_start != aOther.m_start) || (m_end != aOther.m_end);
84 }
85
86 bool operator<(const LayerRange &aOther) const
87 {
88 return std::make_pair(m_start, m_end) < std::make_pair(aOther.m_start, aOther.m_end);
89 }
90
91private:
92 int m_start;
93 int m_end;
94};
95} // namespace horizon
Definition: layer_range.hpp:7