codac 1.5.6
Loading...
Searching...
No Matches
codac2_SepNot.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <type_traits>
13#include "codac2_Sep.h"
14#include "codac2_SepWrapper.h"
15#include "codac2_Collection.h"
16
17namespace codac2
18{
19 class SepNot : public Sep<SepNot>
20 {
21 public:
22
23 SepNot(const IntervalVector& x)
24 : Sep<SepNot>(x.size()), _sep(SepWrapper(x))
25 { }
26
27 template<typename S>
28 requires (IsSepBaseOrPtr<S> && !std::is_same_v<SepNot,S>)
29 SepNot(const S& s)
30 : Sep<SepNot>(size_of(s)), _sep(s)
31 { }
32
33 BoxPair separate(const IntervalVector& x) const
34 {
35 assert_release(x.size() == this->size());
36
37 auto x_sep = _sep.front().separate(x);
38 assert((x_sep.outer | x_sep.inner) == x);
39 return { x_sep.outer , x_sep.inner };
40 }
41
42 protected:
43
44 const Collection<SepBase> _sep;
45 };
46
47 template<typename S>
48 requires std::is_base_of_v<SepBase,S>
49 SepNot operator!(const S& s)
50 {
51 return SepNot(s);
52 }
53}