codac 1.5.6
Loading...
Searching...
No Matches
codac2_Sep.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <memory>
14
15namespace codac2
16{
17 class BoxPair
18 {
19 public:
20
21 BoxPair(const BoxPair& x)
22 : _bp { x._bp }
23 { }
24
25 BoxPair(const IntervalVector& inner_, const IntervalVector& outer_)
26 : _bp { inner_, outer_ }
27 { }
28
29 BoxPair& operator=(const BoxPair& x)
30 {
31 _bp = x._bp;
32 return *this;
33 }
34
35 IntervalVector& inner = _bp[0];
36 IntervalVector& outer = _bp[1];
37
38 // Pybind11 needs iterators for __iter__ method, that are provided
39 // by std::array. The above references are aliases for ease of use.
40 std::array<IntervalVector,2> _bp;
41 };
42
43 inline std::ostream& operator<<(std::ostream& os, const BoxPair& x)
44 {
45 os << "(" << x.inner << "," << x.outer << ")";
46 return os;
47 }
48
49 class SepBase
50 {
51 public:
52
53 SepBase(Index n)
54 : _n(n)
55 {
56 assert(n > 0);
57 }
58
59 Index size() const
60 {
61 return _n;
62 }
63
64 virtual std::shared_ptr<SepBase> copy() const = 0;
65 virtual BoxPair separate(const IntervalVector& x) const = 0;
66
67 protected:
68
69 const Index _n;
70 };
71
72 template<typename S>
73 class Sep : public SepBase
74 {
75 public:
76
77 Sep(Index n)
78 : SepBase(n)
79 { }
80
81 virtual std::shared_ptr<SepBase> copy() const
82 {
83 return std::make_shared<S>(*dynamic_cast<const S*>(this));
84 }
85 };
86
87 template<class S>
88 concept IsSepBaseOrPtr = (std::is_base_of_v<SepBase,S>
89 || std::is_base_of_v<S,std::shared_ptr<SepBase>>);
90
91
92 template<typename S>
93 requires (IsSepBaseOrPtr<S>)
94 struct is_interval_based<S> : std::false_type {};
95
96 template<typename S>
97 requires (IsSepBaseOrPtr<S>)
98 struct is_ctc<S> : std::false_type {};
99
100 template<typename S>
101 requires (IsSepBaseOrPtr<S>)
102 struct is_sep<S> : std::true_type {};
103}
std::ostream & operator<<(std::ostream &os, const BoolInterval &x)
Streams out a BoolInterval.
Definition codac2_BoolInterval.h:45