40#ifndef GEOGRAM_BASIC_MEMORY
41#define GEOGRAM_BASIC_MEMORY
78#define GEO_HAS_BIG_STACK
93 typedef unsigned char byte;
120 inline void clear(
void* addr,
size_t size) {
121 ::memset(addr, 0, size);
133 inline void copy(
void* to,
const void* from,
size_t size) {
134 ::memcpy(to, from, size);
147 template <
class FPTR=function_po
inter>
152 ::memcpy(&result, &fptr,
sizeof(
pointer));
166 template <
class FPTR = function_po
inter>
170 FPTR result =
nullptr;
171 ::memcpy(&result, &ptr,
sizeof(
pointer));
185 template <
class FPTR = function_po
inter>
189 FPTR result =
nullptr;
190 ::memcpy(&result, &ptr,
sizeof(
pointer));
208 ::memcpy(&T_ptr, &ptr,
sizeof(
pointer));
227 ::memcpy(&T_ptr, &ptr,
sizeof(
pointer));
240#define GEO_MEMORY_ALIGNMENT 64
267 static const size_t value = 16;
276 static const size_t value = 8;
285 static const size_t value = 32;
294 static const size_t value = 16;
303 static const size_t value = 64;
314#define geo_dim_alignment(dim) GEO::Memory::PointAlignment<dim>::value
328#if defined(GEO_OS_ANDROID)
332#elif defined(GEO_COMPILER_INTEL)
333 return _mm_malloc(size, alignment);
334#elif defined(GEO_COMPILER_GCC) || defined(GEO_COMPILER_CLANG)
336 return posix_memalign(&result, alignment, size) == 0
338#elif defined(GEO_COMPILER_MSVC)
339 return _aligned_malloc(size, alignment);
354#if defined(GEO_OS_ANDROID)
357#elif defined(GEO_COMPILER_INTEL)
359#elif defined(GEO_COMPILER_GCC_FAMILY)
361#elif defined(GEO_COMPILER_MSVC)
381#if defined(GEO_OS_ANDROID)
382#define geo_decl_aligned(var) var
383#elif defined(GEO_COMPILER_INTEL)
384#define geo_decl_aligned(var) __declspec(aligned(GEO_MEMORY_ALIGNMENT)) var
385#elif defined(GEO_COMPILER_GCC_FAMILY)
386#define geo_decl_aligned(var) var __attribute__((aligned(GEO_MEMORY_ALIGNMENT)))
387#elif defined(GEO_COMPILER_MSVC)
388#define geo_decl_aligned(var) __declspec(align(GEO_MEMORY_ALIGNMENT)) var
389#elif defined(GEO_COMPILER_EMSCRIPTEN)
390#define geo_decl_aligned(var) var
409#if defined(GEO_OS_ANDROID)
410#define geo_assume_aligned(var, alignment)
411#elif defined(GEO_COMPILER_INTEL)
412#define geo_assume_aligned(var, alignment) \
413 __assume_aligned(var, alignment)
414#elif defined(GEO_COMPILER_CLANG)
415#define geo_assume_aligned(var, alignment)
417#elif defined(GEO_COMPILER_GCC)
418#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 7
419#define geo_assume_aligned(var, alignment) \
420 *(void**) (&var) = __builtin_assume_aligned(var, alignment)
426#define geo_assume_aligned(var, alignment)
428#elif defined(GEO_COMPILER_MSVC)
429#define geo_assume_aligned(var, alignment)
431#elif defined(GEO_COMPILER_EMSCRIPTEN)
432#define geo_assume_aligned(var, alignment)
433#elif defined(GEO_COMPILER_MINGW)
434#define geo_assume_aligned(var, alignment)
447#if defined(GEO_COMPILER_INTEL)
448#define geo_restrict __restrict
449#elif defined(GEO_COMPILER_GCC_FAMILY)
450#define geo_restrict __restrict__
451#elif defined(GEO_COMPILER_MSVC)
452#define geo_restrict __restrict
453#elif defined(GEO_COMPILER_EMSCRIPTEN)
467 return (
reinterpret_cast<size_t>(p) & (alignment - 1)) == 0;
478 return reinterpret_cast<char*
>(p) + offset;
490#define geo_aligned_alloca(size) \
491 GEO::Memory::align(alloca(size + GEO_MEMORY_ALIGNMENT - 1))
500 template <
class T,
int ALIGN = GEO_MEMORY_ALIGNMENT>
582 size_type nb_elt,
const void* hint =
nullptr
590 if(result !=
nullptr) {
602 std::new_handler handler = std::get_new_handler();
603 if(handler !=
nullptr) {
606 throw std::bad_alloc();
634 ::std::allocator<char> a;
635 return std::allocator_traits<
decltype(a)>
::max_size(a) /
673 template <
typename T1,
int A1,
typename T2,
int A2>
684 template <
typename T1,
int A1,
typename T2,
int A2>
703 class vector :
public ::std::vector<T, Memory::aligned_allocator<T> > {
712 typedef ::std::vector<T, Memory::aligned_allocator<T> > baseclass;
742 baseclass(
size, val) {
754 return index_t(baseclass::size());
764 return baseclass::operator[] (i);
775 return baseclass::operator[] (i);
785 return baseclass::operator[] (
index_t(i));
796 return baseclass::operator[] (
index_t(i));
809 return baseclass::operator[] (
index_t(i));
820 return baseclass::operator[] (
index_t(i));
830 return baseclass::operator[] (
index_t(i));
841 return baseclass::operator[] (
index_t(i));
850 T* result = baseclass::data();
864 const T* result = baseclass::data();
893 typedef ::std::vector<bool> baseclass;
908 baseclass(
size, val) {
917 return index_t(baseclass::size());
A function to suppress unused parameters compilation warnings.
Assertion checking mechanism.
#define geo_debug_assert(x)
Verifies that a condition is met.
An allocator that performs aligned memory allocations.
size_type max_size() const
Gets the maximum size possible to allocate.
T * pointer
Pointer to element.
const T & const_reference
Reference to constant element.
void destroy(pointer p)
Destroys an object.
const T * const_pointer
Pointer to constant element.
pointer address(reference x)
Gets the address of an object.
pointer allocate(size_type nb_elt, const void *hint=nullptr)
Allocates a block of storage.
T value_type
Element type.
static constexpr int ALIGNMENT
Alignment in bytes.
const_pointer address(const_reference x)
Gets the address of a object.
T & reference
Reference to element.
void construct(pointer p, const_reference val)
Constructs an object.
::std::size_t size_type
Quantities of elements.
void deallocate(pointer p, size_type nb_elt)
Releases a block of storage.
::std::ptrdiff_t difference_type
Difference between two pointers.
index_t size() const
Gets the number of elements.
vector(index_t size)
Creates a pre-allocated vector.
vector(index_t size, bool val)
Creates a pre-initialized vector.
vector()
Creates an empty vector.
Vector with aligned memory allocation.
void clear_and_deallocate()
Resizes this vector to zero and deallocated all the memory.
vector()
Creates an empty vector.
const T * data() const
Gets a pointer to the array of elements.
vector(index_t size, const T &val)
Creates a pre-initialized vector.
vector(index_t size)
Creates a pre-allocated vector.
T * data()
Gets a pointer to the array of elements.
T & operator[](index_t i)
Gets a vector element.
index_t size() const
Gets the number of elements.
Common include file, providing basic definitions. Should be included before anything else by all head...
#define GEO_MEMORY_ALIGNMENT
Default memory alignment for efficient vector operations.
void * aligned_malloc(size_t size, size_t alignment=GEO_MEMORY_ALIGNMENT)
Allocates aligned memory.
unsigned short word16
Unsigned 16 bits integer.
T & pointer_as_reference(void *ptr)
Converts a pointer to a reference.
unsigned char byte
Unsigned byte type.
void(* function_pointer)()
Generic function pointer.
void * align(void *p)
Returns the smallest aligned memory address from p.
void aligned_free(void *p)
Deallocates aligned memory.
unsigned int word32
Unsigned 32 bits integer.
byte * pointer
Pointer to unsigned byte(s)
unsigned char word8
Unsigned 8 bits integer.
void clear(void *addr, size_t size)
Clears a memory block.
FPTR generic_pointer_to_function_pointer(pointer ptr)
Converts a generic pointer to a function pointer.
const byte * const_pointer
Const pointer to unsigned byte(s)
bool is_aligned(void *p, size_t alignment=GEO_MEMORY_ALIGNMENT)
Checks whether a pointer is aligned.
bool operator!=(const aligned_allocator< T1, A1 > &, const aligned_allocator< T2, A2 > &)
Tests whether two aligned_allocators are different.
pointer function_pointer_to_generic_pointer(FPTR fptr)
Converts a function pointer to a generic pointer.
bool operator==(const aligned_allocator< T1, A1 > &, const aligned_allocator< T2, A2 > &)
Tests whether two aligned_allocators are equal.
void copy(void *to, const void *from, size_t size)
Copies a memory block.
Global Vorpaline namespace.
void geo_argused(const T &)
Suppresses compiler warnings about unused parameters.
geo_signed_index_t signed_index_t
The type for storing and manipulating indices differences.
geo_index_t index_t
The type for storing and manipulating indices.
Types and functions for numbers manipulation.
Functions for string manipulation.
Defines the memory alignment of points in a vector.
static const size_t value
Alignment value in bytes.
Defines the same allocator for other types.
aligned_allocator< U, ALIGN > other