45#if (defined WIN32) || (defined _WIN32) || (defined _WIN64)
46#define OJPH_OS_WINDOWS
47#elif (defined __APPLE__)
49#elif (defined __ANDROID__)
50#define OJPH_OS_ANDROID
51#elif (defined __linux)
58#if defined(OJPH_OS_WINDOWS) && defined(OJPH_BUILD_SHARED_LIBRARY)
59#define OJPH_EXPORT __declspec(dllexport)
68 assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
69 return _aligned_malloc(size, alignment);
74 _aligned_free(pointer);
76#elif (defined OJPH_ALIGNED_ALLOC_EXISTS)
79 assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
80 return aligned_alloc(alignment, size);
87#elif (defined OJPH_POSIX_MEMALIGN_EXISTS)
90 assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
92 int e = posix_memalign(&p, alignment, size);
93 return (e ? NULL : p);
103 assert(alignment != 0 && (alignment & (alignment - 1)) == 0);
106 void* orig_ptr = malloc(size + alignment +
sizeof(
void*));
107 if (orig_ptr == NULL)
110 uintptr_t start_of_mem = (uintptr_t)orig_ptr +
sizeof(
void*);
111 uintptr_t aligned_addr = (start_of_mem + alignment - 1) & ~(alignment - 1);
113 void** ptr_to_orig_ptr = (
void**)aligned_addr;
114 ptr_to_orig_ptr[-1] = orig_ptr;
116 return (
void*)aligned_addr;
123 void** ptr_to_orig_ptr = (
void**)pointer;
124 void* orig_ptr = ptr_to_orig_ptr[-1];
void * ojph_aligned_malloc(size_t alignment, size_t size)
void ojph_aligned_free(void *pointer)