1 #ifndef NDNPH_CORE_REGION_HPP
2 #define NDNPH_CORE_REGION_HPP
20 explicit Region(uint8_t* buf,
size_t cap)
37 uint8_t* room = alignUp(m_left);
38 if (m_right - room <
static_cast<ssize_t
>(
size)) {
51 bool free(
const uint8_t* first,
const uint8_t* last) {
52 if (first == m_right && last <= m_end) {
53 m_right =
const_cast<uint8_t*
>(last);
56 if (last == m_left && first >= m_begin) {
57 m_left =
const_cast<uint8_t*
>(first);
68 template<
typename T,
typename... Arg>
72 static_assert(std::is_trivially_destructible<T>::value,
"");
74 uint8_t* ptr = this->
allocA(
sizeof(T));
78 return new (ptr) T(std::forward<Arg>(arg)...);
89 template<
typename RefType,
typename... Arg>
91 using ObjType =
typename RefType::ObjType;
92 auto obj = make<ObjType>(*
this, std::forward<Arg>(arg)...);
93 return obj ==
nullptr ? RefType() : RefType(obj);
107 return m_right - m_left;
112 return std::max<ssize_t>(0, m_right - alignUp(m_left));
126 static uint8_t* alignUp(uint8_t* ptr) {
127 return reinterpret_cast<uint8_t*
>(
128 sizeofAligned(
reinterpret_cast<uintptr_t
>(
reinterpret_cast<void*
>(ptr))));
132 uint8_t*
const m_begin;
133 uint8_t*
const m_end;
146 :
Region(m_array, sizeof(m_array)) {}
158 :
Region(new uint8_t[capacity], capacity) {}
174 uint8_t* room = parent.
allocA(capacity);
175 if (room ==
nullptr) {
209 template<
typename Obj>
213 static_assert(std::is_base_of<InRegion, ObjType>::value,
"");
218 explicit operator bool()
const {
219 return obj !=
nullptr;
Region with dynamically allocated memory.
Definition: region.hpp:155
DynamicRegion(size_t capacity)
Definition: region.hpp:157
~DynamicRegion()
Definition: region.hpp:160
Base class of an object allocated in a Region.
Definition: region.hpp:202
InRegion(Region ®ion)
Definition: region.hpp:204
Base class of an object referencing an InRegion object.
Definition: region.hpp:210
Obj ObjType
Definition: region.hpp:212
ObjType * obj
Definition: region.hpp:226
friend Region & regionOf(const RefRegion< Obj > &ref)
Definition: region.hpp:228
RefRegion(ObjType *obj=nullptr)
Definition: region.hpp:215
Region-based memory allocator thats owns memory of NDNph objects.
Definition: region.hpp:9
size_t available() const
Compute remaining space for alloc().
Definition: region.hpp:106
RefType create(Arg &&... arg)
Allocate and create an object, and return its reference.
Definition: region.hpp:90
size_t availableA() const
Compute remaining space for allocA().
Definition: region.hpp:111
static constexpr T sizeofAligned(T size)
Definition: region.hpp:16
T * make(Arg &&... arg)
Allocate and create an item, and return its pointer.
Definition: region.hpp:69
bool free(const uint8_t *ptr, size_t size)
Definition: region.hpp:63
uint8_t * allocA(size_t size)
Allocate a region aligned to multiple of sizeof(void*).
Definition: region.hpp:36
size_t size() const
Compute utilized space.
Definition: region.hpp:116
uint8_t * alloc(size_t size)
Allocate a buffer with no alignment requirement.
Definition: region.hpp:27
Region(uint8_t *buf, size_t cap)
Definition: region.hpp:20
void reset()
Discard allocated items.
Definition: region.hpp:100
@ ALIGNMENT
Definition: region.hpp:12
uint8_t * getArray()
Definition: region.hpp:121
bool free(const uint8_t *first, const uint8_t *last)
Deallocate (part of) last allocated buffer.
Definition: region.hpp:51
Region with statically allocated memory.
Definition: region.hpp:143
StaticRegion()
Definition: region.hpp:145
Base class of an object associated with a Region.
Definition: region.hpp:182
WithRegion(WithRegion &&)=default
WithRegion & operator=(const WithRegion &)=delete
Region & region
Definition: region.hpp:194
WithRegion(const WithRegion &)=delete
WithRegion(Region ®ion)
Definition: region.hpp:187
friend Region & regionOf(const WithRegion *obj)
Definition: region.hpp:196
constexpr size_t sizeofSubRegions(size_t capacity, size_t count=1)
Compute total size of several sub Regions of given capacity.
Definition: region.hpp:167
Region * makeSubRegion(Region &parent, size_t capacity)
Create Region inside a parent Region.
Definition: region.hpp:173