40#ifndef GEOGRAM_BASIC_MEMORY
41#define GEOGRAM_BASIC_MEMORY
77#define GEO_HAS_BIG_STACK
92 typedef unsigned char byte;
119 inline void clear(
void* addr,
size_t size) {
120 ::memset(addr, 0, size);
132 inline void copy(
void* to,
const void* from,
size_t size) {
133 ::memcpy(to, from, size);
146 template <
class FPTR=function_po
inter>
151 ::memcpy(&result, &fptr,
sizeof(
pointer));
165 template <
class FPTR = function_po
inter>
169 FPTR result =
nullptr;
170 ::memcpy(&result, &ptr,
sizeof(
pointer));
184 template <
class FPTR = function_po
inter>
188 FPTR result =
nullptr;
189 ::memcpy(&result, &ptr,
sizeof(
pointer));
207 ::memcpy(&T_ptr, &ptr,
sizeof(
pointer));
226 ::memcpy(&T_ptr, &ptr,
sizeof(
pointer));
239#define GEO_MEMORY_ALIGNMENT 64
266 static const size_t value = 16;
275 static const size_t value = 8;
284 static const size_t value = 32;
293 static const size_t value = 16;
302 static const size_t value = 64;
313#define geo_dim_alignment(dim) GEO::Memory::PointAlignment<dim>::value
327#if defined(GEO_OS_ANDROID)
331#elif defined(GEO_COMPILER_INTEL)
332 return _mm_malloc(size, alignment);
333#elif defined(GEO_COMPILER_GCC) || defined(GEO_COMPILER_CLANG)
335 return posix_memalign(&result, alignment, size) == 0
337#elif defined(GEO_COMPILER_MSVC)
338 return _aligned_malloc(size, alignment);
353#if defined(GEO_OS_ANDROID)
356#elif defined(GEO_COMPILER_INTEL)
358#elif defined(GEO_COMPILER_GCC_FAMILY)
360#elif defined(GEO_COMPILER_MSVC)
380#if defined(GEO_OS_ANDROID)
381#define geo_decl_aligned(var) var
382#elif defined(GEO_COMPILER_INTEL)
383#define geo_decl_aligned(var) __declspec(aligned(GEO_MEMORY_ALIGNMENT)) var
384#elif defined(GEO_COMPILER_GCC_FAMILY)
385#define geo_decl_aligned(var) var __attribute__((aligned(GEO_MEMORY_ALIGNMENT)))
386#elif defined(GEO_COMPILER_MSVC)
387#define geo_decl_aligned(var) __declspec(align(GEO_MEMORY_ALIGNMENT)) var
388#elif defined(GEO_COMPILER_EMSCRIPTEN)
389#define geo_decl_aligned(var) var
408#if defined(GEO_OS_ANDROID)
409#define geo_assume_aligned(var, alignment)
410#elif defined(GEO_COMPILER_INTEL)
411#define geo_assume_aligned(var, alignment) \
412 __assume_aligned(var, alignment)
413#elif defined(GEO_COMPILER_CLANG)
414#define geo_assume_aligned(var, alignment)
416#elif defined(GEO_COMPILER_GCC)
417#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 7
418#define geo_assume_aligned(var, alignment) \
419 *(void**) (&var) = __builtin_assume_aligned(var, alignment)
425#define geo_assume_aligned(var, alignment)
427#elif defined(GEO_COMPILER_MSVC)
428#define geo_assume_aligned(var, alignment)
430#elif defined(GEO_COMPILER_EMSCRIPTEN)
431#define geo_assume_aligned(var, alignment)
432#elif defined(GEO_COMPILER_MINGW)
433#define geo_assume_aligned(var, alignment)
446#if defined(GEO_COMPILER_INTEL)
447#define geo_restrict __restrict
448#elif defined(GEO_COMPILER_GCC_FAMILY)
449#define geo_restrict __restrict__
450#elif defined(GEO_COMPILER_MSVC)
451#define geo_restrict __restrict
452#elif defined(GEO_COMPILER_EMSCRIPTEN)
466 return (
reinterpret_cast<size_t>(p) & (alignment - 1)) == 0;
477 return reinterpret_cast<char*
>(p) + offset;
489#define geo_aligned_alloca(size) \
490 GEO::Memory::align(alloca(size + GEO_MEMORY_ALIGNMENT - 1))
499 template <
class T,
int ALIGN = GEO_MEMORY_ALIGNMENT>
581 size_type nb_elt,
const void* hint =
nullptr
589 if(result !=
nullptr) {
601 std::new_handler handler = std::get_new_handler();
602 if(handler !=
nullptr) {
605 throw std::bad_alloc();
633 ::std::allocator<char> a;
634 return std::allocator_traits<
decltype(a)>
::max_size(a) /
680 template <
typename T1,
int A1,
typename T2,
int A2>
691 template <
typename T1,
int A1,
typename T2,
int A2>
710 class vector :
public ::std::vector<T, Memory::aligned_allocator<T> > {
719 typedef ::std::vector<T, Memory::aligned_allocator<T> > baseclass;
749 baseclass(
size, val) {
761 return index_t(baseclass::size());
771 return baseclass::operator[] (i);
782 return baseclass::operator[] (i);
792 return baseclass::operator[] (
index_t(i));
803 return baseclass::operator[] (
index_t(i));
816 return baseclass::operator[] (
index_t(i));
827 return baseclass::operator[] (
index_t(i));
837 return baseclass::operator[] (
index_t(i));
848 return baseclass::operator[] (
index_t(i));
857 T* result = baseclass::data();
871 const T* result = baseclass::data();
899 class vector<bool> :
public ::std::vector<bool> {
900 typedef ::std::vector<bool> baseclass;
915 baseclass(
size, val) {
924 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.
#define geo_assume_aligned(var, alignment)
Informs the compiler that a given pointer is memory-aligned.
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