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