emlabcpp
modern opinionated embedded C++ library
memory_promise.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "../../pmr/memory_resource.h"
27 #include "../../pmr/throw_bad_alloc.h"
28 
29 namespace emlabcpp::coro
30 {
31 
32 template < typename PromiseType >
34 {
35  static constexpr std::size_t ptr_size = sizeof( pmr::memory_resource* );
36 
37  void*
38  operator new( std::size_t const sz, auto&, pmr::memory_resource& pi, auto&&... ) noexcept
39  {
40  return alloc( sz, pi );
41  }
42 
43  void* operator new( std::size_t const sz, pmr::memory_resource& pi, auto&&... ) noexcept
44  {
45  return alloc( sz, pi );
46  }
47 
48  void* operator new( std::size_t const sz, auto&&... ) noexcept = delete;
49 
50  static void* alloc( std::size_t sz, pmr::memory_resource& pi )
51  {
52  sz += ptr_size;
53  void* const vp = pi.allocate( sz, alignof( PromiseType ) );
54 
55  auto p = reinterpret_cast< pmr::memory_resource** >( vp );
56 
57  *p = &pi;
58 
59  p++;
60 
61  return static_cast< void* >( p );
62  }
63 
64  void operator delete( void* const ptr, std::size_t const size )
65  {
66  auto p = reinterpret_cast< pmr::memory_resource** >( ptr );
67 
68  p--;
69 
70  result const res = ( *p )->deallocate(
71  static_cast< void* >( p ), size + ptr_size, alignof( PromiseType ) );
72  if ( res == result::ERROR )
74  }
75 };
76 } // namespace emlabcpp::coro
Definition: memory_resource.h:33
MIT License.
Definition: data_promise.h:27
void throw_bad_alloc()
Definition: throw_bad_alloc.h:32
constexpr angle pi
Constants of units that are relevant for us.
Definition: physical_quantity.h:134
T res
Definition: algorithm.h:505
Definition: memory_promise.h:34
static constexpr std::size_t ptr_size
Definition: memory_promise.h:35
static void * alloc(std::size_t sz, pmr::memory_resource &pi)
Definition: memory_promise.h:50
result represents an result of some operation, as an alternative to returning just bool with true/fal...
Definition: result.h:42