Reverted r159658:

Optimized diff operation: implemented the case when LHS and RHS subsets contains single numbers only.

llvm-svn: 159704
This commit is contained in:
Stepan Dyatkovskiy 2012-07-04 06:07:06 +00:00
parent 7ff588f986
commit a3b11bdbea
1 changed files with 2 additions and 84 deletions

View File

@ -74,7 +74,6 @@ protected:
CaseItems Items; CaseItems Items;
bool Sorted; bool Sorted;
bool SingleNumbersOnly;
bool isIntersected(CaseItemIt& LItem, CaseItemIt& RItem) { bool isIntersected(CaseItemIt& LItem, CaseItemIt& RItem) {
return LItem->first.getHigh() >= RItem->first.getLow(); return LItem->first.getHigh() >= RItem->first.getLow();
@ -246,48 +245,6 @@ protected:
bool isLOpened() { return State == L_OPENED; } bool isLOpened() { return State == L_OPENED; }
bool isROpened() { return State == R_OPENED; } bool isROpened() { return State == R_OPENED; }
}; };
void diff_single_numbers(self *LExclude, self *Intersection, self *RExclude,
const self& RHS) {
CaseItemConstIt L = Items.begin(), R = RHS.Items.begin();
CaseItemConstIt el = Items.end(), er = RHS.Items.end();
while (L != el && R != er) {
const Cluster &LCluster = *L;
const RangeEx &LRange = LCluster.first;
const Cluster &RCluster = *R;
const RangeEx &RRange = RCluster.first;
if (LRange.getLow() < RRange.getLow()) {
if (LExclude)
LExclude->add(LRange.getLow(), LCluster.second);
++L;
} else if (LRange.getLow() > RRange.getLow()) {
if (RExclude)
RExclude->add(RRange.getLow(), RCluster.second);
++R;
} else {
if (Intersection)
Intersection->add(LRange.getLow(), LCluster.second);
++L;
++R;
}
}
if (L != Items.end()) {
if (LExclude)
do {
LExclude->add(L->first, L->second);
++L;
} while (L != Items.end());
} else if (R != RHS.Items.end()) {
if (RExclude)
do {
RExclude->add(R->first, R->second);
++R;
} while (R != RHS.Items.end());
}
}
public: public:
@ -303,7 +260,6 @@ public:
IntegersSubsetMapping() { IntegersSubsetMapping() {
Sorted = false; Sorted = false;
SingleNumbersOnly = true;
} }
bool verify() { bool verify() {
@ -401,8 +357,7 @@ public:
} }
void add(const RangeEx &R, SuccessorClass *S = 0) { void add(const RangeEx &R, SuccessorClass *S = 0) {
Items.push_back(std::make_pair(R, S)); Items.push_back(std::make_pair(R, S));
if (!R.isSingleNumber()) Sorted = false;
SingleNumbersOnly = false;
} }
/// Adds all ranges and values from given ranges set to the current /// Adds all ranges and values from given ranges set to the current
@ -416,8 +371,6 @@ public:
void add(self& RHS) { void add(self& RHS) {
Items.insert(Items.end(), RHS.Items.begin(), RHS.Items.end()); Items.insert(Items.end(), RHS.Items.begin(), RHS.Items.end());
if (!RHS.SingleNumbersOnly)
SingleNumbersOnly = false;
} }
void add(self& RHS, SuccessorClass *S) { void add(self& RHS, SuccessorClass *S) {
@ -468,16 +421,10 @@ public:
void diff(self *LExclude, self *Intersection, self *RExclude, void diff(self *LExclude, self *Intersection, self *RExclude,
const self& RHS) { const self& RHS) {
if (SingleNumbersOnly && RHS.SingleNumbersOnly) {
diff_single_numbers(LExclude, Intersection, RExclude, RHS);
return;
}
DiffStateMachine Machine(LExclude, Intersection, RExclude); DiffStateMachine Machine(LExclude, Intersection, RExclude);
CaseItemConstIt L = Items.begin(), R = RHS.Items.begin(); CaseItemConstIt L = Items.begin(), R = RHS.Items.begin();
CaseItemConstIt el = Items.end(), er = RHS.Items.end(); while (L != Items.end() && R != RHS.Items.end()) {
while (L != el && R != er) {
const Cluster &LCluster = *L; const Cluster &LCluster = *L;
const RangeEx &LRange = LCluster.first; const RangeEx &LRange = LCluster.first;
const Cluster &RCluster = *R; const Cluster &RCluster = *R;
@ -497,35 +444,6 @@ public:
continue; continue;
} }
if (LRange.isSingleNumber() && RRange.isSingleNumber()) {
Machine.onLROpen(LRange.getLow(), LCluster.second, RCluster.second);
Machine.onLRClose(LRange.getLow());
++L;
++R;
continue;
}
if (LRange.isSingleNumber()) {
Machine.onLOpen(LRange.getLow(), LCluster.second);
Machine.onLClose(LRange.getLow());
++L;
while(L != Items.end() && L->first.getHigh() < RRange.getHigh()) {
Machine.onLOpen(LRange.getLow(), LCluster.second);
Machine.onLClose(LRange.getLow());
++L;
}
continue;
} else if (RRange.isSingleNumber()) {
Machine.onROpen(R->first.getLow(), R->second);
Machine.onRClose(R->first.getHigh());
++R;
while(R != RHS.Items.end() && R->first.getHigh() < LRange.getHigh()) {
Machine.onROpen(R->first.getLow(), R->second);
Machine.onRClose(R->first.getHigh());
++R;
}
continue;
} else
if (LRange.getLow() < RRange.getLow()) { if (LRange.getLow() < RRange.getLow()) {
// May be opened in previous iteration. // May be opened in previous iteration.
if (!Machine.isLOpened()) if (!Machine.isLOpened())