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