149e08aacStbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-2021 Intel Corporation
349e08aacStbbdev 
449e08aacStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
549e08aacStbbdev     you may not use this file except in compliance with the License.
649e08aacStbbdev     You may obtain a copy of the License at
749e08aacStbbdev 
849e08aacStbbdev         http://www.apache.org/licenses/LICENSE-2.0
949e08aacStbbdev 
1049e08aacStbbdev     Unless required by applicable law or agreed to in writing, software
1149e08aacStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1249e08aacStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1349e08aacStbbdev     See the License for the specific language governing permissions and
1449e08aacStbbdev     limitations under the License.
1549e08aacStbbdev */
1649e08aacStbbdev #ifndef __TBB_aligned_space_H
1749e08aacStbbdev #define __TBB_aligned_space_H
1849e08aacStbbdev 
1949e08aacStbbdev #include <cstddef>
2049e08aacStbbdev 
2149e08aacStbbdev #include "_template_helpers.h"
2249e08aacStbbdev 
2349e08aacStbbdev namespace tbb {
2449e08aacStbbdev namespace detail {
2549e08aacStbbdev inline namespace d0 {
2649e08aacStbbdev 
2749e08aacStbbdev //! Block of space aligned sufficiently to construct an array T with N elements.
2849e08aacStbbdev /** The elements are not constructed or destroyed by this class.
2949e08aacStbbdev     @ingroup memory_allocation */
3049e08aacStbbdev template<typename T, std::size_t N = 1>
3149e08aacStbbdev class aligned_space {
3249e08aacStbbdev     alignas(alignof(T)) std::uint8_t aligned_array[N * sizeof(T)];
3349e08aacStbbdev 
3449e08aacStbbdev public:
3549e08aacStbbdev     //! Pointer to beginning of array
begin()3649e08aacStbbdev     T* begin() const { return punned_cast<T*>(&aligned_array); }
3749e08aacStbbdev 
3849e08aacStbbdev     //! Pointer to one past last element in array.
end()3949e08aacStbbdev     T* end() const { return begin() + N; }
4049e08aacStbbdev };
4149e08aacStbbdev 
4249e08aacStbbdev } // namespace d0
4349e08aacStbbdev } // namespace detail
4449e08aacStbbdev } // namespace tbb
4549e08aacStbbdev 
4649e08aacStbbdev #endif /* __TBB_aligned_space_H */
47