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
19namespace codac2
20{
21 template<typename T>
22 class SlicedTube;
23
24 template<typename... X>
25 class CtcBase
26 {
27 public:
28
29 using ContractedTypes = std::tuple<X...>;
30
31 CtcBase(Index n)
32 : _n(n)
33 {
34 assert(n > 0);
35 }
36
37 virtual ~CtcBase() = default;
38
39 Index size() const
40 {
41 return _n;
42 }
43
44 virtual void contract(X&... x) const = 0;
45
46 virtual void contract(SlicedTube<X>&... x) const;
47 // -> is defined in codac2_SlicedTube.h
48
49 virtual void contract_tube(SlicedTube<X>&... x) const;
50 // -> is defined in codac2_SlicedTube.h
51
52 virtual std::shared_ptr<CtcBase<X...>> copy() const = 0;
53
54 protected:
55
56 const Index _n;
57 };
58
59 template<typename C,typename... X>
60 class Ctc : public CtcBase<X...>
61 {
62 public:
63
64 Ctc(Index n)
65 : CtcBase<X...>(n)
66 { }
67
68 virtual std::shared_ptr<CtcBase<X...>> copy() const
69 {
70 return std::make_shared<C>(*dynamic_cast<const C*>(this));
71 }
72 };
73
74 template<class C,class... X>
75 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
76 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
77
78 template<class C,class... X>
79 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
80
81
82 template<typename C>
83 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
84 struct is_interval_based<C> : std::false_type {};
85
86 template<typename C>
87 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
88 struct is_ctc<C> : std::true_type {};
89
90 template<typename C>
91 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
92 struct is_sep<C> : std::false_type {};
93
94 template<typename C>
95 requires IsCtcBaseOrPtr<C,IntervalVector>
96 const CtcBase<IntervalVector>& ctc(const C& c)
97 {
98 if constexpr(std::is_base_of_v<CtcBase<IntervalVector>,C>)
99 return c;
100 else
101 return *c;
102 }
103}
Definition codac2_OctaSym.h:21