| 1 | /* |
| 2 | Copyright 2005-2013 Intel Corporation. All Rights Reserved. |
| 3 | |
| 4 | This file is part of Threading Building Blocks. |
| 5 | |
| 6 | Threading Building Blocks is free software; you can redistribute it |
| 7 | and/or modify it under the terms of the GNU General Public License |
| 8 | version 2 as published by the Free Software Foundation. |
| 9 | |
| 10 | Threading Building Blocks is distributed in the hope that it will be |
| 11 | useful, but WITHOUT ANY WARRANTY; without even the implied warranty |
| 12 | of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | GNU General Public License for more details. |
| 14 | |
| 15 | You should have received a copy of the GNU General Public License |
| 16 | along with Threading Building Blocks; if not, write to the Free Software |
| 17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 18 | |
| 19 | As a special exception, you may use this file as part of a free software |
| 20 | library without restriction. Specifically, if other files instantiate |
| 21 | templates or use macros or inline functions from this file, or you compile |
| 22 | this file and link it with other files to produce an executable, this |
| 23 | file does not by itself cause the resulting executable to be covered by |
| 24 | the GNU General Public License. This exception does not however |
| 25 | invalidate any other reasons why the executable file might be covered by |
| 26 | the GNU General Public License. |
| 27 | */ |
| 28 | |
| 29 | #ifndef __TBB_aligned_space_H |
| 30 | #define __TBB_aligned_space_H |
| 31 | |
| 32 | #include "tbb_stddef.h" |
| 33 | #include "tbb_machine.h" |
| 34 | |
| 35 | namespace tbb { |
| 36 | |
| 37 | //! Block of space aligned sufficiently to construct an array T with N elements. |
| 38 | /** The elements are not constructed or destroyed by this class. |
| 39 | @ingroup memory_allocation */ |
| 40 | template<typename T,size_t N> |
| 41 | class aligned_space { |
| 42 | private: |
| 43 | typedef __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type; |
| 44 | element_type array[(sizeof(T)*N+sizeof(element_type)-1)/sizeof(element_type)]; |
| 45 | public: |
| 46 | //! Pointer to beginning of array |
| 47 | T* begin() {return internal::punned_cast<T*>(this);} |
| 48 | |
| 49 | //! Pointer to one past last element in array. |
| 50 | T* end() {return begin()+N;} |
| 51 | }; |
| 52 | |
| 53 | } // namespace tbb |
| 54 | |
| 55 | #endif /* __TBB_aligned_space_H */ |
| 56 | |