// Last update: June 20, 2001 #ifdef _MSC_VER # pragma once #else # error "Visual C++ specific header !" #endif #ifndef VC_ALIGNMENT_INC_ #define VC_ALIGNMENT_INC_ #include "Typelist.h" #include "static_check.h" //////////////////////////////////////////////////////////////////////////////// // class template MaxAlign // Computes the maximum alignof for all types in a typelist // Usage: MaxAlign::result //////////////////////////////////////////////////////////////////////////////// template struct VC_MaxAlign; template <> struct VC_MaxAlign< ::Loki::NullType > { enum { result = 0 }; }; template struct VC_MaxAlign { private: ASSERT_TYPELIST(TList); typedef typename TList::Head Head; typedef typename TList::Tail Tail; private: enum { headResult = __alignof(Head) }; enum { tailResult = VC_MaxAlign::result }; public: enum { result = headResult > tailResult ? headResult : tailResult }; }; //////////////////////////////////////////////////////////////////////////////// // class VC_AlignedPODBase // Defines a host of protected types used by VC_AlignedPOD (defined later) // Could be just part of VC_AlignedPOD itself, but making it separate ought to // reduce compile times //////////////////////////////////////////////////////////////////////////////// class VC_AlignedPODBase { protected: template struct AlignedPod { STATIC_CHECK(AlignmentSize == 0, BadAlignmentSize_OnlyUpTo128); }; // // I used the macro because align(#) // only works with Integer literals // #define ALIGNED_POD(_size_) \ template<> struct AlignedPod<_size_> { \ __declspec(align(_size_)) struct type { char X[_size_]; }; \ enum { alignment = __alignof(type) }; }; \ STATIC_CHECK((_size_ == sizeof(AlignedPod<_size_>::type)), SizeofNotEqualSize); \ STATIC_CHECK((_size_ == (AlignedPod<_size_>::alignment)), SizeofNotEqualAlignof) ALIGNED_POD(1); ALIGNED_POD(2); ALIGNED_POD(4); ALIGNED_POD(8); ALIGNED_POD(16); ALIGNED_POD(32); ALIGNED_POD(64); ALIGNED_POD(128); // can be up to 8192 - is it realistic? #undef ALIGNED_POD }; //////////////////////////////////////////////////////////////////////////////// // class template VC_AlignedPOD // Computes the alignment of all types in a typelist //////////////////////////////////////////////////////////////////////////////// template class VC_AlignedPOD : VC_AlignedPODBase { enum { maxAlign = VC_MaxAlign::result }; public: typedef typename AlignedPod::type Result; }; #endif // VC_ALIGNMENT_INC_