//===- llvm/ADT/SparseBitVector.h - Efficient Sparse BitVector --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file defines the SparseBitVector class. See the doxygen comment for /// SparseBitVector for more details on the algorithm used. /// //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_SPARSEBITVECTOR_H #define LLVM_ADT_SPARSEBITVECTOR_H #include "llvm/ADT/bit.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include <cassert> #include <climits> #include <cstring> #include <iterator> #include <list> namespace llvm { /// SparseBitVector is an implementation of a bitvector that is sparse by only /// storing the elements that have non-zero bits set. In order to make this /// fast for the most common cases, SparseBitVector is implemented as a linked /// list of SparseBitVectorElements. We maintain a pointer to the last /// SparseBitVectorElement accessed (in the form of a list iterator), in order /// to make multiple in-order test/set constant time after the first one is /// executed. Note that using vectors to store SparseBitVectorElement's does /// not work out very well because it causes insertion in the middle to take /// enormous amounts of time with a large amount of bits. Other structures that /// have better worst cases for insertion in the middle (various balanced trees, /// etc) do not perform as well in practice as a linked list with this iterator /// kept up to date. They are also significantly more memory intensive. template <unsigned ElementSize = 128> struct SparseBitVectorElement { … }; template <unsigned ElementSize = 128> class SparseBitVector { … }; // Convenience functions to allow Or and And without dereferencing in the user // code. template <unsigned ElementSize> inline bool operator |=(SparseBitVector<ElementSize> &LHS, const SparseBitVector<ElementSize> *RHS) { … } template <unsigned ElementSize> inline bool operator |=(SparseBitVector<ElementSize> *LHS, const SparseBitVector<ElementSize> &RHS) { … } template <unsigned ElementSize> inline bool operator &=(SparseBitVector<ElementSize> *LHS, const SparseBitVector<ElementSize> &RHS) { … } template <unsigned ElementSize> inline bool operator &=(SparseBitVector<ElementSize> &LHS, const SparseBitVector<ElementSize> *RHS) { … } // Convenience functions for infix union, intersection, difference operators. template <unsigned ElementSize> inline SparseBitVector<ElementSize> operator|(const SparseBitVector<ElementSize> &LHS, const SparseBitVector<ElementSize> &RHS) { … } template <unsigned ElementSize> inline SparseBitVector<ElementSize> operator&(const SparseBitVector<ElementSize> &LHS, const SparseBitVector<ElementSize> &RHS) { … } template <unsigned ElementSize> inline SparseBitVector<ElementSize> operator-(const SparseBitVector<ElementSize> &LHS, const SparseBitVector<ElementSize> &RHS) { … } // Dump a SparseBitVector to a stream template <unsigned ElementSize> void dump(const SparseBitVector<ElementSize> &LHS, raw_ostream &out) { … } } // end namespace llvm #endif // LLVM_ADT_SPARSEBITVECTOR_H