本文整理汇总了C++中Branch::Render方法的典型用法代码示例。如果您正苦于以下问题:C++ Branch::Render方法的具体用法?C++ Branch::Render怎么用?C++ Branch::Render使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Branch
的用法示例。
在下文中一共展示了Branch::Render方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Render
void Block::Render(bool InLoop) {
if (IsCheckedMultipleEntry && InLoop) {
PrintIndented("label = 0;\n");
}
if (Code) {
// Print code in an indented manner, even over multiple lines
char *Start = const_cast<char*>(Code);
while (*Start) {
char *End = strchr(Start, '\n');
if (End) *End = 0;
PutIndented(Start);
if (End) *End = '\n'; else break;
Start = End+1;
}
}
if (!ProcessedBranchesOut.size()) return;
bool SetLabel = true; // in some cases it is clear we can avoid setting label, see later
if (ProcessedBranchesOut.size() == 1 && ProcessedBranchesOut.begin()->second->Type == Branch::Direct) {
SetLabel = false;
}
// A setting of the label variable (label = x) is necessary if it can
// cause an impact. The main case is where we set label to x, then elsewhere
// we check if label is equal to that value, i.e., that label is an entry
// in a multiple block. We also need to reset the label when we enter
// that block, so that each setting is a one-time action: consider
//
// while (1) {
// if (check) label = 1;
// if (label == 1) { label = 0 }
// }
//
// (Note that this case is impossible due to fusing, but that is not
// material here.) So setting to 0 is important just to clear the 1 for
// future iterations.
// TODO: When inside a loop, if necessary clear the label variable
// once on the top, and never do settings that are in effect clears
// Fusing: If the next is a Multiple, we can fuse it with this block. Note
// that we must be the Inner of a Simple, so fusing means joining a Simple
// to a Multiple. What happens there is that all options in the Multiple
// *must* appear in the Simple (the Simple is the only one reaching the
// Multiple), so we can remove the Multiple and add its independent groups
// into the Simple's branches.
MultipleShape *Fused = Shape::IsMultiple(Parent->Next);
if (Fused) {
PrintDebug("Fusing Multiple to Simple\n");
Parent->Next = Parent->Next->Next;
Fused->RenderLoopPrefix();
// When the Multiple has the same number of groups as we have branches,
// they will all be fused, so it is safe to not set the label at all
if (SetLabel && Fused->InnerMap.size() == ProcessedBranchesOut.size()) {
SetLabel = false;
}
}
// We must do this here, because blocks can be split and even comparing their Ids is not enough. We must check the conditions.
for (BlockBranchMap::iterator iter = ProcessedBranchesOut.begin(); iter != ProcessedBranchesOut.end(); iter++) {
if (!iter->second->Condition) {
assert(!DefaultTarget); // Must be exactly one default
DefaultTarget = iter->first;
}
}
assert(DefaultTarget); // Must be a default
ministring RemainingConditions;
bool First = true;
for (BlockBranchMap::iterator iter = ProcessedBranchesOut.begin();; iter++) {
Block *Target;
Branch *Details;
if (iter != ProcessedBranchesOut.end()) {
Target = iter->first;
if (Target == DefaultTarget) continue; // done at the end
Details = iter->second;
assert(Details->Condition); // must have a condition if this is not the default target
} else {
Target = DefaultTarget;
Details = ProcessedBranchesOut[DefaultTarget];
}
bool SetCurrLabel = SetLabel && Target->IsCheckedMultipleEntry;
bool HasFusedContent = Fused && Fused->InnerMap.find(Target) != Fused->InnerMap.end();
bool HasContent = SetCurrLabel || Details->Type != Branch::Direct || HasFusedContent || Details->Code;
if (iter != ProcessedBranchesOut.end()) {
// If there is nothing to show in this branch, omit the condition
if (HasContent) {
PrintIndented("%sif (%s) {\n", First ? "" : "} else ", Details->Condition);
First = false;
} else {
if (RemainingConditions.size() > 0) RemainingConditions += " && ";
RemainingConditions += "!(";
RemainingConditions += Details->Condition;
RemainingConditions += ")";
}
} else {
if (HasContent) {
//.........这里部分代码省略.........