stub_analytics_plugin  1.6
Network Optix Video Analytics SDK
utils.h
Go to the documentation of this file.
1 // Copyright 2018-present Network Optix, Inc.
2 #pragma once
3 
10 #include <cstring>
11 #include <cstdlib>
12 #include <memory>
13 
14 #if !defined(NX_KIT_API)
15  #define NX_KIT_API /*empty*/
16 #endif
17 
18 namespace nx {
19 namespace kit {
20 namespace utils {
21 
23 inline size_t alignUp(size_t val, size_t alignment)
24 {
25  const size_t remainder = val % alignment;
26  if (remainder == 0)
27  return val;
28  return val + (alignment - remainder);
29 }
30 
40 template<class MallocFunc>
41 void* mallocAligned(size_t size, size_t alignment, MallocFunc mallocFunc)
42 {
43  if (alignment == 0)
44  return 0;
45  void* ptr = mallocFunc(size + alignment + sizeof(alignment));
46  if (!ptr) //< allocation error
47  return ptr;
48 
49  void* aligned_ptr = (char*) ptr + sizeof(alignment); //< Leaving place to save unalignment.
50  const size_t unalignment = alignment - (((size_t) aligned_ptr) % alignment);
51  memcpy((char*) ptr+unalignment, &unalignment, sizeof(unalignment));
52  return (char*) aligned_ptr + unalignment;
53 }
54 
56 inline void* mallocAligned(size_t size, size_t alignment)
57 {
58  return mallocAligned<>(size, alignment, ::malloc);
59 }
60 
68 template<class FreeFunc>
69 void freeAligned(void* ptr, FreeFunc freeFunc)
70 {
71  if (!ptr)
72  return freeFunc(ptr);
73 
74  ptr = (char*) ptr - sizeof(size_t);
75  size_t unalignment = 0;
76  memcpy(&unalignment, ptr, sizeof(unalignment));
77  ptr = (char*) ptr - unalignment;
78 
79  freeFunc(ptr);
80 }
81 
83 inline void freeAligned(void* ptr)
84 {
85  return freeAligned<>(ptr, ::free);
86 }
87 
88 } // namespace utils
89 } // namespace kit
90 } // namespace nx
void * mallocAligned(size_t size, size_t alignment, MallocFunc mallocFunc)
Definition: utils.h:41
Definition: debug.cpp:14
void freeAligned(void *ptr, FreeFunc freeFunc)
Definition: utils.h:69
size_t alignUp(size_t val, size_t alignment)
Definition: utils.h:23