Lodestar
An integrated real-time control package in C++
MinMaxBlock.hpp
1 //
2 // Created by Hamza El-Kebir on 2/19/22.
3 //
4 
5 #ifndef LODESTAR_MINMAXBLOCK_HPP
6 #define LODESTAR_MINMAXBLOCK_HPP
7 
8 #include <Lodestar/blocks/Block.hpp>
9 #include <Lodestar/aux/TemplateTools.hpp>
10 
11 namespace ls {
12  namespace blocks {
13  namespace std {
18  enum class MinMaxBlockOperator {
20  Min,
22  Max
23  };
24 
25 #define OUTPUT_MINMAXBLOCK() \
26  typename ::std::conditional<ls::aux::TemplateTraits::BinaryOperators::parseMatrixLike<TInput>::value, typename ls::aux::TemplateTraits::BinaryOperators::parseMatrixLike<TInput>::scalar, TInput>::type
27 
28  template<typename TInput, MinMaxBlockOperator TOps>
30  : public Block<
31  ::std::tuple<TInput>,
32  ::std::tuple<OUTPUT_MINMAXBLOCK()>,
33  BlockProto::empty
34  > {
35  public:
36  using Base =
37  Block<
38  ::std::tuple<TInput>,
39  ::std::tuple<OUTPUT_MINMAXBLOCK()>,
40  BlockProto::empty
41  >;
42 
44  static_assert(InputTrait::value, "Input must be matrix-like; otherwise same value would be returned.");
45 
48 
50  static constexpr Ops Min = Ops::Min;
51 
53  static constexpr Ops Max = Ops::Max;
54 
55  using OutputType = OUTPUT_MINMAXBLOCK();
56 
57  MinMaxBlock()
58  {
59  bindFunction();
60  }
61 
62 
63  protected:
64  template<MinMaxBlockOperator TTOps = TOps,
65  typename ::std::enable_if<TTOps == Min>::type * = nullptr>
66  void bindFunction()
67  {
68  this->equation = [](Base &b) -> void {
69  b.template o<0>() = b.template i<0>().object.minCoeff();
70  };
71  }
72 
73  template<MinMaxBlockOperator TTOps = TOps,
74  typename ::std::enable_if<TTOps == Max>::type * = nullptr>
75  void bindFunction()
76  {
77  this->equation = [](Base &b) -> void {
78  b.template o<0>() = b.template i<0>().object.maxCoeff();
79  };
80  }
81  };
82  }
83 
84  template<typename TInput, std::MinMaxBlockOperator TOps>
85  class BlockTraits<std::MinMaxBlock<TInput, TOps>> {
86  public:
87  static constexpr const BlockType blockType = BlockType::MinMaxBlock;
88  enum {
89  directFeedthrough = true
90  };
91 
93  using Base = typename type::Base;
94 
95  enum {
96  kIns = Base::kIns,
97  kOuts = Base::kOuts,
98  kPars = Base::kPars
99  };
100 
101  static const ::std::array<::std::string, kIns> inTypes;
102  static const ::std::array<::std::string, kOuts> outTypes;
103  static const ::std::array<::std::string, kPars> parTypes;
104 
105  static const ::std::array<::std::string, 2> templateTypes;
106  };
107 
108  template<typename TInput, std::MinMaxBlockOperator TOps>
109  const ::std::array<::std::string, BlockTraits<std::MinMaxBlock<TInput, TOps>>::kIns> BlockTraits<std::MinMaxBlock<TInput, TOps>>::inTypes =
110  {demangle(typeid(TInput).name())};
111 
112  template<typename TInput, std::MinMaxBlockOperator TOps>
113  const ::std::array<::std::string, BlockTraits<std::MinMaxBlock<TInput, TOps>>::kOuts> BlockTraits<std::MinMaxBlock<TInput, TOps>>::outTypes =
114  {demangle(typeid(typename std::MinMaxBlock<TInput, TOps>::OutputType).name())};
115 
116  template<typename TInput, std::MinMaxBlockOperator TOps>
117  const ::std::array<::std::string, BlockTraits<std::MinMaxBlock<TInput, TOps>>::kPars> BlockTraits<std::MinMaxBlock<TInput, TOps>>::parTypes =
118  {};
119 
120  template<typename TInput, std::MinMaxBlockOperator TOps>
121  const ::std::array<::std::string, 2> BlockTraits<std::MinMaxBlock<TInput, TOps>>::templateTypes =
122  {demangle(typeid(TInput).name()), demangle(typeid(TOps).name())};
123  }
124 }
125 
126 #undef OUTPUT_MINMAXBLOCK
127 
128 
129 #endif //LODESTAR_MINMAXBLOCK_HPP
ls::blocks::std::MinMaxBlock::Min
static constexpr Ops Min
Utility alias for minimum.
Definition: MinMaxBlock.hpp:50
ls::blocks::std::MinMaxBlockOperator::Max
@ Max
Maximum.
ls::blocks::BlockTraits::directFeedthrough
static constexpr const bool directFeedthrough
Whether or not the block has direct feedthrough.
Definition: BlockTraits.hpp:44
ls::blocks::std::MinMaxBlockOperator
MinMaxBlockOperator
Operation types for MinMaxBlock.
Definition: MinMaxBlock.hpp:18
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::aux::TemplateTraits::BinaryOperators::parseMatrixLike
Extracts data from matrix-like types.
Definition: TemplateTraits.hpp:114
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::blocks::std::MinMaxBlock
Definition: MinMaxBlock.hpp:29
ls::blocks::BlockType::MinMaxBlock
@ MinMaxBlock
Min/max block.
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::std::MinMaxBlock::Max
static constexpr Ops Max
Utility alias for maximum.
Definition: MinMaxBlock.hpp:53
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
ls::blocks::std::MinMaxBlockOperator::Min
@ Min
Minimum.