cprover
format_number_range.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Format vector of numbers into a compressed range
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
11 
12 #include <algorithm>
13 #include <sstream>
14 #include <string>
15 
16 #include "invariant.h"
17 
18 #include "format_number_range.h"
19 
23 std::string format_number_range(const std::vector<unsigned> &input_numbers)
24 {
25  PRECONDITION(!input_numbers.empty());
26 
27  std::vector<unsigned> numbers(input_numbers);
28  std::sort(numbers.begin(), numbers.end());
29  unsigned end_number=numbers.back();
30  if(numbers.front()==end_number)
31  return std::to_string(end_number); // only single number
32 
33  std::stringstream number_range;
34 
35  auto start_number = numbers.front();
36 
37  for(std::vector<unsigned>::const_iterator it = numbers.begin();
38  it != numbers.end();
39  ++it)
40  {
41  const auto number = *it;
42  const auto next = std::next(it);
43 
44  // advance one forward
45  if(next != numbers.end() && *next <= number + 1)
46  continue;
47 
48  // end this block range
49  if(start_number != numbers.front())
50  number_range << ',';
51 
52  if(number == start_number)
53  {
54  number_range << number;
55  }
56  else if(number == start_number + 1)
57  {
58  number_range << start_number << ',' << number;
59  }
60  else
61  {
62  number_range << start_number << '-' << number;
63  }
64 
65  if(next != numbers.end())
66  start_number = *next;
67  }
68 
69  POSTCONDITION(!number_range.str().empty());
70  return number_range.str();
71 }
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
#define POSTCONDITION(CONDITION)
Definition: invariant.h:454
#define PRECONDITION(CONDITION)
Definition: invariant.h:438
std::string format_number_range(const std::vector< unsigned > &input_numbers)
create shorter representation for output
Format vector of numbers into a compressed range.