File: integerdomain.cpp

package info (click to toggle)
aoflagger 3.4.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,960 kB
  • sloc: cpp: 83,076; python: 10,187; sh: 260; makefile: 178
file content (91 lines) | stat: -rw-r--r-- 2,586 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "integerdomain.h"

#include <string>

IntegerDomain::IntegerDomain(const IntegerDomain& source) {
  for (std::vector<int>::const_iterator i = source._values.begin();
       i != source._values.end(); ++i)
    _values.push_back(*i);
}

IntegerDomain::IntegerDomain(int singleValue) {
  _values.push_back(singleValue);
}

IntegerDomain::IntegerDomain(const int* values, unsigned count) {
  for (unsigned i = 0; i < count; ++i) _values.push_back(values[i]);
}

IntegerDomain::IntegerDomain(int first, unsigned count) {
  for (int i = first; i < (int)(first + count); ++i) _values.push_back(i);
}

IntegerDomain::IntegerDomain(int first, unsigned step, unsigned count) {
  for (unsigned i = 0; i < count; ++i) _values.push_back(first + i * step);
}

IntegerDomain::IntegerDomain(const std::string& str) {
  enum State { Accepting, Number, Interval } state = Accepting;
  int number, i1 = 0;
  for (std::string::const_iterator i = str.begin(); i != str.end(); ++i) {
    switch (state) {
      case Accepting:
        if (*i >= '0' && *i <= '9') {
          state = Number;
          number = *i - '0';
        }
        break;
      case Number:
        if (*i >= '0' && *i <= '9') {
          number = number * 10 + (*i - '0');
        } else if (*i == '-') {
          state = Interval;
          i1 = number;
          number = 0;
        }
        break;
      case Interval:
        if (*i >= '0' && *i <= '9') {
          number = number * 10 + (*i - '0');
        }
        break;
    }
  }
  switch (state) {
    case Number:
      _values.push_back(number);
      break;
    case Interval:
      for (int n = i1; n <= number; ++n) _values.push_back(n);
      break;
    case Accepting:
      break;
  }
}

void IntegerDomain::Join(const IntegerDomain& other) throw() {
  for (std::vector<int>::const_iterator i = other._values.begin();
       i != other._values.end(); ++i) {
    bool found = false;
    for (std::vector<int>::const_iterator j = _values.begin();
         j != _values.end(); ++j) {
      if (*i == *j) {
        found = true;
        break;
      }
    }
    if (!found) _values.push_back(*i);
  }
}

IntegerDomain IntegerDomain::Split(unsigned partCount,
                                   unsigned partIndex) const {
  const unsigned start = _values.size() * partIndex / partCount;
  const unsigned end = _values.size() * (partIndex + 1) / partCount;

  int* values = new int[end - start];
  for (unsigned i = start; i < end; ++i) values[i - start] = _values[i];
  const IntegerDomain domain(*values, end - start);
  delete[] values;
  return domain;
}