BitMagic-C++
sample23.cpp
Go to the documentation of this file.
1/*
2Copyright(c) 2002-2017 Anatoliy Kuznetsov(anatoliy_kuznetsov at yahoo.com)
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15
16For more information please visit: http://bitmagic.io
17*/
18
19/** \example sample23.cpp
20
21 Example on intervals enumarator.
22
23 BitMagic bvector<> implements high performance operation on RLE
24 coded bit-vectors, transparently supporting all logical operations
25 like intersections.Serialization uses compressive encoding
26 (binary interpolative codes) to efficiently store collections
27 of intervals.
28
29 This example illustrates use of inetrval_enumerator<> to interpret
30 bit-vector as a sequence of 011110 ranges/intervals.
31
32 \sa bm::bvector::set_range
33 \sa bm::interval_enumerator
34
35 \sa sample22.cpp
36 \sa bvintervals
37*/
38
39/*! \file sample23.cpp
40 \brief Example: interval_enumerator<> - interator class for intervals
41*/
42
43#include <iostream>
44#include <assert.h>
45
46#include "bm.h"
47#include "bmintervals.h"
48
49using namespace std;
50
52
53int main(void)
54{
55 try
56 {
57 bm::bvector<> bv(bm::BM_GAP); // use RLE compressed vector from the start
58
59 bv.set_range(10, 10);
60 bv.set_range(100, 110); // sets a range of 1s [100, 110] .....11111....
61 bv.set_range(777, 888);
62 bv.set_range(65536, 65536);
63
64 bv.optimize();
65
66
67 {
69 if (ien.valid())
70 {
71 do
72 {
73 cout << "[" << ien.start() << ".." << ien.end() << "]";
74 } while (ien.advance());
75 cout << endl;
76 }
77 }
78
79 // case 2: slightly less efficient, but more STL iterator conformant
80 //
81 {
84
85 // please note prefix increment "++en" is way more efficient
86 // than possible postfix notation of "ien++" (no temp.copy)
87 //
88 for (; ien != ien_end; ++ien)
89 {
90 // also uses pair notation to represent interval
91 cout << "[" << (*ien).first << ".." << (*ien).second << "]";
92 }
93 cout << endl;
94 }
95
96
97 {
98 // construct enumerator to start from position 102 and
99 // extend start (to 100)
100 interval_enumerator_type ien(bv, 102, true);
102 for (; ien != ien_end; ++ien)
103 {
104 cout << "[" << ien.get().first << ".." << ien.get().second << "]";
105 }
106 cout << endl;
107
108 ien.go_to(105, false); // now re-position enumerator to position 105 without extend start
109 for (; ien != ien_end; ++ien)
110 {
111 cout << "[" << ien.get().first << ".." << ien.get().second << "]";
112 }
113 cout << endl;
114
115 // now re-position enumerator to position 105 without extend start
116 ien.go_to(105, false);
117 for (; ien != ien_end; ++ien)
118 {
119 cout << "[" << ien.get().first << ".." << ien.get().second << "]";
120 }
121 cout << endl;
122
123 // now re-position enumerator to position 115 wit extend start
124 // target position is not in the interval, so it should find the
125 // next available one automatically
126 //
127 ien.go_to(115, true); // extend_left=true but it should not matter
128 for (; ien != ien_end; ++ien)
129 {
130 cout << "[" << ien.get().first << ".." << ien.get().second << "]";
131 }
132 cout << endl;
133
134 // go beyond end
135 ien.go_to(1150000, true);
136 if (ien.valid())
137 {
138 assert(0);
139 }
140 else
141 {
142 cout << "EMPTY" << endl;
143 }
144 }
145
146 }
147 catch(std::exception& ex)
148 {
149 std::cerr << ex.what() << std::endl;
150 return 1;
151 }
152
153 return 0;
154}
155
Compressed bit-vector bvector<> container, set algebraic methods, traversal iterators.
Algorithms for bit ranges and intervals.
void optimize(bm::word_t *temp_block=0, optmode opt_mode=opt_compress, statistics *stat=0)
Optimize memory bitvector's memory allocation.
Definition bm.h:3071
bvector< Alloc > & set_range(size_type left, size_type right, bool value=true)
Sets all bits in the specified closed interval [left,right] Interval must be inside the bvector's siz...
Definition bm.h:2158
forward iterator class to traverse bit-vector as ranges
Definition bmintervals.h:53
const pair_type & get() const BMNOEXCEPT
Get interval pair.
size_type end() const BMNOEXCEPT
Return interval end/right as bit-vector coordinate 011110 [left..right].
bool valid() const BMNOEXCEPT
Returns true if enumerator is valid (false if traversal is done)
size_type start() const BMNOEXCEPT
Return interval start/left as bit-vector coordinate 011110 [left..right].
bool go_to(size_type pos, bool extend_start=true)
Go to inetrval at specified position Jump to position with interval. If interval is not available at ...
@ BM_GAP
GAP compression is ON.
Definition bmconst.h:144
bm::interval_enumerator< bm::bvector<> > interval_enumerator_type
Definition sample23.cpp:51
int main(void)
Definition sample23.cpp:53
Second second
Definition bmfunc.h:124
First first
Definition bmfunc.h:123