|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TCG_ALIGNMENT_H
|
|
Toshihiro Shimizu |
890ddd |
#define TCG_ALIGNMENT_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "macros.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*! \file alignment.h
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
This file contains C++ utilities about types alignment.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
namespace tcg
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Private stuff
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// From http://stackoverflow.com/questions/6959261/how-can-i-simulate-alignast
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
union _MaxAlign {
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
long l;
|
|
Toshihiro Shimizu |
890ddd |
long long ll;
|
|
Toshihiro Shimizu |
890ddd |
long double ld;
|
|
Toshihiro Shimizu |
890ddd |
double d;
|
|
Toshihiro Shimizu |
890ddd |
void *p;
|
|
Toshihiro Shimizu |
890ddd |
void (*pf)();
|
|
Toshihiro Shimizu |
890ddd |
_MaxAlign *ps;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename bool="" t,=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
struct _AlignTypeDetail;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename t=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
struct _AlignTypeDetail<t, false=""> {</t,>
|
|
Toshihiro Shimizu |
890ddd |
typedef T type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename t=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
struct _AlignTypeDetail<t, true=""> {</t,>
|
|
Toshihiro Shimizu |
890ddd |
typedef char type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <size_t alignment,="" typename="" u=""></size_t>
|
|
Toshihiro Shimizu |
890ddd |
struct _AlignType {
|
|
Toshihiro Shimizu |
890ddd |
typedef typename _AlignTypeDetail<u, (alignment="" <="" sizeof(u))="">::type type;</u,>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename t=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
struct _Aligner {
|
|
Toshihiro Shimizu |
890ddd |
char c;
|
|
Toshihiro Shimizu |
890ddd |
T t;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TCG alignment unions
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <int alignment=""></int>
|
|
Toshihiro Shimizu |
890ddd |
union aligner_type {
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, char="">::type c;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, short="">::type s;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, int="">::type i;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, long="">::type l;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, long="">::type ll;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, float="">::type f;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, double="">::type d;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, double="" long="">::type ld;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, *="" void="">::type pc;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, *="" _maxalign="">::type ps;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
typename _AlignType<alignment, (*)()="" void="">::type pf;</alignment,>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename t=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
union aligned_buffer {
|
|
Toshihiro Shimizu |
890ddd |
typedef aligner_type<sizeof(_aligner<t>) - sizeof(T)> aligner_type;</sizeof(_aligner<t>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
aligner_type m_aligner;
|
|
Toshihiro Shimizu |
890ddd |
char m_buf[sizeof(T)];
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Toshihiro Shimizu |
890ddd |
TCG_STATIC_ASSERT(sizeof(_Aligner<t>) - sizeof(T) ==</t>
|
|
Toshihiro Shimizu |
890ddd |
sizeof(_Aligner<aligner_type>) - sizeof(aligner_type));</aligner_type>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TCG alignment traits
|
|
Toshihiro Shimizu |
890ddd |
//**************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename t=""></typename>
|
|
Toshihiro Shimizu |
890ddd |
struct alignment_traits {
|
|
Toshihiro Shimizu |
890ddd |
static const int alignment = sizeof(_Aligner<t>) - sizeof(T);</t>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
typedef aligner_type<alignment> aligner_type;</alignment>
|
|
Toshihiro Shimizu |
890ddd |
typedef aligned_buffer<t> buffer_type;</t>
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
} // namespace tcg
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif // TCG_ALIGNMENT_H
|