5 #ifndef LODESTAR_BLOCKPACK_HPP
6 #define LODESTAR_BLOCKPACK_HPP
8 #include "Lodestar/blocks/Block.hpp"
9 #include "Lodestar/blocks/aux/DirectedGraph.hpp"
10 #include <type_traits>
12 #include <unordered_map>
21 bool directFeedthrough;
25 ::std::vector<::std::string> inTypes;
26 ::std::vector<::std::string> outTypes;
27 ::std::vector<::std::string> parTypes;
28 ::std::vector<::std::string> templateTypes;
31 template<
typename... TTypes>
37 template<
typename TType,
typename... TTypes>
38 void append(TType &block, TTypes &...blocks)
44 template<
typename TType>
45 void append(TType &block)
48 ::std::is_base_of<BlockProto, typename ::std::decay<TType>::type>::value,
49 "All elements in BlockPack must be derived from BlockProto."
52 blocks.push_back(&block);
53 using blockType = typename ::std::decay<TType>::type;
55 auto bt = ::std::make_shared<BlockTraits>(BlockTraits{
70 blockTraits.push_back(bt);
73 auto iSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.inputSymbols().begin(),
74 block.inputSymbols().end());
75 auto oSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.outputSymbols().begin(),
76 block.outputSymbols().end());
77 auto pSymbs = ::std::make_shared<::std::vector<GiNaC::ex>>(block.parameterSymbols().begin(),
78 block.parameterSymbols().end());
80 inputSymbols.push_back(iSymbs);
81 outputSymbols.push_back(iSymbs);
82 parameterSymbols.push_back(iSymbs);
84 inputSymbolsByPtr[&block] = iSymbs;
85 outputSymbolsByPtr[&block] = oSymbs;
86 parameterSymbolsByPtr[&block] = pSymbs;
88 auto f = ::std::make_shared<::std::function<
const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>(::std::bind(
89 &BlockProto::blkf, &block, ::std::placeholders::_1,
true));
91 symbolicFunctions.push_back(f);
92 symbolicFunctionByPtr[&block] = f;
95 traitsByPtr[&block] = bt;
96 blockById[
static_cast<BlockProto *
>(&block)->
id] = █
106 bool contains(BlockProto *blk)
const;
108 bool contains(
unsigned int idx)
const;
110 bool hasDirectFeedthrough(BlockProto *blk)
const;
112 bool hasDirectFeedthrough(BlockProto &blk)
const;
114 bool isDriving(BlockProto *blk1, BlockProto *blk2)
const;
116 bool isDriving(BlockProto &blk1, BlockProto &blk2)
const;
118 ::std::shared_ptr<BlockTraits> getTraitsByPtr(
const BlockProto *ptr)
const;
120 ::std::shared_ptr<BlockTraits> getTraitsById(
unsigned int id)
const;
122 BlockProto *getBlockById(
unsigned int id);
124 const BlockProto *getBlockById(
unsigned int id)
const;
126 ::std::vector<BlockProto *> blocks;
127 ::std::vector<::std::shared_ptr<BlockTraits>> blockTraits;
128 ::std::unordered_map<const BlockProto *, ::std::shared_ptr<BlockTraits>> traitsByPtr;
129 ::std::unordered_map<unsigned int, BlockProto *> blockById;
134 ::std::shared_ptr<::std::vector<GiNaC::ex>> getInputSymbolsByPtr(
const BlockProto *ptr)
const;
136 ::std::shared_ptr<::std::vector<GiNaC::ex>> getOutputSymbolsByPtr(
const BlockProto *ptr)
const;
138 ::std::shared_ptr<::std::vector<GiNaC::ex>> getParameterSymbolsByPtr(
const BlockProto *ptr)
const;
140 ::std::shared_ptr<::std::vector<GiNaC::ex>> getInputSymbolsById(
unsigned int id)
const;
142 ::std::shared_ptr<::std::vector<GiNaC::ex>> getOutputSymbolsById(
unsigned int id)
const;
144 ::std::shared_ptr<::std::vector<GiNaC::ex>> getParameterSymbolsById(
unsigned int id)
const;
146 ::std::shared_ptr<::std::function<
const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>> getSymbolicFunctionByPtr(
const BlockProto *ptr)
const;
148 ::std::shared_ptr<::std::function<
const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>> getSymbolicFunctionById(
unsigned int id)
const;
150 ::std::vector<::std::shared_ptr<::std::vector<GiNaC::ex>>> inputSymbols, outputSymbols, parameterSymbols;
151 ::std::unordered_map<const BlockProto *, ::std::shared_ptr<::std::vector<GiNaC::ex>>> inputSymbolsByPtr, outputSymbolsByPtr, parameterSymbolsByPtr;
153 ::std::vector<::std::shared_ptr<::std::function<
const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>> symbolicFunctions;
155 ::std::unordered_map<
const BlockProto *, ::std::shared_ptr<::std::function<
const GiNaC::function(const ::std::vector<GiNaC::ex> &exvec)>>> symbolicFunctionByPtr;
162 #endif //LODESTAR_BLOCKPACK_HPP