File: Interval.hpp

package info (click to toggle)
consensuscore 1.1.1%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,404 kB
  • sloc: cpp: 38,940; python: 2,083; ansic: 542; sh: 184; makefile: 82; cs: 10
file content (62 lines) | stat: -rw-r--r-- 1,517 bytes parent folder | download | duplicates (4)
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
// Author: David Alexander

#pragma once

#include <algorithm>
#include <boost/tuple/tuple.hpp>
#include <climits>
#include <utility>
#include <vector>

#include <ConsensusCore/Utils.hpp>

namespace ConsensusCore {

struct Interval
{
    int Begin;
    int End;

    Interval() : Begin(0), End(0) {}
    Interval(const int& b, const int& e) : Begin(b), End(e) {}

    bool operator==(const Interval& other) const
    {
        return (Begin == other.Begin && End == other.End);
    }

#ifndef SWIG
    operator boost::tuple<int, int>() { return boost::make_tuple(Begin, End); }

    operator boost::tuple<int&, int&>()
    {
        return boost::make_tuple(boost::ref(Begin), boost::ref(End));
    }
#endif
};

inline Interval RangeUnion(const Interval& range1, const Interval& range2)
{
    return Interval(std::min(range1.Begin, range2.Begin), std::max(range1.End, range2.End));
}

inline Interval RangeUnion(const Interval& range1, const Interval& range2, const Interval& range3)
{
    return RangeUnion(range1, RangeUnion(range2, range3));
}

inline Interval RangeUnion(const Interval& range1, const Interval& range2, const Interval& range3,
                           const Interval& range4)
{
    return RangeUnion(RangeUnion(range1, range2), RangeUnion(range3, range4));
}

inline Interval RangeUnion(const std::vector<Interval> ranges)
{
    Interval result = Interval(INT_MAX / 2, -INT_MAX / 2);
    foreach (const Interval& r, ranges) {
        result = RangeUnion(result, r);
    }
    return result;
}
}