g2o
Loading...
Searching...
No Matches
dynamic_aligned_buffer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4
5#include "Eigen/Core"
6
7namespace g2o {
8// 16 byte aligned allocation functions
9template <typename Type>
10Type* allocate_aligned(size_t n) {
11 return (Type*)Eigen::internal::aligned_malloc(n * sizeof(Type));
12}
13
14template <typename Type>
15Type* reallocate_aligned(Type* ptr, size_t newSize, size_t oldSize) {
16 return (Type*)Eigen::internal::aligned_realloc(ptr, newSize * sizeof(Type),
17 oldSize * sizeof(Type));
18}
19
20template <typename Type>
21void free_aligned(Type* block) {
22 Eigen::internal::aligned_free(block);
23}
24
25template <typename Type>
27 explicit dynamic_aligned_buffer(size_t size) : m_size{0}, m_ptr{nullptr} {
28 allocate(size);
29 }
30
32
33 Type* request(size_t n) {
34 if (n <= m_size) return m_ptr;
35
36 m_ptr = reallocate_aligned<Type>(m_ptr, n, m_size);
37 m_size = m_ptr ? n : 0;
38
39 return m_ptr;
40 }
41
42 private:
43 void allocate(size_t size) {
44 m_ptr = allocate_aligned<Type>(size);
45 if (m_ptr != nullptr) m_size = size;
46 }
47
48 void free() {
49 if (m_ptr != nullptr) {
50 free_aligned<Type>(m_ptr);
51 m_size = 0;
52 m_ptr = nullptr;
53 }
54 }
55
56 std::size_t m_size;
57 Type* m_ptr;
58};
59
60template <typename T>
62 void operator()(T* block) { free_aligned(block); }
63};
64} // namespace g2o
Type * allocate_aligned(size_t n)
Type * reallocate_aligned(Type *ptr, size_t newSize, size_t oldSize)
void free_aligned(Type *block)