28inline void zeromem (
void* memory,
size_t numBytes)
noexcept { memset (memory, 0, numBytes); }
31template <
typename Type>
32inline void zerostruct (Type& structure)
noexcept { memset ((
void*) &structure, 0,
sizeof (structure)); }
39template <
typename Type>
40inline void deleteAndZero (Type& pointer) {
delete pointer; pointer =
nullptr; }
44template <
typename Type,
typename IntegerType>
45inline Type* snapPointerToAlignment (Type* basePointer, IntegerType alignmentBytes)
noexcept
47 return (Type*) ((((size_t) basePointer) + (alignmentBytes - 1)) & ~(alignmentBytes - 1));
53template <
typename Type1,
typename Type2>
54inline int getAddressDifference (Type1* pointer1, Type2* pointer2)
noexcept {
return (
int) (((
const char*) pointer1) - (
const char*) pointer2); }
60inline Type* createCopyIfNotNull (
const Type* objectToCopy) {
return objectToCopy !=
nullptr ?
new Type (*objectToCopy) : nullptr; }
64template <
typename Type>
65inline Type readUnaligned (
const void* srcPtr)
noexcept
68 memcpy (&value, srcPtr,
sizeof (Type));
73template <
typename Type>
74inline void writeUnaligned (
void* dstPtr, Type value)
noexcept
76 memcpy (dstPtr, &value,
sizeof (Type));
87template <
typename Type>
88inline Type unalignedPointerCast (
void* ptr)
noexcept
90 static_assert (std::is_pointer_v<Type>);
91 return reinterpret_cast<Type
> (ptr);
101template <
typename Type>
102inline Type unalignedPointerCast (
const void* ptr)
noexcept
104 static_assert (std::is_pointer_v<Type>);
105 return reinterpret_cast<Type
> (ptr);
112template <
typename Type,
typename IntegerType>
113inline Type* addBytesToPointer (Type* basePointer, IntegerType bytes)
noexcept
115 return unalignedPointerCast<Type*> (
reinterpret_cast<char*
> (basePointer) + bytes);
122template <
typename Type,
typename IntegerType>
123inline const Type* addBytesToPointer (
const Type* basePointer, IntegerType bytes)
noexcept
125 return unalignedPointerCast<const Type*> (
reinterpret_cast<const char*
> (basePointer) + bytes);
129#if JUCE_MAC || JUCE_IOS || DOXYGEN
136 class JUCE_API ScopedAutoReleasePool
139 ScopedAutoReleasePool();
140 ~ScopedAutoReleasePool();
145 JUCE_DECLARE_NON_COPYABLE (ScopedAutoReleasePool)
153#if (JUCE_COMPILER_SUPPORTS_ARC && defined (__OBJC__)) || DOXYGEN
154 #define JUCE_AUTORELEASEPOOL @autoreleasepool
156 #define JUCE_AUTORELEASEPOOL const juce::ScopedAutoReleasePool JUCE_JOIN_MACRO (autoReleasePool_, __LINE__);
160 #define JUCE_AUTORELEASEPOOL
169#if JUCE_MSVC && (defined (JUCE_DLL) || defined (JUCE_DLL_BUILD)) && ! (JUCE_DISABLE_DLL_ALLOCATORS || DOXYGEN)
170 extern JUCE_API
void* juceDLL_malloc (
size_t);
171 extern JUCE_API
void juceDLL_free (
void*);
173 #define JUCE_LEAK_DETECTOR(OwnerClass) public:\
174 static void* operator new (size_t sz) { return juce::juceDLL_malloc (sz); } \
175 static void* operator new (size_t, void* p) { return p; } \
176 static void operator delete (void* p) { juce::juceDLL_free (p); } \
177 static void operator delete (void*, void*) {}
184#ifndef juce_UseDebuggingNewOperator
185 #define juce_UseDebuggingNewOperator
197std::unique_ptr<T> rawToUniquePtr (T* ptr)
199 return std::unique_ptr<T> (ptr);