File: IntegerSet.hpp

package info (click to toggle)
libpwiz 3.0.18342-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 14,888 kB
  • sloc: cpp: 157,552; sh: 4,182; makefile: 317
file content (159 lines) | stat: -rw-r--r-- 4,568 bytes parent folder | download | duplicates (3)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
//
// $Id$
//
//
// Original author: Darren Kessner <darren@proteowizard.org>
//
// Copyright 2007 Spielberg Family Center for Applied Proteomics
//   Cedars Sinai Medical Center, Los Angeles, California  90048
//
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
//


#ifndef _INTEGERSET_HPP_
#define _INTEGERSET_HPP_

#include "pwiz/utility/misc/Export.hpp"
#include <list>
#include <ostream>

namespace pwiz {
namespace util {


/// a virtual container of integers, accessible via an iterator interface,
/// stored as union of intervals
class PWIZ_API_DECL IntegerSet
{
    public:

    /// a single closed interval of integers 
    struct PWIZ_API_DECL Interval
    {
        int begin;
        int end;
        
        Interval(int a = 0); // allow int conversion
        Interval(int a, int b);

        bool contains(int n) const {return n>=begin && n<=end;}

        friend PWIZ_API_DECL std::ostream& operator<<(std::ostream& os, const Interval& interval);
        friend PWIZ_API_DECL std::istream& operator>>(std::istream& is, Interval& interval);
    };

    /// collection of Interval objects
    typedef std::list<Interval> Intervals;

    /// forward iterator providing readonly access to the virtual container 
    class PWIZ_API_DECL Iterator
    {
        public:

        /// \name instantiation 
        //@{
        /// default constructed Iterator marks end of any IntegerSet
        Iterator(); 

        /// initialized to beginning of the IntegerSet
        Iterator(const IntegerSet& integerSet);
        //@}

        /// \name forward iterator operators
        //@{
        Iterator& operator++();
        const Iterator operator++(int);
        int operator*() const; // note return by value
        bool operator!=(const Iterator& that) const; 
        bool operator==(const Iterator& that) const; 
        //@}

        /// \name standard iterator typedefs 
        //@{
        typedef std::forward_iterator_tag iterator_category;
        typedef int value_type;
        typedef int difference_type;
        typedef value_type* pointer;
        typedef value_type& reference;
        //@}

        private:
        Intervals::const_iterator it_;
        Intervals::const_iterator end_;
        int value_;
    };

    /// default construction
    IntegerSet();

    /// construction with a single integer
    explicit IntegerSet(int a);

    /// construction with a single interval
    IntegerSet(int a, int b);

    /// \name write access to the virtual container 
    //@{

    /// insert an interval of integers into the virtual container
    void insert(Interval interval);

    /// insert a single integer into the virtual container
    void insert(int a);

    /// insert an interval of integers into the virtual container
    void insert(int a, int b);

    /// insert intervals by parsing a string representing a 
    /// whitespace-delimited list of closed intervals:
    ///   parse(" [-3,2]  5  8-9  10- ");  // insert(-3,2); insert(5); insert(8,9); insert(10,INT_MAX);
    void parse(const std::string& intervalList);
    //@}

    /// \name const iterator interface to the virtual container 
    //@{
    typedef Iterator const_iterator;
    const_iterator begin() const; 
    const_iterator end() const; 
    //@}

    /// true iff IntegerSet is empty
    bool empty() const {return intervals_.empty();}

    /// true iff n is in the IntegerSet
    bool contains(int n) const;

    /// true iff n is an upper bound for the IntegerSet 
    bool hasUpperBound(int n) const; 

    /// returns the number of intervals in the set
    size_t intervalCount() const;

    /// returns the number of integers in the set
    size_t size() const;

    private:

    Intervals intervals_; 

    friend PWIZ_API_DECL std::ostream& operator<<(std::ostream& os, const IntegerSet& integerSet);
};


} // namespace util 
} // namespace pwiz


#endif // _INTEGERSET_HPP_