bitmap.hpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #pragma once
  2. #include <cstddef>
  3. #include <functional>
  4. namespace types {
  5. class bitmap {
  6. public:
  7. using deleter_type = std::function<void(unsigned char*, std::size_t)>;
  8. private:
  9. deleter_type m_del;
  10. std::size_t m_size;
  11. unsigned char* m_bm;
  12. static constexpr std::size_t SZ = sizeof(unsigned char) * 8;
  13. public:
  14. constexpr bitmap(const deleter_type& del, unsigned char* bm,
  15. std::size_t size)
  16. : m_del(del), m_size(size), m_bm(bm) {}
  17. constexpr bitmap(deleter_type&& del, unsigned char* bm, std::size_t size)
  18. : m_del(std::move(del)), m_size(size), m_bm(bm) {}
  19. explicit constexpr bitmap(std::size_t size)
  20. : m_del{[](unsigned char* bm, std::size_t) { delete[] bm; }}
  21. , m_size{(size / SZ) + ((size % SZ) ? 1 : 0)}
  22. , m_bm{new unsigned char[m_size]{}} {}
  23. bitmap(const bitmap&) = delete;
  24. constexpr ~bitmap() { m_del(m_bm, m_size); }
  25. constexpr bool test(std::size_t n) const {
  26. return (m_bm[n / SZ] & (1 << (n % SZ))) != 0;
  27. }
  28. constexpr void set(std::size_t n) { m_bm[n / SZ] |= (1 << (n % SZ)); }
  29. constexpr void clear(std::size_t n) { m_bm[n / SZ] &= (~(1 << (n % SZ))); }
  30. constexpr std::size_t size() const noexcept { return m_size; }
  31. };
  32. } // namespace types