X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;ds=sidebyside;f=source%2Fcore%2Futil%2FMultiRangeExpression.cpp;h=84e722c6cfab3f567daf1c557ce70cd97b9431e8;hb=2032c82d206dd40e35d118242272417431094823;hp=be9ffaca1774279d95ff009a425b522311e41f35;hpb=39033fd99e58e994a5e98c1060dcc79e0d81f9c9;p=anna.git diff --git a/source/core/util/MultiRangeExpression.cpp b/source/core/util/MultiRangeExpression.cpp index be9ffac..84e722c 100644 --- a/source/core/util/MultiRangeExpression.cpp +++ b/source/core/util/MultiRangeExpression.cpp @@ -78,7 +78,7 @@ void anna::MultiRangeExpression::refresh(void) throw() { } // Update a_data: - for(register unsigned int k = min; k <= max; k++) { + for(unsigned int k = min; k <= max; k++) { a_data[k] = 0; if(k == UINT_MAX/* overflow */) break; @@ -109,3 +109,47 @@ std::string anna::MultiRangeExpression::getExpandedLiteral(void) const throw() { return (result); } + +//------------------------------------------------------------------------------ +//-------------------------------------- MultiRangeExpression::simplifyLiteral() +//------------------------------------------------------------------------------ +const char * anna::MultiRangeExpression::simplifyLiteral(void) throw() { + if(a_data.size() == 0) return NULL; + + std::map < unsigned int, int/*dummy*/ >::const_iterator it; + std::map < unsigned int, int/*dummy*/ >::const_iterator it_min(a_data.begin()); + std::map < unsigned int, int/*dummy*/ >::const_iterator it_max(a_data.end()); + unsigned int min = UINT_MAX; + unsigned int max = 0; + unsigned int value; + unsigned int prevValue = a_data.begin()->first; + a_literal = ""; + + for(it = it_min; it != it_max; it++) { + value = (*it).first; + + if(value < min) min = value; + + if(value - prevValue > 1) { + a_literal += anna::functions::asString(min); + a_literal += "-"; + a_literal += anna::functions::asString(max); + a_literal += ","; + min = value; + } + + if(value > max) max = value; + + prevValue = value; + } + + a_literal += anna::functions::asString(min); + + if(max != min) { + a_literal += "-"; + a_literal += anna::functions::asString(max); + } + + return a_literal.c_str(); +} +