diff --git a/src/App/MappedElement.cpp b/src/App/MappedElement.cpp index 5df937adfe..25e7abf7cc 100644 --- a/src/App/MappedElement.cpp +++ b/src/App/MappedElement.cpp @@ -25,102 +25,133 @@ using namespace Data; -bool ElementNameComparator::operator()(const MappedName &a, const MappedName &b) const { - size_t size = std::min(a.size(),b.size()); - if(!size) - return a.size()(std::min(leftName.size(), rightName.size())); + if (size == 0U) { + return leftName.size() < rightName.size(); + } + int currentIndex = 0; + if (rightName[0] == '#') { + if (leftName[0] != '#') { return true; + } // If both string starts with '#', compare the following hex digits by // its integer value. int res = 0; - for(i=1;ibc) - res = 1; } - }else if(std::isxdigit(ac)) - return false; - else + if (res == 0) { + if (ac < bc) { + res = -1; + } + else if (ac > bc) { + res = 1; + } + } + } + else if (std::isxdigit(ac) != 0) { + res = 1; + } + else { break; + } } - if(res < 0) + if (res < 0) { return true; - else if(res > 0) - return false; - - for (; i bc) - return false; } - return a.size() 0) { + return false; + } + + for (; currentIndex < size; ++currentIndex) { + char ac = leftName[currentIndex]; + char bc = rightName[currentIndex]; + if (ac < bc) { + return true; + } + if (ac > bc) { + return false; + } + } + return leftName.size() < rightName.size(); } - else if (a[0] == '#') + if (leftName[0] == '#') { return false; + } // If the string does not start with '#', compare the non-digits prefix // using lexical order. - for(i=0;ibc) + } + if (ac > bc) { return false; - } else if(!std::isdigit(ac)) { + } + } + else if (std::isdigit(ac) == 0) { return false; - } else + } + else { break; + } } // Then compare the following digits part by integer value int res = 0; - for(;ibc) - res = 1; } - }else if(std::isdigit(ac)) + if (res == 0) { + if (ac < bc) { + res = -1; + } + else if (ac > bc) { + res = 1; + } + } + } + else if (std::isdigit(ac) != 0) { return false; - else + } + else { break; + } } - if(res < 0) + if (res < 0) { return true; - else if(res > 0) + } + if (res > 0) { return false; + } // Finally, compare the remaining tail using lexical order - for (; i bc) + } + if (ac > bc) { return false; + } } - return a.size()