emlabcpp
modern opinionated embedded C++ library
pool_resource.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "../range.h"
27 #include "../static_vector.h"
28 #include "./memory_resource.h"
29 #include "./util.h"
30 
31 namespace emlabcpp::pmr
32 {
33 
34 template < std::size_t PoolSize, uint16_t PoolCount >
35 class pool_resource final : public pmr::memory_resource
36 {
37 public:
39  {
40  for ( std::size_t const i : range( PoolCount ) )
41  free_.push_back( static_cast< uint16_t >( i ) );
42  }
43 
44  pool_resource( pool_resource const& ) = delete;
46  pool_resource& operator=( pool_resource const& ) = delete;
48 
49  [[nodiscard]] void*
50  allocate( std::size_t const bytes, std::size_t const alignment ) override
51  {
52  void* p = nullptr;
53  std::size_t used = bytes;
54  if ( !free_.empty() ) {
55  std::size_t const i = free_.back();
56  void* const pool_p = pools_[i].data();
57  p = align( pool_p, alignment );
58  used += static_cast< std::size_t >(
59  reinterpret_cast< std::byte* >( p ) -
60  reinterpret_cast< std::byte* >( pool_p ) );
61  }
62 
63  if ( p == nullptr || used > PoolSize )
64  return nullptr;
65  free_.pop_back();
66  return p;
67  }
68 
69  [[nodiscard]] result
70  deallocate( void* const ptr, std::size_t const, std::size_t const ) override
71  {
72 
73  auto const pval = std::bit_cast< std::size_t >( ptr );
74  auto const bval = std::bit_cast< std::size_t >( &pools_ );
75 
76  std::size_t const spot_i = ( pval - bval ) / PoolSize;
77 
78  if ( spot_i >= PoolCount )
79  return result::ERROR;
80  free_.push_back( static_cast< uint16_t >( spot_i ) );
81  return result::SUCCESS;
82  }
83 
84  [[nodiscard]] bool is_equal( pmr::memory_resource const& other ) const noexcept override
85  {
86  return this == &other;
87  }
88 
89  [[nodiscard]] bool is_full() const noexcept override
90  {
91  return free_.empty();
92  }
93 
94  ~pool_resource() override = default;
95 
96 private:
97  using pool = std::array< std::byte, PoolSize >;
98 
100  std::array< pool, PoolCount > pools_;
101 };
102 
103 } // namespace emlabcpp::pmr
Definition: memory_resource.h:33
Definition: pool_resource.h:36
result deallocate(void *const ptr, std::size_t const, std::size_t const) override
Definition: pool_resource.h:70
bool is_equal(pmr::memory_resource const &other) const noexcept override
Definition: pool_resource.h:84
pool_resource()
Definition: pool_resource.h:38
pool_resource & operator=(pool_resource const &)=delete
pool_resource & operator=(pool_resource &&)=delete
pool_resource(pool_resource &&)=delete
~pool_resource() override=default
bool is_full() const noexcept override
Definition: pool_resource.h:89
pool_resource(pool_resource const &)=delete
void * allocate(std::size_t const bytes, std::size_t const alignment) override
Definition: pool_resource.h:50
MIT License.
Definition: aliases.h:36
void * align(void *const ptr, std::size_t const alignment)
TODO: this needs tests.
Definition: util.h:41
constexpr std::array< std::byte, N > bytes(Args const &... args)
Conveft the provided arguments into array of std::byte.
Definition: algorithm.h:524
constexpr view< iterators::numeric_iterator< Numeric > > range(Numeric from, Numeric to)
Builds numeric view over interval [from, to)
Definition: range.h:34
physical_quantity< 0, 0, 0, 0, 0, 0, 0, 0, 1 > byte
Definition: physical_quantity.h:118
result represents an result of some operation, as an alternative to returning just bool with true/fal...
Definition: result.h:42