1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // Copyright (c) 2018 Google LLC
- //
- // 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.
- #include "source/util/bit_vector.h"
- #include <cassert>
- #include <iostream>
- namespace spvtools {
- namespace utils {
- void BitVector::ReportDensity(std::ostream& out) {
- uint32_t count = 0;
- for (BitContainer e : bits_) {
- while (e != 0) {
- if ((e & 1) != 0) {
- ++count;
- }
- e = e >> 1;
- }
- }
- out << "count=" << count
- << ", total size (bytes)=" << bits_.size() * sizeof(BitContainer)
- << ", bytes per element="
- << (double)(bits_.size() * sizeof(BitContainer)) / (double)(count);
- }
- bool BitVector::Or(const BitVector& other) {
- auto this_it = this->bits_.begin();
- auto other_it = other.bits_.begin();
- bool modified = false;
- while (this_it != this->bits_.end() && other_it != other.bits_.end()) {
- auto temp = *this_it | *other_it;
- if (temp != *this_it) {
- modified = true;
- *this_it = temp;
- }
- ++this_it;
- ++other_it;
- }
- if (other_it != other.bits_.end()) {
- modified = true;
- this->bits_.insert(this->bits_.end(), other_it, other.bits_.end());
- }
- return modified;
- }
- std::ostream& operator<<(std::ostream& out, const BitVector& bv) {
- out << "{";
- for (uint32_t i = 0; i < bv.bits_.size(); ++i) {
- BitVector::BitContainer b = bv.bits_[i];
- uint32_t j = 0;
- while (b != 0) {
- if (b & 1) {
- out << ' ' << i * BitVector::kBitContainerSize + j;
- }
- ++j;
- b = b >> 1;
- }
- }
- out << "}";
- return out;
- }
- } // namespace utils
- } // namespace spvtools
|