X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fcore%2Futil%2FMultiRangeExpression.cpp;h=bd4818bb25466df0615ccbfb3bd1a8920a2b374e;hb=5a6cba5fde2b2f538a7515f8293cc0a8d9589dfa;hp=7674047fcaac4f76908abb4d74c34106c93a267d;hpb=3e258840b15577cb8bda3cdedd0b9b88e16404b3;p=anna.git diff --git a/source/core/util/MultiRangeExpression.cpp b/source/core/util/MultiRangeExpression.cpp index 7674047..bd4818b 100644 --- a/source/core/util/MultiRangeExpression.cpp +++ b/source/core/util/MultiRangeExpression.cpp @@ -1,37 +1,9 @@ -// ANNA - Anna is Not Nothingness Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// https://bitbucket.org/testillano/anna -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Authors: eduardo.ramos.testillano@gmail.com -// cisco.tierra@gmail.com +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // // Local @@ -52,7 +24,7 @@ //------------------------------------------------------------------------------ //---------------------------------------------- MultiRangeExpression::refresh() //------------------------------------------------------------------------------ -void anna::MultiRangeExpression::refresh(void) throw() { +void anna::MultiRangeExpression::refresh(void) { anna::Tokenizer ranges, borders; anna::Tokenizer::const_iterator ranges_it, borders_it; std::string range; @@ -78,7 +50,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; @@ -91,7 +63,7 @@ void anna::MultiRangeExpression::refresh(void) throw() { //------------------------------------------------------------------------------ //----------------------------------- MultiRangeExpression::getExpandedLiteral() //------------------------------------------------------------------------------ -std::string anna::MultiRangeExpression::getExpandedLiteral(void) const throw() { +std::string anna::MultiRangeExpression::getExpandedLiteral(void) const { std::string result; std::map < unsigned int, int/*dummy*/ >::const_iterator it; std::map < unsigned int, int/*dummy*/ >::const_iterator it_min(a_data.begin()); @@ -109,3 +81,47 @@ std::string anna::MultiRangeExpression::getExpandedLiteral(void) const throw() { return (result); } + +//------------------------------------------------------------------------------ +//-------------------------------------- MultiRangeExpression::simplifyLiteral() +//------------------------------------------------------------------------------ +const char * anna::MultiRangeExpression::simplifyLiteral(void) { + 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(); +} +