codac 2.0.0
Loading...
Searching...
No Matches
codac2_SepCartProd.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_Collection.h"
15#include "codac2_SepWrapper.h"
16
17namespace codac2
18{
19 class SepCartProd : public Sep<SepCartProd>
20 {
21 public:
22
23 SepCartProd(const Collection<SepBase>& seps)
24 : Sep<SepCartProd>([seps] {
25 Index n = 0;
26 for(const auto& si : seps)
27 n += si->size();
28 return n;
29 }()), _seps(seps)
30 { }
31
32 template<typename S>
33 requires (IsSepBaseOrPtr<S> && !std::is_same_v<SepCartProd,S>)
34 SepCartProd(const S& s)
35 : Sep<SepCartProd>(size_of(s)), _seps(s)
36 { }
37
38 template<typename... S>
39 requires (IsSepBaseOrPtr<S> && ...)
40 SepCartProd(const S&... s)
41 : Sep<SepCartProd>((0 + ... + size_of(s))), _seps(s...)
42 { }
43
44 BoxPair separate(const IntervalVector& x) const;
45
46 protected:
47
48 Collection<SepBase> _seps;
49 };
50
51 template<typename... S>
52 requires ((is_sep_v<S>) || ...) && ((!is_ctc_v<S>) && ...)
53 inline SepCartProd cart_prod(const S&... s)
54 {
55 return SepCartProd(s...);
56 }
57}