Arene Base
Fundamental Utilities For Safety Critical C++
Loading...
Searching...
No Matches
layout_stride.hpp
Go to the documentation of this file.
1// parasoft-suppress CERT_C-EXP37-a AUTOSAR-A2_8_1-a "False positive: there is no function named '()' here. Header
2// defines layout_stride types"
3
4// Copyright 2026, Toyota Motor Corporation
5//
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7
8#ifndef INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_LAYOUT_STRIDE_HPP_
9#define INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_LAYOUT_STRIDE_HPP_
10
11// IWYU pragma: no_include "arene/base/mdspan/layout.hpp"
12
13// parasoft-begin-suppress AUTOSAR-A16_2_2-a-2 "Arene Base aggregate headers permitted by A16-2-2 Permit #1"
14#include "arene/base/array/array.hpp"
15#include "arene/base/constraints/constraints.hpp"
16#include "arene/base/contracts/contract.hpp"
17#include "arene/base/mdspan/detail/all_valid_submdspan_slice_types_for.hpp"
18#include "arene/base/mdspan/detail/layout_common.hpp" // IWYU pragma: keep
19#include "arene/base/mdspan/detail/strided_mapping_base.hpp" // IWYU pragma: keep
20#include "arene/base/mdspan/detail/submdspan_offset.hpp"
21#include "arene/base/mdspan/detail/submdspan_sub_strides.hpp"
22#include "arene/base/mdspan/is_layout_mapping.hpp"
23#include "arene/base/mdspan/is_sliceable_mapping.hpp" // IWYU pragma: keep
24#include "arene/base/mdspan/submdspan_extents.hpp"
25#include "arene/base/mdspan/submdspan_mapping_result.hpp"
26#include "arene/base/mdspan/submdspan_subextents_type.hpp"
27#include "arene/base/span/span.hpp"
28#include "arene/base/stdlib_choice/cstddef.hpp"
29#include "arene/base/stdlib_choice/enable_if.hpp"
30#include "arene/base/stdlib_choice/integer_sequence.hpp"
31#include "arene/base/stdlib_choice/integral_constant.hpp"
32#include "arene/base/stdlib_choice/is_constructible.hpp"
33#include "arene/base/stdlib_choice/is_convertible.hpp"
34#include "arene/base/stdlib_choice/is_same.hpp"
35#include "arene/base/stdlib_choice/move.hpp"
36#include "arene/base/stdlib_choice/numeric_limits.hpp"
37#include "arene/base/utility/safe_comparisons.hpp"
38// parasoft-end-suppress AUTOSAR-A16_2_2-a-2
39
40// parasoft-begin-suppress AUTOSAR-M2_10_1-a "Similar names permitted by M2-10-1 Permit #1"
41// parasoft-begin-suppress AUTOSAR-A7_1_5-a-2 "Trailing return syntax permitted by A7-1-5 Permit #1 v1.0.0"
42
43namespace arene {
44namespace base {
45namespace layout_detail {
46
47/// @brief Check that all of the given strides are positive, crashing with a precondition violation if not
48/// @tparam IndexType The index type used by @c strides
49/// @param strides The strides to check
50/// @pre All of the entries in @c strides are positive, else @c ARENE_PRECONDITION violation
51template <typename IndexType>
52constexpr auto precondition_all_strides_positive(span<IndexType const> strides) noexcept -> void {
53 for (auto const& stride : strides) {
54 ARENE_PRECONDITION(stride > IndexType{});
55 }
56}
57
58/// @brief Cast strides of one type to another
59/// @tparam OutputIndexType The type of the strides after casting
60/// @tparam InputIndexType The type of the strides before casting, deduced from @c strides
61/// @tparam Rank The rank (dimensionality) of the mapping, deduced from @c strides
62/// @param strides A set of strides using some original type, to be converted to @c OutputIndexType
63/// @return An array containing the input @c strides converted to @c OutputIndexType
64/// @pre All of the entries in @c strides are positive, else @c ARENE_PRECONDITION violation
65template <
66 typename OutputIndexType,
67 typename InputIndexType,
68 std::size_t Rank,
69 constraints<std::enable_if_t<Rank != 0UL>> = nullptr>
70constexpr auto stride_cast(span<InputIndexType const, Rank> strides) noexcept -> array<OutputIndexType, Rank> {
71 precondition_all_strides_positive<InputIndexType>(strides);
72
73 array<OutputIndexType, Rank> converted{};
74 for (std::size_t dim{}; dim < Rank; ++dim) {
75 converted[dim] = static_cast<OutputIndexType>(strides[dim]);
76 }
77 return converted;
78}
79
80/// @brief Cast strides of one type to another
81/// @tparam OutputIndexType The type of the strides after casting
82/// @tparam InputIndexType The type of the strides before casting, deduced from @c strides
83/// @tparam Rank The rank (dimensionality) of the mapping, deduced from @c strides
84/// @return An array containing the input @c strides converted to @c OutputIndexType
85/// @pre All of the entries in @c strides are positive, else @c ARENE_PRECONDITION violation
86template <
87 typename OutputIndexType,
88 typename InputIndexType,
89 std::size_t Rank,
90 constraints<std::enable_if_t<Rank == 0UL>> = nullptr>
91constexpr auto stride_cast(span<InputIndexType const, Rank>) noexcept -> array<OutputIndexType, Rank> {
92 return {};
93}
94
95/// @brief Type trait describing whether two strided mappings can be implicitly converted
96/// Conversion can be implicit if the extents are implicitly convertible and @c FromMapping is a known strided type.
97/// @tparam FromMapping The strided mapping from which the conversion is to be done
98/// @tparam ToMapping The strided mapping to which the conversion is to be done
99template <typename FromMapping, typename ToMapping, typename = constraints<>>
100class implicit_conversion_ok : public std::false_type {};
101
102/// @brief Type trait describing whether two strided mappings can be implicitly converted
103/// Conversion can be implicit if the extents are implicitly convertible and @c FromMapping is a known strided type.
104/// @tparam FromMapping The strided mapping from which the conversion is to be done
105/// @tparam ToMapping The strided mapping to which the conversion is to be done
106template <typename FromMapping, typename ToMapping>
107class implicit_conversion_ok<
108 FromMapping,
109 ToMapping,
110 constraints<typename FromMapping::extents_type, typename ToMapping::extents_type>>
111 : public std::integral_constant<
112 bool,
113 std::is_convertible<typename FromMapping::extents_type, typename ToMapping::extents_type>::value &&
114 (std::is_same<layout_left::mapping<typename FromMapping::extents_type>, FromMapping>::value ||
115 std::is_same<layout_right::mapping<typename FromMapping::extents_type>, FromMapping>::value ||
116 std::is_same<layout_stride::mapping<typename FromMapping::extents_type>, FromMapping>::value)> {};
117
118// parasoft-begin-suppress AUTOSAR-M3_3_2-a-2 "False positive: inline function used in multiple translation units"
119/// @brief Extract the strides from a mapping into an array using the mapping's public @c stride(dim) function
120/// @tparam The type of the mapping to extract from, deduced from @c mapping
121/// @param mapping The mapping to extract from
122/// @return An array containing the strides of @c mapping
123template <typename Mapping, constraints<std::enable_if_t<Mapping::extents_type::rank() != 0U>> = nullptr>
124constexpr auto extract_strides(Mapping const& mapping) noexcept
125 -> array<typename Mapping::index_type, Mapping::extents_type::rank()> {
126 array<typename Mapping::index_type, Mapping::extents_type::rank()> strides{};
127 for (typename Mapping::rank_type dim{}; dim < Mapping::extents_type::rank(); ++dim) {
128 strides[dim] = mapping.stride(dim);
129 }
130
131 return strides;
132}
133
134/// @brief Extract the strides from a mapping into an array using the mapping's public @c stride(dim) function
135/// @tparam The type of the mapping to extract from, deduced from @c mapping
136/// @return An array containing the strides of @c mapping
137/// @note This SFINAE overload is needed for GCC8 which thinks that 0-iteration for loops are not constexpr.
138template <typename Mapping, constraints<std::enable_if_t<Mapping::extents_type::rank() == 0U>> = nullptr>
139constexpr auto extract_strides(Mapping const&) noexcept -> array<typename Mapping::index_type, 0U> {
140 return {};
141}
142
143/// @brief Get the affine offset of the given mapping by checking the image of <c>(0, 0, ...)</c>
144/// @note Implements the exposition-only helper @c OFFSET(m) in [mdspan.layout.stride.expo].
145/// @tparam Mapping The type of the mapping to check
146/// @tparam Dims A pack of indices, one for each dimension of @c Mapping::extents_type
147/// @param mapping The mapping to check
148/// @return The constant offset of @c mapping (0 for all built-in layouts)
149template <typename Mapping, typename Mapping::rank_type... Dims>
150constexpr auto
151get_offset_of_mapping_impl(Mapping const& mapping, std::integer_sequence<typename Mapping::rank_type, Dims...>) noexcept
152 -> typename Mapping::index_type {
153 // If the output index space's size is 0, then the mapping's offset is 0 regardless of what the strides are set to.
154 if (mapping.required_span_size() == typename Mapping::index_type{}) {
155 return {};
156 }
157
158 // parasoft-begin-suppress AUTOSAR-M5_18_1-a "Comma operator avoids an expensive recursive iteration"
159 return mapping((static_cast<void>(Dims), typename Mapping::index_type{})...);
160 // parasoft-end-suppress AUTOSAR-M5_18_1-a
161}
162
163/// @brief Get the affine offset of the given mapping by checking the image of <c>(0, 0, ...)</c>
164/// @note Implements the exposition-only helper @c OFFSET(m) in [mdspan.layout.stride.expo].
165/// @tparam Mapping The type of the mapping to check
166/// @param mapping The mapping to check
167/// @return The constant offset of @c mapping (0 for all built-in layouts)
168template <typename Mapping, constraints<std::enable_if_t<Mapping::extents_type::rank() != 0U>> = nullptr>
169constexpr auto get_offset_of_mapping(Mapping const& mapping) noexcept -> typename Mapping::index_type {
170 return get_offset_of_mapping_impl(
171 mapping,
172 std::make_integer_sequence<typename Mapping::rank_type, Mapping::extents_type::rank()>{}
173 );
174}
175
176/// @brief Get the affine offset of the given mapping by checking the image of <c>(0, 0, ...)</c>
177/// @note Implements the exposition-only helper @c OFFSET(m) in [mdspan.layout.stride.expo].
178/// @tparam Mapping The type of the mapping to check
179/// @return The constant offset of @c mapping (0 for all built-in layouts)
180template <typename Mapping, constraints<std::enable_if_t<Mapping::extents_type::rank() == 0U>> = nullptr>
181constexpr auto get_offset_of_mapping(Mapping const&) noexcept -> typename Mapping::index_type {
182 return {};
183}
184// parasoft-end-suppress AUTOSAR-M3_3_2-a-2
185
186} // namespace layout_detail
187
188// parasoft-begin-suppress AUTOSAR-A12_1_5-a "False positive: constructor preconditions differ so they can not delegate"
189// parasoft-begin-suppress AUTOSAR-A14_5_1-a "False positive: class is copyable without a user-defined copy constructor"
190/// @brief A mapping from a logical pack of indices into a single flat physical output index, using a strided algorithm
191/// @tparam The extents of the space used for this mapping; must be a specialization of @c extents
192template <class Extents>
194 private:
195 /// @brief Convenience typedef referring to the base strided mapping
197
198 public:
199 using typename base_type::extents_type;
200 using typename base_type::index_type;
201 using typename base_type::rank_type;
202 using typename base_type::size_type;
203 /// @brief The tag type of the layout used by this @c mapping
205
206 private:
207 /// @brief obtain a check_bypasser passkey to skip precondition checks on
208 /// mapping construction
209 /// @return check_bypasser value
210 ///
211 /// @note This exists as a workaround for a GCC bug where access checking for
212 /// private constructors of friend classes can be incorrectly performed in
213 /// the caller's instantiation context rather than the definition context.
214 static constexpr auto passkey() noexcept -> layout_detail::check_bypasser { return layout_detail::check_bypasser{}; }
215
216 public:
217 // parasoft-begin-suppress CERT_C-EXP37-a "False positive: Rule does not require all parameters to be named"
218 /// @brief Construct a mapping with the given strides, bypassing precondition checks
219 ///
220 /// @note This can only be called from classes which inherit from
221 /// layout_stride::mapping. It is used when slicing a layout_stride::mapping
222 /// if the slice arguments are valid, so that the preconditions on the public
223 /// constructors need not be re-checked.
224 ///
225 /// @param exts A set of extents to use for this mapping
226 /// @param strds A set of strides to use for this mapping
227 constexpr mapping(
228 extents_type const& exts,
229 array<index_type, extents_type::rank()> const& strds,
231 ) noexcept
232 : base_type(exts, strds) {}
233 // parasoft-end-suppress CERT_C-EXP37-a
234
235 /// @brief Construct a default strided mapping for the given extents, which has the same layout as @c layout_right
236 constexpr mapping() noexcept
238 // Note: the precondition specified in [mdspan.layout.stride.cons] can not be violated so it's never checked.
239 }
240
241 /// @brief Construct a mapping with the given strides; they must be valid for a default-constructed @c extents_type
242 /// @tparam OtherIndexType The original index type used by <c>strds</c>; must be convertible to @c index_type
243 /// @param exts A set of extents to use for this mapping
244 /// @param strds A set of strides to use for this mapping
245 /// @pre All strides are positive when converted to <c>index_type</c>
246 /// @pre Size of the output index space is representable as <c>index_type</c>
247 /// @pre @c strds defines a unique (one-to-one) mapping from <c>exts</c>
248 template <
249 class OtherIndexType,
255 // The representable precondition is checked here as a side-effect of 'required_span_size'.
257
258 // This is a necessary, but not sufficient check for uniqueness.
262 }
263
264 // parasoft-begin-suppress AUTOSAR-A12_1_1-a "False positive: this is a delegating constructor"
265 /// @brief Construct a mapping with the given strides; they must be valid for a default-constructed @c extents_type
266 /// @tparam OtherIndexType The original index type used by <c>strds</c>; must be convertible to @c index_type
267 /// @param exts A set of extents to use for this mapping
268 /// @param strds A set of strides to use for this mapping
269 /// @pre All strides are positive when converted to <c>index_type</c>, else @c ARENE_PRECONDITION violation
270 /// @pre Size of the output index space is representable as <c>index_type</c>, else @c ARENE_PRECONDITION violation
271 /// @pre @c strds defines a unique (one-to-one) mapping from <c>exts</c>, else @c ARENE_PRECONDITION violation
272 template <
273 class OtherIndexType,
277 constexpr mapping(extents_type const& exts, array<OtherIndexType, extents_type::rank()> const& strds) noexcept
279 // parasoft-end-suppress AUTOSAR-A12_1_1-a
280
281 /// @brief Construct a mapping from another strided mapping; implicit for certain known-safe mapping types
282 /// @tparam StridedLayoutMapping A layout mapping satisfying [mdspan.layout.reqmts] which is always strided and unique
283 /// @param other A mapping to convert
284 /// @pre All strides are positive when converted to <c>index_type</c>, else @c ARENE_PRECONDITION violation
285 /// @pre Size of the output index space is representable as <c>index_type</c>, else @c ARENE_PRECONDITION violation
286 /// @pre <c>other(0, 0, 0...) == 0</c>, else @c ARENE_PRECONDITION violation
287 template <
295 // NOLINTNEXTLINE(hicpp-explicit-conversions) C++23 defines this as conditionally implicit
296 constexpr mapping(StridedLayoutMapping const& other) noexcept
297 : base_type(
302 )
303 )
304 ) {
305 // None of the preconditions can be violated for the implicit version of this function. StridedLayoutMapping must be
306 // a known type and all standard layouts have zero offset, positive strides, and in-bounds required_span_size.
307 // The extents_type must also be implicitly convertible, so casting required_span_size can not go OOB either.
308 }
309
310 /// @brief Construct a mapping from another strided mapping; implicit for certain known-safe mapping types
311 /// @tparam StridedLayoutMapping A layout mapping satisfying [mdspan.layout.reqmts] which is always strided and unique
312 /// @param other A mapping to convert
313 /// @pre All strides are positive when converted to <c>index_type</c>, else @c ARENE_PRECONDITION violation
314 /// @pre Size of the output index space is representable as <c>index_type</c>, else @c ARENE_PRECONDITION violation
315 /// @pre <c>other(0, 0, 0...) == 0</c>, else @c ARENE_PRECONDITION violation
316 template <
324 constexpr explicit mapping(StridedLayoutMapping const& other) noexcept
325 : base_type(
330 )
331 )
332 ) {
333 // The second precondition is enforced by layout_detail::stride_cast
336 }
337
338 using base_type::extents;
340 using base_type::stride;
341 using base_type::strides;
342 using base_type::operator();
343
346 using base_type::is_strided;
347 using base_type::is_unique;
348
349 /// @brief Return whether or not this mapping is always exhaustive, i.e. every element is reachable using some indices
350 /// @return @c false because it's possible to construct non-exhaustive mappings using this class
351 /// @note In mathematical terms this asks if the mapping is always surjective/onto.
352 static constexpr auto is_always_exhaustive() noexcept -> bool { return false; }
353
354 /// @brief Return whether or not this instance is exhaustive, i.e. every element is reachable using some indices
355 /// @return @c true if every provided stride is the product of the extents corresponding to some subset of the other
356 /// strides, otherwise @c false
357 /// @note In mathematical terms this asks if the mapping is surjective/onto.
358 constexpr auto is_exhaustive() const noexcept -> bool {
359 return required_span_size() == layout_detail::extent_product(this->extents()).value;
360 }
361
362 // parasoft-begin-suppress AUTOSAR-M3_3_2-a-2 "False positive: inline function used in multiple translation units"
363 // parasoft-begin-suppress AUTOSAR-A11_3_1-a "Hidden friends permitted by A11-3-1 Permit #2 v1.0.0"
364 // parasoft-begin-suppress AUTOSAR-A13_5_5-b-2 "Mixed comparisons permitted by A13-5-5 Permit #1"
365 /// @brief Compare two strided mappings for equality, of which at least one must be a @c layout_stride::mapping
366 /// @tparam Right The type of the right side of the comparison; must be strided and satisfy @c is_layout_mapping_v
367 /// @param left An instance of @c layout_stride::mapping
368 /// @param right An instance of @c Right
369 /// @return @c true if @c left and @c right have the same extents and strides, and both map (0,0,...) to @c 0
370 template <
371 class Right,
375 std::enable_if_t<Right::is_always_strided()>> = nullptr>
376 friend constexpr auto operator==(mapping const& left, Right const& right) noexcept -> bool {
377 for (mapping::rank_type dim{}; dim < mapping::extents_type::rank(); ++dim) {
380 return false;
381 }
382 }
383
385 }
386
387 /// @brief Compare two strided mappings for equality, of which at least one must be a @c layout_stride::mapping
388 /// @tparam Left The type of the left side of the comparison; must be strided and satisfy @c is_layout_mapping_v
389 /// @param left An instance of @c Left
390 /// @param right An instance of @c layout_stride::mapping
391 /// @return @c true if @c left and @c right have the same extents and strides, and both map (0,0,...) to @c 0
392 template <
393 class Left,
398 std::enable_if_t<Left::is_always_strided()>> = nullptr>
399 friend constexpr auto operator==(Left const& left, mapping const& right) noexcept -> bool {
400 return right == left;
401 }
402
403 /// @brief Compare two strided mappings for inequality, of which at least one must be a @c layout_stride::mapping
404 /// @tparam Right The type of the right side of the comparison; must be strided and satisfy @c is_layout_mapping_v
405 /// @param left An instance of @c layout_stride::mapping
406 /// @param right An instance of @c Right
407 /// @return @c true if @c left and @c right have different extents or strides, or one doesn't map (0,0,...) to @c 0
408 template <
409 class Right,
413 std::enable_if_t<Right::is_always_strided()>> = nullptr>
414 friend constexpr auto operator!=(mapping const& left, Right const& right) noexcept -> bool {
415 return !(left == right);
416 }
417
418 /// @brief Compare two strided mappings for inequality, of which at least one must be a @c layout_stride::mapping
419 /// @tparam Left The type of the left side of the comparison; must be strided and satisfy @c is_layout_mapping_v
420 /// @param left An instance of @c Left
421 /// @param right An instance of @c layout_stride::mapping
422 /// @return @c true if @c left and @c right have different extents or strides, or one doesn't map (0,0,...) to @c 0
423 template <
424 class Left,
429 std::enable_if_t<Left::is_always_strided()>> = nullptr>
430 friend constexpr auto operator!=(Left const& left, mapping const& right) noexcept -> bool {
431 return !(right == left);
432 }
433 // parasoft-end-suppress AUTOSAR-M3_3_2-a-2
434 // parasoft-end-suppress AUTOSAR-A11_3_1-a
435 // parasoft-end-suppress AUTOSAR-A13_5_5-b-2
436
437 // parasoft-begin-suppress AUTOSAR-A11_3_1-a "Hidden friends permitted by A11-3-1 Permit #2"
438 /// @brief compute submdspan mapping and offset for a @c layout_stride mapping
439 /// @tparam CanonicalSliceSpecifiers submdspan slice specifier types
440 /// @param src source @c layout_stride::mapping to slice
441 /// @param slices submdspan slice specifiers
442 ///
443 /// Uses @c slices to compute the sub-extents, sub-strides, and offset of the submdspan. The @c slices must be in
444 /// canonical form.
445 ///
446 /// @return A @c submdspan_mapping_result containing the sub-mapping and offset such that indexing the sub-mapping and
447 /// adding the offset recovers the corresponding index in the original mapping.
448 ///
449 /// @note Constraints <br>
450 /// * <c> sizeof...(CanonicalSliceSpecifiers) == extents_type::rank() </c>
451 /// * for each rank index @c k of @c src.extents(), @c CanonicalSliceSpecifiers...[k] is a valid submdspan slice
452 /// type for the @c k-th extent of @c extents_type
453 ///
454 /// @note Preconditions <br>
455 /// * for each rank index @c k of @c src.extents(), @c slices...[k] denotes a valid submdspan slice for the @c k-th
456 /// extent of @c src.extents()
457 ///
458 /// @note Remarks <br>
459 /// * this function is found via argument-dependent lookup as a @c friend of @c layout_stride::mapping
460 /// * the @c layout_stride specialization of @c submdspan_mapping always produces a @c layout_stride mapping for the
461 /// submdspan.
462 template <
463 class SrcMapping,
469 nullptr>
470 friend constexpr auto submdspan_mapping(SrcMapping const& src, CanonicalSliceSpecifiers... slices) noexcept
473 // precondition is transitively checked by submdspan_extents -> submdspan_canonicalize_slices
477
480 }
481 // parasoft-end-suppress AUTOSAR-A11_3_1-a
482};
483// parasoft-end-suppress AUTOSAR-A14_5_1-a
484// parasoft-end-suppress AUTOSAR-A12_1_5-a
485
486/// @brief Specialization of @c is_layout_mapping_v to break a recursive cycle in the @c layout_stride equality operator
487/// @tparam Extents Any specialization of @c arene::base::extents
488template <typename Extents>
489extern constexpr bool is_layout_mapping_v<layout_stride::mapping<Extents>> = true;
490
491/// @brief Specialization of @c is_sliceable_mapping_v indicating @c layout_stride::mapping supports @c submdspan
492/// @tparam Extents Any specialization of @c arene::base::extents
493template <typename Extents>
495
496} // namespace base
497} // namespace arene
498
499// parasoft-end-suppress AUTOSAR-M2_10_1-a "Similar names permitted by M2-10-1 Permit #1"
500// parasoft-end-suppress AUTOSAR-A7_1_5-a-2
501
502#endif // INCLUDE_GUARD_ARENE_BASE_ARENE_BASE_MDSPAN_LAYOUT_STRIDE_HPP_
A mapping from a logical pack of indices into a single flat physical output index.
Definition layout_left.hpp:84
static constexpr auto is_always_exhaustive() noexcept -> bool
Return whether or not this mapping is always exhaustive, i.e. every element is reachable using some i...
Definition layout_left.hpp:234
constexpr mapping() noexcept
Construct a default left-strided mapping for the given extents.
Definition layout_left.hpp:99
constexpr auto is_exhaustive() const noexcept -> bool
Return whether or not this instance is exhaustive, i.e. every element is reachable using some indices...
Definition layout_stride.hpp:358
constexpr mapping(extents_type const &exts, array< index_type, extents_type::rank()> const &strds, layout_detail::check_bypasser) noexcept
Construct a mapping with the given strides, bypassing precondition checks.
Definition layout_stride.hpp:227
Definition array_exceptions_disabled.cpp:11
Copyright 2026, Toyota Motor Corporation.
Definition array_exceptions_disabled.cpp:10