// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_BITSET_HPP #define NAZARA_BITSET_HPP #include #include #include #include class NzAbstractHash; template> class NzBitset { static_assert(std::is_integral() && std::is_unsigned(), "Block must be a unsigned integral type"); public: class Bit; NzBitset(); explicit NzBitset(unsigned int bitCount, bool val = false); explicit NzBitset(const char* bits); NzBitset(const char* bits, unsigned int bitCount); NzBitset(const NzBitset& bitset) = default; explicit NzBitset(const NzString& bits); NzBitset(NzBitset&& bitset) noexcept = default; ~NzBitset() = default; void Clear(); unsigned int Count() const; void Flip(); unsigned int FindFirst() const; unsigned int FindNext(unsigned int bit) const; Block GetBlock(unsigned int i) const; unsigned int GetBlockCount() const; unsigned int GetCapacity() const; unsigned int GetSize() const; void PerformsAND(const NzBitset& a, const NzBitset& b); void PerformsNOT(const NzBitset& a); void PerformsOR(const NzBitset& a, const NzBitset& b); void PerformsXOR(const NzBitset& a, const NzBitset& b); bool Intersects(const NzBitset& bitset) const; void Reserve(unsigned int bitCount); void Resize(unsigned int bitCount, bool defaultVal = false); void Reset(); void Reset(unsigned int bit); void Set(bool val = true); void Set(unsigned int bit, bool val = true); void SetBlock(unsigned int i, Block block); void Swap(NzBitset& bitset); bool Test(unsigned int bit) const; bool TestAll(); bool TestAny(); bool TestNone(); template T To() const; NzString ToString() const; Bit operator[](int index); bool operator[](int index) const; NzBitset operator~() const; NzBitset& operator=(const NzBitset& bitset) = default; NzBitset& operator=(const NzString& bits); NzBitset& operator=(NzBitset&& bitset) noexcept = default; NzBitset& operator&=(const NzBitset& bitset); NzBitset& operator|=(const NzBitset& bitset); NzBitset& operator^=(const NzBitset& bitset); static Block fullBitMask; static unsigned int bitsPerBlock; static unsigned int npos; private: unsigned int FindFirstFrom(unsigned int blockIndex) const; Block GetLastBlockMask() const; void ResetExtraBits(); static unsigned int ComputeBlockCount(unsigned int bitCount); static unsigned int GetBitIndex(unsigned int bit); static unsigned int GetBlockIndex(unsigned int bit); std::vector m_blocks; unsigned int m_bitCount; }; template NzBitset operator&(const NzBitset& lhs, const NzBitset& rhs); template NzBitset operator|(const NzBitset& lhs, const NzBitset& rhs); template NzBitset operator^(const NzBitset& lhs, const NzBitset& rhs); template class NzBitset::Bit { friend NzBitset; public: Bit(const Bit& bit) = default; Bit& Flip(); Bit& Reset(); Bit& Set(bool val = true); bool Test() const; template void* operator&() const; operator bool() const; Bit& operator=(bool val); Bit& operator=(const Bit& bit); Bit& operator|=(bool val); Bit& operator&=(bool val); Bit& operator^=(bool val); Bit& operator-=(bool val); private: Bit(Block& block, Block mask) : m_block(block), m_mask(mask) { } Block& m_block; Block m_mask; }; namespace std { template void swap(NzBitset& lhs, NzBitset& rhs); } #include #endif // NAZARA_BITSET_HPP