//===--- AlignOf.h - Portable calculation of type alignment -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file was developed by Ted Kremenek and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the AlignOf function that computes alignments for // arbitrary types. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_ALIGNOF_H #define LLVM_SUPPORT_ALIGNOF_H namespace llvm { template struct AlignmentCalcImpl { char x; T t; private: AlignmentCalcImpl() {} // Never instantiate. }; /// AlignOf - A templated class that contains an enum value representing /// the alignment of the template argument. For example, /// AlignOf::Alignment represents the alignment of type "int". The /// alignment calculated is the minimum alignment, and not necessarily /// the "desired" alignment returned by GCC's __alignof__ (for example). Note /// that because the alignment is an enum value, it can be used as a /// compile-time constant (e.g., for template instantiation). template struct AlignOf { enum { Alignment = sizeof(AlignmentCalcImpl) - sizeof(T) }; }; /// alignof - A templated function that returns the mininum alignment of /// of a type. This provides no extra functionality beyond the AlignOf /// class besides some cosmetic cleanliness. Example usage: /// alignof() returns the alignment of an int. template static inline unsigned alignof() { return AlignOf::Alignment; } } // end namespace llvm #endif