blob: 42a6daaef6d55eefe96cc803cb2ae0ebb7511bca [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:251/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Karl Wiberg29e7bee2018-03-22 13:11:5211#ifndef RTC_BASE_MEMORY_ALIGNED_MALLOC_H_
12#define RTC_BASE_MEMORY_ALIGNED_MALLOC_H_
niklase@google.com470e71d2011-07-07 08:21:2513
henrike@webrtc.orgcd9adf72012-09-29 03:49:3614// The functions declared here
15// 1) Allocates block of aligned memory.
16// 2) Re-calculates a pointer such that it is aligned to a higher or equal
17// address.
18// Note: alignment must be a power of two. The alignment is in bytes.
19
niklase@google.com470e71d2011-07-07 08:21:2520#include <stddef.h>
21
henrike@webrtc.orgcd9adf72012-09-29 03:49:3622namespace webrtc {
23
24// Returns a pointer to the first boundry of |alignment| bytes following the
25// address of |ptr|.
26// Note that there is no guarantee that the memory in question is available.
27// |ptr| has no requirements other than it can't be NULL.
28void* GetRightAlign(const void* ptr, size_t alignment);
29
30// Allocates memory of |size| bytes aligned on an |alignment| boundry.
31// The return value is a pointer to the memory. Note that the memory must
32// be de-allocated using AlignedFree.
33void* AlignedMalloc(size_t size, size_t alignment);
34// De-allocates memory created using the AlignedMalloc() API.
henrike@webrtc.org46d40732012-10-03 16:50:3735void AlignedFree(void* mem_block);
36
37// Templated versions to facilitate usage of aligned malloc without casting
38// to and from void*.
Karl Wiberg79eb1d92017-11-08 11:26:0739template <typename T>
henrike@webrtc.org46d40732012-10-03 16:50:3740T* GetRightAlign(const T* ptr, size_t alignment) {
Karl Wiberg79eb1d92017-11-08 11:26:0741 return reinterpret_cast<T*>(
42 GetRightAlign(reinterpret_cast<const void*>(ptr), alignment));
henrike@webrtc.org46d40732012-10-03 16:50:3743}
Karl Wiberg79eb1d92017-11-08 11:26:0744template <typename T>
henrike@webrtc.org46d40732012-10-03 16:50:3745T* AlignedMalloc(size_t size, size_t alignment) {
46 return reinterpret_cast<T*>(AlignedMalloc(size, alignment));
47}
henrike@webrtc.orgcd9adf72012-09-29 03:49:3648
kwibergbfefb032016-05-01 21:53:4649// Deleter for use with unique_ptr. E.g., use as
50// std::unique_ptr<Foo, AlignedFreeDeleter> foo;
andrew@webrtc.orgd617a442014-02-20 21:08:3651struct AlignedFreeDeleter {
Karl Wiberg79eb1d92017-11-08 11:26:0752 inline void operator()(void* ptr) const { AlignedFree(ptr); }
henrike@webrtc.orgcd9adf72012-09-29 03:49:3653};
54
55} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:2556
Karl Wiberg29e7bee2018-03-22 13:11:5257#endif // RTC_BASE_MEMORY_ALIGNED_MALLOC_H_