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