xref: /aosp_15_r20/external/executorch/test/utils/alignment.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker  * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker  *
5*523fa7a6SAndroid Build Coastguard Worker  * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker  * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker  */
8*523fa7a6SAndroid Build Coastguard Worker 
9*523fa7a6SAndroid Build Coastguard Worker #pragma once
10*523fa7a6SAndroid Build Coastguard Worker 
11*523fa7a6SAndroid Build Coastguard Worker #include <cinttypes>
12*523fa7a6SAndroid Build Coastguard Worker 
13*523fa7a6SAndroid Build Coastguard Worker #include <gmock/gmock.h> // For MATCHER_P
14*523fa7a6SAndroid Build Coastguard Worker 
15*523fa7a6SAndroid Build Coastguard Worker namespace executorch {
16*523fa7a6SAndroid Build Coastguard Worker namespace runtime {
17*523fa7a6SAndroid Build Coastguard Worker namespace testing {
18*523fa7a6SAndroid Build Coastguard Worker 
19*523fa7a6SAndroid Build Coastguard Worker /**
20*523fa7a6SAndroid Build Coastguard Worker  * Returns true if the address of `ptr` is a whole multiple of `alignment`.
21*523fa7a6SAndroid Build Coastguard Worker  */
is_aligned(const void * ptr,size_t alignment)22*523fa7a6SAndroid Build Coastguard Worker inline bool is_aligned(const void* ptr, size_t alignment) {
23*523fa7a6SAndroid Build Coastguard Worker   auto addr = reinterpret_cast<uintptr_t>(ptr);
24*523fa7a6SAndroid Build Coastguard Worker   return addr % alignment == 0;
25*523fa7a6SAndroid Build Coastguard Worker }
26*523fa7a6SAndroid Build Coastguard Worker 
27*523fa7a6SAndroid Build Coastguard Worker /**
28*523fa7a6SAndroid Build Coastguard Worker  * Lets gtest users write `EXPECT_THAT(ptr, IsAlignedTo(alignment))` or
29*523fa7a6SAndroid Build Coastguard Worker  * `EXPECT_THAT(ptr, Not(IsAlignedTo(alignment)))`.
30*523fa7a6SAndroid Build Coastguard Worker  *
31*523fa7a6SAndroid Build Coastguard Worker  * See also `EXPECT_ALIGNED()`.
32*523fa7a6SAndroid Build Coastguard Worker  */
33*523fa7a6SAndroid Build Coastguard Worker MATCHER_P(IsAlignedTo, other, "") {
34*523fa7a6SAndroid Build Coastguard Worker   return is_aligned(arg, other);
35*523fa7a6SAndroid Build Coastguard Worker }
36*523fa7a6SAndroid Build Coastguard Worker 
37*523fa7a6SAndroid Build Coastguard Worker /*
38*523fa7a6SAndroid Build Coastguard Worker  * Helpers for checking the alignment of a pointer.
39*523fa7a6SAndroid Build Coastguard Worker  */
40*523fa7a6SAndroid Build Coastguard Worker 
41*523fa7a6SAndroid Build Coastguard Worker #define EXPECT_ALIGNED(ptr, alignment) \
42*523fa7a6SAndroid Build Coastguard Worker   EXPECT_THAT((ptr), executorch::runtime::testing::IsAlignedTo((alignment)))
43*523fa7a6SAndroid Build Coastguard Worker #define ASSERT_ALIGNED(ptr, alignment) \
44*523fa7a6SAndroid Build Coastguard Worker   ASSERT_THAT((ptr), executorch::runtime::testing::IsAlignedTo((alignment)))
45*523fa7a6SAndroid Build Coastguard Worker 
46*523fa7a6SAndroid Build Coastguard Worker } // namespace testing
47*523fa7a6SAndroid Build Coastguard Worker } // namespace runtime
48*523fa7a6SAndroid Build Coastguard Worker } // namespace executorch
49