void abstract_block_model::ok(block& blk) { if (currentblockiteator != end()) currentblockiteator->set_ok(); currentblockiteator++; parcel_iterator endit = blk.end(); endit++; for (parcel_iterator it = blk.begin(); it != endit; ++it) { if (it->first->isvalue()) { if (!it->first->error()) { switch (SUPER_TYPE(it->first->type())) { case TYPE_EVENT: { executr->write_val_event(it->second, it->first->value_event()); break; } case TYPE_REPORT: { executr->write_val_report(it->second, it->first->value_report()); break; } default: { executr->write_val(it->second, it->first->value()); } } } } if (it->first->error()) { executr->error(it->second, it->first->error()); } } }
bool abstract_block_model::next(block& blk) { if (needgenerate) { currentblockiteator = begin(); } if (blocks.empty()) return false; if (currentblockiteator == end()) currentblockiteator = begin(); blk = (*currentblockiteator); parcel_iterator bgn = blk.begin(); parcel_iterator ed = blk.end(); if (check_block_active(blk, bgn, ed)) { if (bgn != blk.begin()) blk.begin(bgn); if (ed != blk.end()) blk.end(ed); return true; } currentblockiteator++; return false; }
bool abstract_block_model::check_block_active(block& blk, parcel_iterator& bgn, parcel_iterator& ed) { parcel_iterator strt = blk.begin(); parcel_iterator stpit = blk.end(); if (IN_SMPLSET(intf->type(strt->second))) return true; if (blk.begin() == stpit) { return check_parcel_active(strt); } ++stpit; for (parcel_iterator it = blk.begin(); it != stpit; ++it) { if (!check_parcel_active(it)) ++bgn; else { if (it != ed) { for (it = ed; it != bgn; --it) { if (!check_parcel_active(it)) ed--; else return true; } } return true; } } return false; }