codac 2.0.0
Loading...
Searching...
No Matches
codac2_Ctc.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <memory>
13#include <iostream>
14#include "codac2_Index.h"
15#include "codac2_assert.h"
16#include "codac2_TypeInfo.h"
18#include "codac2_SlicedTube.h"
19
20namespace codac2
21{
22 template<typename... X>
23 class CtcBase
24 {
25 public:
26
27 using ContractedTypes = std::tuple<X...>;
28
29 CtcBase(Index n)
30 : _n(n)
31 {
32 assert(n > 0);
33 }
34
35 virtual ~CtcBase() = default;
36
37 Index size() const
38 {
39 return _n;
40 }
41
42 virtual void contract(X&... x) const = 0;
43
44 virtual void contract_tube(SlicedTube<X>&... x) const
45 {
46 auto tdomain = std::get<0>(std::make_tuple(x...));
47 for(auto it = tdomain.begin() ; it != tdomain.end() ; it++)
48 contract((x(it)->codomain())...);
49 }
50
51 virtual std::shared_ptr<CtcBase<X...>> copy() const = 0;
52
53 protected:
54
55 const Index _n;
56 };
57
58 template<typename C,typename... X>
59 class Ctc : public CtcBase<X...>
60 {
61 public:
62
63 Ctc(Index n)
64 : CtcBase<X...>(n)
65 { }
66
67 virtual std::shared_ptr<CtcBase<X...>> copy() const
68 {
69 return std::make_shared<C>(*dynamic_cast<const C*>(this));
70 }
71 };
72
73 template<class C,class... X>
74 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
75 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
76
77 template<class C,class... X>
78 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
79
80
81 template<typename C>
82 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
83 struct is_interval_based<C> : std::false_type {};
84
85 template<typename C>
86 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
87 struct is_ctc<C> : std::true_type {};
88
89 template<typename C>
90 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
91 struct is_sep<C> : std::false_type {};
92}