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_tube(SlicedTube<X>&... x) const;
47 // -> is defined in codac2_SlicedTube.h
48
49 virtual std::shared_ptr<CtcBase<X...>> copy() const = 0;
50
51 protected:
52
53 const Index _n;
54 };
55
56 template<typename C,typename... X>
57 class Ctc : public CtcBase<X...>
58 {
59 public:
60
61 Ctc(Index n)
62 : CtcBase<X...>(n)
63 { }
64
65 virtual std::shared_ptr<CtcBase<X...>> copy() const
66 {
67 return std::make_shared<C>(*dynamic_cast<const C*>(this));
68 }
69 };
70
71 template<class C,class... X>
72 concept IsCtcBaseOrPtr = (std::is_base_of_v<CtcBase<X...>,C>
73 || std::is_same_v<std::shared_ptr<CtcBase<X...>>,C>);
74
75 template<class C,class... X>
76 concept IsCtcBase = std::is_base_of_v<CtcBase<X...>,C>;
77
78
79 template<typename C>
80 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
81 struct is_interval_based<C> : std::false_type {};
82
83 template<typename C>
84 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
85 struct is_ctc<C> : std::true_type {};
86
87 template<typename C>
88 requires (IsCtcBase<C,Interval>) || (IsCtcBase<C,IntervalVector>)
89 struct is_sep<C> : std::false_type {};
90
91 template<typename C>
92 requires IsCtcBaseOrPtr<C,IntervalVector>
93 const CtcBase<IntervalVector>& ctc(const C& c)
94 {
95 if constexpr(std::is_base_of_v<CtcBase<IntervalVector>,C>)
96 return c;
97 else
98 return *c;
99 }
100}
Definition codac2_OctaSym.h:21