summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib
diff options
context:
space:
mode:
authorjcorgan2009-05-08 18:51:39 +0000
committerjcorgan2009-05-08 18:51:39 +0000
commitb8b202c0d29d9e764def63bde080bc07b00cc2cc (patch)
tree9198a685a988ed3f103f3812b0cfc6a363316b84 /gnuradio-core/src/lib
parentd8b0bea3d4350b8450d612ed461c5bdf26b562b0 (diff)
downloadgnuradio-b8b202c0d29d9e764def63bde080bc07b00cc2cc.tar.gz
gnuradio-b8b202c0d29d9e764def63bde080bc07b00cc2cc.tar.bz2
gnuradio-b8b202c0d29d9e764def63bde080bc07b00cc2cc.zip
Fix abort when user fails to connect hier_block2 outputs both internally and internally; throw meaningful exception instead.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10992 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r--gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc37
1 files changed, 25 insertions, 12 deletions
diff --git a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
index fa52b7429..877e240c2 100644
--- a/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
+++ b/gnuradio-core/src/lib/runtime/gr_hier_block2_detail.cc
@@ -423,27 +423,40 @@ gr_hier_block2_detail::flatten_aux(gr_flat_flowgraph_sptr sfg) const
sfg->connect(*s, *d);
}
}
-
}
// Construct unique list of blocks used either in edges, inputs,
// outputs, or by themselves. I still hate STL.
- gr_basic_block_vector_t blocks, tmp = d_fg->calc_used_blocks();
+ gr_basic_block_vector_t blocks; // unique list of used blocks
+ gr_basic_block_vector_t tmp = d_fg->calc_used_blocks();
+ // First add the list of singleton blocks
std::vector<gr_basic_block_sptr>::const_iterator b; // Because flatten_aux is const
- for (b = d_blocks.begin(); b != d_blocks.end(); b++)
+ for (b = d_blocks.begin(); b != d_blocks.end(); b++)
tmp.push_back(*b);
- std::vector<gr_endpoint_vector_t>::const_iterator ep; // Because flatten_aux is const
- std::vector<gr_endpoint>::const_iterator e; // Because flatten_aux is const
-
- for (ep = d_inputs.begin(); ep != d_inputs.end(); ep++)
- for (e = (*ep).begin(); e != (*ep).end(); e++)
- tmp.push_back((*e).block());
-
- for (e = d_outputs.begin(); e != d_outputs.end(); e++)
- tmp.push_back((*e).block());
+ // Now add the list of connected input blocks
+ std::stringstream msg;
+ for (unsigned int i = 0; i < d_inputs.size(); i++) {
+ if (d_inputs[i].size() == 0) {
+ msg << "In hierarchical block " << d_owner->name() << ", input " << i
+ << " is not connected internally";
+ throw std::runtime_error(msg.str());
+ }
+
+ for (unsigned int j = 0; j < d_inputs[i].size(); j++)
+ tmp.push_back(d_inputs[i][j].block());
+ }
+ for (unsigned int i = 0; i < d_outputs.size(); i++) {
+ gr_basic_block_sptr blk = d_outputs[i].block();
+ if (!blk) {
+ msg << "In hierarchical block " << d_owner->name() << ", output " << i
+ << " is not connected internally";
+ throw std::runtime_error(msg.str());
+ }
+ tmp.push_back(blk);
+ }
sort(tmp.begin(), tmp.end());
std::insert_iterator<gr_basic_block_vector_t> inserter(blocks, blocks.begin());