bitmap.hpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. unsigned char* m_bm;
  11. std::size_t m_size;
  12. static constexpr std::size_t SZ = sizeof(unsigned char);
  13. public:
  14. constexpr bitmap(const deleter_type& del, unsigned char* bm, std::size_t size)
  15. : m_del(del), m_bm(bm), m_size(size) {}
  16. constexpr bitmap(deleter_type&& del, unsigned char* bm, std::size_t size)
  17. : m_del(std::move(del)), m_bm(bm), m_size(size) {}
  18. explicit constexpr bitmap(std::size_t size)
  19. {
  20. m_size = (size / SZ) + ((size % SZ) ? 1 : 0);
  21. m_bm = new unsigned char[m_size] {};
  22. m_del = [](unsigned char* bm, std::size_t) {
  23. delete[] bm;
  24. };
  25. }
  26. bitmap(const bitmap&) = delete;
  27. constexpr ~bitmap()
  28. { m_del(m_bm, m_size); }
  29. constexpr bool test(std::size_t n) const
  30. { return (m_bm[n / SZ] & (1 << (n % SZ))) != 0; }
  31. constexpr void set(std::size_t n)
  32. { m_bm[n / SZ] |= (1 << (n % SZ)); }
  33. constexpr void clear(std::size_t n)
  34. { m_bm[n / SZ] &= (~(1 << (n % SZ))); }
  35. constexpr std::size_t size() const noexcept
  36. { return m_size; }
  37. };
  38. } // namespace types