Lodestar
An integrated real-time control package in C++
BufferBlock.hpp
1 //
2 // Created by Hamza El-Kebir on 2/19/22.
3 //
4 
5 #ifndef LODESTAR_BUFFERBLOCK_HPP
6 #define LODESTAR_BUFFERBLOCK_HPP
7 
8 #include <Lodestar/blocks/Block.hpp>
9 
10 namespace ls {
11  namespace blocks {
12  namespace std {
13  template<typename TInput, unsigned int NSize=2>
15  : public Block<
16  ::std::tuple<TInput>,
17  typename ls::aux::TemplateTools::repeat<TInput, NSize, ::std::tuple>::type,
18  BlockProto::empty
19  > {
20  public:
21  using Base =
22  Block<
23  ::std::tuple<TInput>,
24  typename ls::aux::TemplateTools::repeat<TInput, NSize, ::std::tuple>::type,
25  BlockProto::empty
26  >;
27 
28  BufferBlock()
29  {
30  bindFunction();
31  }
32 
33  void clear(TInput value)
34  {
35  return clear_(value);
36  }
37 
38  void clear(TInput &value)
39  {
40  return clearRef_(value);
41  }
42 
43 
44  protected:
45  void bindFunction()
46  {
47  this->equation = ::std::bind(
49  this,
50  ::std::placeholders::_1
51  );
52  }
53 
54  void triggerFunction(Base &b)
55  {
56  update();
57  }
58 
59  template<unsigned int NIdx = NSize - 1>
60  typename ::std::enable_if<(NIdx > 0), void>::type
61  update()
62  {
63  this->template o<NIdx>().object = this->template o<NIdx-1>().object;
64  this->template o<NIdx>().propagate();
65 
66  return update<NIdx - 1>();
67  }
68 
69  template<unsigned int NIdx = NSize - 1>
70  typename ::std::enable_if<(NIdx == 0), void>::type
71  update()
72  {
73  this->template o<NIdx>() = this->template i<NIdx>();
74  }
75 
76  template<unsigned int NIdx = NSize - 1>
77  typename ::std::enable_if<(NIdx < 0), void>::type
78  update()
79  {
80  return;
81  }
82 
83  template<unsigned int NIdx = NSize - 1>
84  typename ::std::enable_if<(NIdx > 0), void>::type
85  clearRef_(const TInput &value)
86  {
87  this->template o<NIdx>() = value;
88 
89  return clearRef_<NIdx - 1>(value);
90  }
91 
92  template<unsigned int NIdx = NSize - 1>
93  typename ::std::enable_if<(NIdx == 0), void>::type
94  clearRef_(const TInput &value)
95  {
96  this->template o<NIdx>() = value;
97  }
98 
99  template<unsigned int NIdx = NSize - 1>
100  typename ::std::enable_if<(NIdx < 0), void>::type
101  clearRef_(const TInput &value)
102  {
103  return;
104  }
105 
106  template<unsigned int NIdx = NSize - 1>
107  typename ::std::enable_if<(NIdx > 0), void>::type
108  clear_(const TInput value)
109  {
110  this->template o<NIdx>() = value;
111 
112  return clear_<NIdx - 1>(value);
113  }
114 
115  template<unsigned int NIdx = NSize - 1>
116  typename ::std::enable_if<(NIdx == 0), void>::type
117  clear_(const TInput value)
118  {
119  this->template o<NIdx>() = value;
120  }
121 
122  template<unsigned int NIdx = NSize - 1>
123  typename ::std::enable_if<(NIdx < 0), void>::type
124  clear_(const TInput value)
125  {
126  return;
127  }
128  };
129  }
130 
131  template<typename TInput, unsigned int NSize>
132  class BlockTraits<std::BufferBlock<TInput, NSize>> {
133  public:
134  static constexpr const BlockType blockType = BlockType::BufferBlock;
135  enum {
136  directFeedthrough = true
137  };
138 
140  using Base = typename type::Base;
141 
142  enum {
143  kIns = Base::kIns,
144  kOuts = Base::kOuts,
145  kPars = Base::kPars
146  };
147 
148  static const ::std::array<::std::string, kIns> inTypes;
149  static const ::std::array<::std::string, kOuts> outTypes;
150  static const ::std::array<::std::string, kPars> parTypes;
151 
152  static const ::std::array<::std::string, 2> templateTypes;
153  };
154 
155  template<typename TInput, unsigned int NSize>
156  const ::std::array<::std::string, BlockTraits<std::BufferBlock<TInput, NSize>>::kIns> BlockTraits<std::BufferBlock<TInput, NSize>>::inTypes =
157  {demangle(typeid(TInput).name())};
158 
159  template<typename TInput, unsigned int NSize>
160  const ::std::array<::std::string, BlockTraits<std::BufferBlock<TInput, NSize>>::kOuts> BlockTraits<std::BufferBlock<TInput, NSize>>::outTypes =
161  {demangle(typeid(TInput).name())};
162 
163  template<typename TInput, unsigned int NSize>
164  const ::std::array<::std::string, BlockTraits<std::BufferBlock<TInput, NSize>>::kPars> BlockTraits<std::BufferBlock<TInput, NSize>>::parTypes =
165  {};
166 
167  template<typename TInput, unsigned int NSize>
168  const ::std::array<::std::string, 2> BlockTraits<std::BufferBlock<TInput, NSize>>::templateTypes =
169  {demangle(typeid(TInput).name()), "unsigned int"};
170  }
171 }
172 
173 #endif //LODESTAR_BUFFERBLOCK_HPP
ls::blocks::BlockTraits::directFeedthrough
static constexpr const bool directFeedthrough
Whether or not the block has direct feedthrough.
Definition: BlockTraits.hpp:44
ls::blocks::BlockTraits
A traits object that exposes information about TBlock.
Definition: BlockTraits.hpp:37
ls::blocks::BlockTraits::inTypes
static const ::std::array<::std::string, kIns > inTypes
Input types (as strings).
Definition: BlockTraits.hpp:59
ls::blocks::BlockType
BlockType
Block type information.
Definition: BlockType.hpp:25
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::blocks::BlockType::BufferBlock
@ BufferBlock
Buffer block.
ls::blocks::std::BufferBlock
Definition: BufferBlock.hpp:14
ls::blocks::BlockTraits::outTypes
static const ::std::array<::std::string, kOuts > outTypes
Output types (as strings).
Definition: BlockTraits.hpp:61
ls::blocks::BlockTraits::blockType
static constexpr const BlockType blockType
Block type.
Definition: BlockTraits.hpp:42
ls::blocks::BlockTraits::templateTypes
static const ::std::array<::std::string, 1 > templateTypes
Template parameter types (as strings).
Definition: BlockTraits.hpp:66
ls::blocks::Block
Generic base template class for all tuple-based Block instances.
Definition: Block.hpp:45
ls::blocks::BlockTraits::kIns
static const constexpr int kIns
Number of input slots.
Definition: BlockTraits.hpp:52
ls::blocks::BlockTraits::parTypes
static const ::std::array<::std::string, kPars > parTypes
Parameter types (as strings).
Definition: BlockTraits.hpp:63
ls::blocks::BlockTraits::kPars
static const constexpr int kPars
Number of parameters.
Definition: BlockTraits.hpp:56
ls::blocks::BlockTraits::kOuts
static const constexpr int kOuts
Number of output slots.
Definition: BlockTraits.hpp:54