New features
[anna.git] / source / core / util / MultiRangeExpression.cpp
index 75ca563..3c2307d 100644 (file)
@@ -109,3 +109,46 @@ 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();
+}
+