/* Copyright 2005 Nicholas Bishop * * This file is part of SharpConstruct. * * SharpConstruct is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * SharpConstruct is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with SharpConstruct; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef ALIGN_HH #define ALIGN_HH #include "config.h" #include #include #ifndef HAVE_POSIX_MEMALIGN #include #define posix_memalign(a,b,c) \ ((*((void **)(a)) = (void *)malloc(c)) == NULL) #endif namespace SharpConstruct { template< typename T > class Align { public: typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef size_t size_type; typedef std::ptrdiff_t difference_type; template< typename U > struct rebind { typedef Align< U > other; }; pointer allocate( size_type n ) { void* mem; posix_memalign( &mem, __alignof( value_type ), n * sizeof( value_type ) ); return reinterpret_cast< pointer >( mem ); } inline void deallocate( pointer p, size_type ) { free( p ); } inline void construct( pointer p, const T& t ) { new( p ) T( t ); } inline void destroy( pointer p ) { p->~T(); } }; } #endif