Lodestar
An integrated real-time control package in C++
BlockTraits.hpp
1 //
2 // Created by Hamza El-Kebir on 12/25/21.
3 //
4 
5 #ifndef LODESTAR_BLOCKTRAITS_HPP
6 #define LODESTAR_BLOCKTRAITS_HPP
7 
8 #include "BlockType.hpp"
9 #include "BlockProto.hpp"
10 #include "Lodestar/aux/DemangledType.hpp"
11 #include <type_traits>
12 #include <string>
13 #include <array>
14 
15 namespace ls {
16  namespace blocks {
36  template<typename TBlock = void>
37  class BlockTraits {
38  static_assert(!::std::is_same<TBlock, TBlock>::value,
39  "BlockTraits is not defined for this type.");
40  public:
42  static constexpr const BlockType blockType = BlockType::UnknownBlock;
44  static constexpr const bool directFeedthrough = false;
45 
47  using type = TBlock;
49  using Base = typename type::Base;
50 
52  static const constexpr int kIns = type::Base::kIns;
54  static const constexpr int kOuts = type::Base::kOuts;
56  static const constexpr int kPars = type::Base::kPars;
57 
59  static const ::std::array<::std::string, kIns> inTypes;
61  static const ::std::array<::std::string, kOuts> outTypes;
63  static const ::std::array<::std::string, kPars> parTypes;
64 
66  static const ::std::array<::std::string, 1> templateTypes;
67  };
68 
69 
70 
71  template<>
72  class BlockTraits<void> {
73  public:
74  template<typename TType, typename ::std::enable_if<::std::is_base_of<BlockProto, typename ::std::decay<TType>::type>::value>::type* = nullptr>
75  static auto get(const TType &blk) -> BlockTraits<typename ::std::decay<TType>::type>
76  {
78  }
79 
80  template<typename TType, typename ::std::enable_if<!::std::is_base_of<BlockProto, typename ::std::decay<TType>::type>::value>::type* = nullptr>
81  static auto get(const TType &blk) -> BlockTraits<typename ::std::decay<TType>::type>
82  {
83  static_assert(
84  ::std::is_base_of<BlockProto, typename ::std::decay<TType>::type>::value,
85  "All elements in BlockPack must be derived from BlockProto."
86  );
87  }
88  };
89  }
90 }
91 
92 
93 #endif //LODESTAR_BLOCKTRAITS_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::BlockTraits::type
TBlock type
Current class.
Definition: BlockTraits.hpp:47
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::BlockTraits::kIns
static const constexpr int kIns
Number of input slots.
Definition: BlockTraits.hpp:52
ls::blocks::BlockType::UnknownBlock
@ UnknownBlock
Unknown block.
ls::blocks::BlockTraits::parTypes
static const ::std::array<::std::string, kPars > parTypes
Parameter types (as strings).
Definition: BlockTraits.hpp:63
ls::blocks::BlockProto
Definition: BlockProto.hpp:20
ls::blocks::BlockTraits::kPars
static const constexpr int kPars
Number of parameters.
Definition: BlockTraits.hpp:56
ls::blocks::BlockTraits::Base
typename type::Base Base
Base Block class.
Definition: BlockTraits.hpp:49
ls::blocks::BlockTraits::kOuts
static const constexpr int kOuts
Number of output slots.
Definition: BlockTraits.hpp:54