Horizon
layer_range.hpp
1 #pragma once
2 #include <algorithm>
3 
4 namespace horizon {
5 
6 // adapted from KiCad's LAYER_RANGE
7 class LayerRange {
8 public:
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 private:
87  int m_start;
88  int m_end;
89 };
90 } // namespace horizon
horizon::LayerRange
Definition: layer_range.hpp:7