]> sourceware.org Git - systemtap.git/blame - bpf-bitset.cxx
rhbz1732514: java runtime requires java-devel
[systemtap.git] / bpf-bitset.cxx
CommitLineData
0dbac951
RH
1// -*- C++ -*-
2// Copyright (C) 2016 Red Hat Inc.
3//
4// This file is part of systemtap, and is free software. You can
5// redistribute it and/or modify it under the terms of the GNU General
6// Public License (GPL); either version 2, or (at your option) any
7// later version.
8
9#include "bpf-bitset.h"
10
11namespace bpf {
12
13void
14throw_out_of_range(const char *where)
15{
16 throw std::out_of_range(where);
17}
18
19namespace bitset {
20
21bool
22set1_const_ref::empty () const
23{
24 for (size_t i = 0; i < words; ++i)
25 if (data[i])
26 return false;
27 return true;
28}
29
30bool
31set1_const_ref::operator== (const set1_const_ref &o) const
32{
33 if (words != o.words)
34 return false;
35 for (size_t i = 0; i < words; ++i)
36 if (data[i] != o.data[i])
37 return false;
38 return true;
39}
40
41bool
42set1_const_ref::is_subset_of(const set1_const_ref &o) const
43{
44 size_t n = std::min(words, o.words);
45
46 for (size_t i = 0; i < n; ++i)
47 if (data[i] & ~o.data[i])
48 return false;
49 for (; n < words; ++n)
50 if (data[n])
51 return false;
52
53 return true;
54}
55
56size_t
57set1_const_ref::find_first() const
58{
59 for (size_t i = 0; i < words; ++i)
60 if (data[i])
61 return i * bits_per_word + __builtin_ctzl (data[i]);
62 return npos;
63}
64
65size_t
66set1_const_ref::find_next(size_t last) const
67{
68 size_t i = (last + 1) / bits_per_word;
69 size_t o = (last + 1) % bits_per_word;
70
71 if (__builtin_expect (i >= words, 0))
72 return npos;
73
74 word_t w = data[i] & ((word_t)-1 << o);
75 for (; w == 0; w = data[i])
76 if (++i >= words)
77 return npos;
78 return i * bits_per_word + __builtin_ctzl (w);
79}
80
81size_t
82set1_const_ref::find_next_zero(size_t last) const
83{
84 size_t i = (last + 1) / bits_per_word;
85 size_t o = (last + 1) % bits_per_word;
86
87 if (__builtin_expect (i >= words, 0))
88 return npos;
89
90 word_t w = ~data[i] & ((word_t)-1 << o);
91 for (; w == 0; w = ~data[i])
92 if (++i >= words)
93 return npos;
94 return i * bits_per_word + __builtin_ctzl (w);
95}
96
97set1::set1(size_t bits)
98 : set1_ref(new word_t[round_words(bits)], round_words(bits))
99{
100 memset(data, 0, words * sizeof(word_t));
101}
102
103set1::set1(const set1_const_ref &o)
104 : set1_ref(new word_t[o.words], o.words)
105{
106 memcpy(data, o.data, words * sizeof(word_t));
107}
108
109set1::~set1()
110{
111 delete[] data;
112}
113
114set2::set2(size_t m1, size_t m2)
115 : n1(m1), w2(round_words(m2)), data(new word_t[m1 * w2])
116{
117 memset(data, 0, n1 * w2 * sizeof(word_t));
118}
119
120set2::set2(const set2 &o)
121 : n1(o.n1), w2(o.w2), data(new word_t[o.n1 * o.w2])
122{
123 memcpy(data, o.data, n1 * w2 * sizeof(word_t));
124}
125
126set2::~set2()
127{
128 delete[] data;
129}
130
131
132std::ostream&
133operator<< (std::ostream &o, const set1_const_ref &s)
134{
135 char sep = '{';
136 for (size_t n = s.size(), i = 0; i < n; ++i)
137 if (s.test(i))
138 {
139 o << sep << i;
140 sep = ',';
141 }
142 if (sep == '{')
143 o << sep;
144 return o << '}';
145}
146
147} // namespace bitset
148} // namespace bpf
This page took 0.043567 seconds and 5 git commands to generate.