[ create a new paste ] login | about

Project: boost
Link: http://boost.codepad.org/U8MimV7v    [ raw code | output | fork ]

joel_f - C++, pasted on Aug 26:
template<class T> struct aligned_ptr_reference        { typedef T& type;    };
template<>        struct aligned_ptr_reference<void>  { typedef void type;  };

template<class T,size_t N> struct alignement_traits
{
  BOOST_STATIC_CONSTANT( size_t, ptr_size = sizeof(void*) );
  typedef typename boost::uint_t<ptr_size*CHAR_BIT>::least type;

  BOOST_STATIC_CONSTANT( size_t
                        , alignement = (1<<N) < sizeof(T)
                                    ? sizeof(T)
                                    : (1<<N)
                      );
};

template<size_t N> struct alignement_traits<void,N>
{
  BOOST_STATIC_CONSTANT( size_t, ptr_size = sizeof(void*) );
  typedef typename boost::uint_t<ptr_size*CHAR_BIT>::least type;

  BOOST_STATIC_CONSTANT( size_t
                       , alignement = (1<<N)
                       );
};

template<class T, size_t N> inline
typename alignement_traits<T,N>::type align_pointer( void* ptr )
{
  typedef alignement_traits<T,N> traits;
  typedef typename traits::type           type;
  return     ((type)ptr+traits::alignement+traits::ptr_size)
          & ~(traits::alignement-1);
}

template<size_t N,class U> inline U align_value( U val )
{
  typedef alignement_traits<U,N> traits;
  return  (val+traits::alignement) & ~(traits::alignement-1);
}

inline void** unaligned_base( void* ptr ) { return ((void**)ptr-1); }

template<class T, size_t N> inline void* aligned_realloc( T* data ,size_t sz )
{
  typedef alignement_traits<T,N> traits;
  typedef typename traits::type           type;

  void* pa = realloc( data ? *unaligned_base(data) : 0
                    , (traits::ptr_size+traits::alignement-1)+sz
                    );

  void* ptr = (void*)(align_pointer<T,N>(pa));

  *unaligned_base(ptr)=pa;

  return ptr;
}

template<class T, size_t N> inline
void* aligned_alloc( size_t sz ) { return aligned_realloc<T,N>(0,sz); }

inline void aligned_free( void* ptr )
{
  free( *unaligned_base(ptr) );
}

int main()
{
  float* tab = (float*)aligned_alloc<float,4>(13);
  cout << tab << endl;

  cout << align_value<4>(53) << endl;
  aligned_free(tab);
}


Output:
1
2
0x8050440
64


Create a new paste based on this one


Comments: