xref: /aosp_15_r20/external/emboss/compiler/back_end/cpp/testcode/alignments_test.cc (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Tests that generated code properly preserves and propagates alignment
16 // information.
17 #include <stdint.h>
18 
19 #include <vector>
20 
21 #include "gtest/gtest.h"
22 #include "runtime/cpp/emboss_cpp_util.h"
23 #include "testdata/alignments.emb.h"
24 
25 namespace emboss {
26 namespace test {
27 namespace {
28 
29 using ::emboss::support::ContiguousBuffer;
30 
TEST(AlignmentsTest,DirectFieldAlignments)31 TEST(AlignmentsTest, DirectFieldAlignments) {
32   auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
33   EXPECT_TRUE(
34       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
35                       decltype(unaligned_view.zero_offset())>::value));
36   EXPECT_TRUE(
37       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
38                       decltype(unaligned_view.four_offset())>::value));
39   EXPECT_TRUE(
40       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
41                       decltype(unaligned_view.twelve_offset())>::value));
42   EXPECT_TRUE(
43       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
44                       decltype(unaligned_view.three_offset())>::value));
45   EXPECT_TRUE(
46       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
47                       decltype(unaligned_view.eleven_offset())>::value));
48 
49   auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
50   EXPECT_TRUE(
51       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
52                       decltype(four_aligned_view.zero_offset())>::value));
53   EXPECT_TRUE(
54       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
55                       decltype(four_aligned_view.four_offset())>::value));
56   EXPECT_TRUE(
57       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
58                       decltype(four_aligned_view.twelve_offset())>::value));
59   EXPECT_TRUE(
60       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
61                       decltype(four_aligned_view.three_offset())>::value));
62   EXPECT_TRUE(
63       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
64                       decltype(four_aligned_view.eleven_offset())>::value));
65 
66   auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
67   EXPECT_TRUE(
68       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 0>>,
69                       decltype(eight_aligned_view.zero_offset())>::value));
70   EXPECT_TRUE(
71       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
72                       decltype(eight_aligned_view.four_offset())>::value));
73   EXPECT_TRUE(
74       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
75                       decltype(eight_aligned_view.twelve_offset())>::value));
76   EXPECT_TRUE(
77       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 3>>,
78                       decltype(eight_aligned_view.three_offset())>::value));
79   EXPECT_TRUE(
80       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 3>>,
81                       decltype(eight_aligned_view.eleven_offset())>::value));
82 }
83 
TEST(AlignmentsTest,AlignmentReductionAssignment)84 TEST(AlignmentsTest, AlignmentReductionAssignment) {
85   alignas(4) unsigned char data[4];
86   auto four_aligned_view = MakeAlignedAlignmentsView<unsigned char, 4>(data, 4);
87   {
88     // Implicit construction.
89     AlignmentsView unaligned_view{four_aligned_view};
90     EXPECT_EQ(data, unaligned_view.BackingStorage().data());
91   }
92   {
93     // Implicit conversion during assignment.
94     AlignmentsView unaligned_view;
95     unaligned_view = four_aligned_view;
96     EXPECT_EQ(data, unaligned_view.BackingStorage().data());
97   }
98 }
99 
TEST(AlignmentsTest,ArrayFieldAlignments)100 TEST(AlignmentsTest, ArrayFieldAlignments) {
101   auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
102   EXPECT_TRUE(
103       (::std::is_same<
104           GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
105           decltype(unaligned_view.zero_offset_four_stride_array()[0])>::value));
106   EXPECT_TRUE(
107       (::std::is_same<
108           GenericPlaceholder6View<ContiguousBuffer<char, 1, 0>>,
109           decltype(unaligned_view.zero_offset_six_stride_array()[0])>::value));
110   EXPECT_TRUE(
111       (::std::is_same<
112           GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
113           decltype(
114               unaligned_view.three_offset_four_stride_array()[0])>::value));
115   EXPECT_TRUE(
116       (::std::is_same<
117           GenericPlaceholder6View<ContiguousBuffer<char, 1, 0>>,
118           decltype(unaligned_view.four_offset_six_stride_array()[0])>::value));
119 
120   auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
121   EXPECT_TRUE(
122       (::std::is_same<
123           GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
124           decltype(
125               four_aligned_view.zero_offset_four_stride_array()[0])>::value));
126   EXPECT_TRUE((
127       ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
128                      decltype(four_aligned_view
129                                   .zero_offset_six_stride_array()[0])>::value));
130   EXPECT_TRUE(
131       (::std::is_same<
132           GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
133           decltype(
134               four_aligned_view.three_offset_four_stride_array()[0])>::value));
135   EXPECT_TRUE((
136       ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
137                      decltype(four_aligned_view
138                                   .four_offset_six_stride_array()[0])>::value));
139 
140   auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
141   EXPECT_TRUE(
142       (::std::is_same<
143           GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
144           decltype(
145               eight_aligned_view.zero_offset_four_stride_array()[0])>::value));
146   EXPECT_TRUE((
147       ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
148                      decltype(eight_aligned_view
149                                   .zero_offset_six_stride_array()[0])>::value));
150   EXPECT_TRUE(
151       (::std::is_same<
152           GenericPlaceholder4View<ContiguousBuffer<char, 4, 3>>,
153           decltype(
154               eight_aligned_view.three_offset_four_stride_array()[0])>::value));
155   EXPECT_TRUE((
156       ::std::is_same<GenericPlaceholder6View<ContiguousBuffer<char, 2, 0>>,
157                      decltype(eight_aligned_view
158                                   .four_offset_six_stride_array()[0])>::value));
159 }
160 
TEST(AlignmentsTest,SubFieldAlignments)161 TEST(AlignmentsTest, SubFieldAlignments) {
162   auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
163   EXPECT_TRUE(
164       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
165                       decltype(unaligned_view.zero_offset_substructure()
166                                    .zero_offset())>::value));
167   EXPECT_TRUE(
168       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
169                       decltype(unaligned_view.zero_offset_substructure()
170                                    .two_offset())>::value));
171   EXPECT_TRUE(
172       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
173                       decltype(unaligned_view.two_offset_substructure()
174                                    .zero_offset())>::value));
175   EXPECT_TRUE(
176       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
177                       decltype(unaligned_view.two_offset_substructure()
178                                    .two_offset())>::value));
179 
180   auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
181   EXPECT_TRUE(
182       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
183                       decltype(four_aligned_view.zero_offset_substructure()
184                                    .zero_offset())>::value));
185   EXPECT_TRUE(
186       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 2>>,
187                       decltype(four_aligned_view.zero_offset_substructure()
188                                    .two_offset())>::value));
189   EXPECT_TRUE(
190       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 2>>,
191                       decltype(four_aligned_view.two_offset_substructure()
192                                    .zero_offset())>::value));
193   EXPECT_TRUE(
194       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 4, 0>>,
195                       decltype(four_aligned_view.two_offset_substructure()
196                                    .two_offset())>::value));
197 
198   auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
199   EXPECT_TRUE(
200       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 0>>,
201                       decltype(eight_aligned_view.zero_offset_substructure()
202                                    .zero_offset())>::value));
203   EXPECT_TRUE(
204       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 2>>,
205                       decltype(eight_aligned_view.zero_offset_substructure()
206                                    .two_offset())>::value));
207   EXPECT_TRUE(
208       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 2>>,
209                       decltype(eight_aligned_view.two_offset_substructure()
210                                    .zero_offset())>::value));
211   EXPECT_TRUE(
212       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 8, 4>>,
213                       decltype(eight_aligned_view.two_offset_substructure()
214                                    .two_offset())>::value));
215 }
216 
TEST(AlignmentsTest,ArraySubFieldAlignments)217 TEST(AlignmentsTest, ArraySubFieldAlignments) {
218   auto unaligned_view = MakeAlignmentsView<char>(nullptr, 0);
219   EXPECT_TRUE(
220       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
221                       decltype(unaligned_view.zero_offset_six_stride_array()[0]
222                                    .zero_offset())>::value));
223   EXPECT_TRUE(
224       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
225                       decltype(unaligned_view.zero_offset_six_stride_array()[0]
226                                    .two_offset())>::value));
227   EXPECT_TRUE(
228       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
229                       decltype(unaligned_view.four_offset_six_stride_array()[0]
230                                    .zero_offset())>::value));
231   EXPECT_TRUE(
232       (::std::is_same<GenericPlaceholder4View<ContiguousBuffer<char, 1, 0>>,
233                       decltype(unaligned_view.four_offset_six_stride_array()[0]
234                                    .two_offset())>::value));
235 
236   auto four_aligned_view = MakeAlignedAlignmentsView<char, 4>(nullptr, 0);
237   EXPECT_TRUE((::std::is_same<
238                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
239                decltype(four_aligned_view.zero_offset_six_stride_array()[0]
240                             .zero_offset())>::value));
241   EXPECT_TRUE((::std::is_same<
242                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
243                decltype(four_aligned_view.zero_offset_six_stride_array()[0]
244                             .two_offset())>::value));
245   EXPECT_TRUE((::std::is_same<
246                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
247                decltype(four_aligned_view.four_offset_six_stride_array()[0]
248                             .zero_offset())>::value));
249   EXPECT_TRUE((::std::is_same<
250                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
251                decltype(four_aligned_view.four_offset_six_stride_array()[0]
252                             .two_offset())>::value));
253 
254   auto eight_aligned_view = MakeAlignedAlignmentsView<char, 8>(nullptr, 0);
255   EXPECT_TRUE((::std::is_same<
256                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
257                decltype(eight_aligned_view.zero_offset_six_stride_array()[0]
258                             .zero_offset())>::value));
259   EXPECT_TRUE((::std::is_same<
260                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
261                decltype(eight_aligned_view.zero_offset_six_stride_array()[0]
262                             .two_offset())>::value));
263   EXPECT_TRUE((::std::is_same<
264                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
265                decltype(eight_aligned_view.four_offset_six_stride_array()[0]
266                             .zero_offset())>::value));
267   EXPECT_TRUE((::std::is_same<
268                GenericPlaceholder4View<ContiguousBuffer<char, 2, 0>>,
269                decltype(eight_aligned_view.four_offset_six_stride_array()[0]
270                             .two_offset())>::value));
271 }
272 
273 }  // namespace
274 }  // namespace test
275 }  // namespace emboss
276