130 lines
3.5 KiB
C++
130 lines
3.5 KiB
C++
#ifndef MY_COMPILER_INCLUDED
|
|
#define MY_COMPILER_INCLUDED
|
|
|
|
/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program 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; version 2 of the License.
|
|
|
|
This program 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 this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
|
|
|
/**
|
|
Header for compiler-dependent features.
|
|
|
|
Intended to contain a set of reusable wrappers for preprocessor
|
|
macros, attributes, pragmas, and any other features that are
|
|
specific to a target compiler.
|
|
*/
|
|
|
|
#include <my_global.h> /* stddef.h offsetof */
|
|
|
|
/**
|
|
Compiler-dependent internal convenience macros.
|
|
*/
|
|
|
|
/* GNU C/C++ */
|
|
#if defined __GNUC__
|
|
/* Any after 2.95... */
|
|
# define MY_ALIGN_EXT
|
|
|
|
/* Microsoft Visual C++ */
|
|
#elif defined _MSC_VER
|
|
# define MY_ALIGNOF(type) __alignof(type)
|
|
# define MY_ALIGNED(n) __declspec(align(n))
|
|
|
|
/* Oracle Solaris Studio */
|
|
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
|
# if __SUNPRO_C >= 0x590
|
|
# define MY_ALIGN_EXT
|
|
# endif
|
|
|
|
/* IBM XL C/C++ */
|
|
#elif defined __xlC__
|
|
# if __xlC__ >= 0x0600
|
|
# define MY_ALIGN_EXT
|
|
# endif
|
|
|
|
/* HP aCC */
|
|
#elif defined(__HP_aCC) || defined(__HP_cc)
|
|
# if (__HP_aCC >= 60000) || (__HP_cc >= 60000)
|
|
# define MY_ALIGN_EXT
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef MY_ALIGN_EXT
|
|
/** Specifies the minimum alignment of a type. */
|
|
# define MY_ALIGNOF(type) __alignof__(type)
|
|
/** Determine the alignment requirement of a type. */
|
|
# define MY_ALIGNED(n) __attribute__((__aligned__((n))))
|
|
#endif
|
|
|
|
/**
|
|
Generic compiler-dependent features.
|
|
*/
|
|
#ifndef MY_ALIGNOF
|
|
# ifdef __cplusplus
|
|
template<typename type> struct my_alignof_helper { char m1; type m2; };
|
|
/* Invalid for non-POD types, but most compilers give the right answer. */
|
|
# define MY_ALIGNOF(type) offsetof(my_alignof_helper<type>, m2)
|
|
# else
|
|
# define MY_ALIGNOF(type) offsetof(struct { char m1; type m2; }, m2)
|
|
# endif
|
|
#endif
|
|
|
|
/**
|
|
C++ Type Traits
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
|
|
/**
|
|
Opaque storage with a particular alignment.
|
|
*/
|
|
# if defined(MY_ALIGNED)
|
|
/* Partial specialization used due to MSVC++. */
|
|
template<size_t alignment> struct my_alignment_imp;
|
|
template<> struct MY_ALIGNED(1) my_alignment_imp<1> {};
|
|
template<> struct MY_ALIGNED(2) my_alignment_imp<2> {};
|
|
template<> struct MY_ALIGNED(4) my_alignment_imp<4> {};
|
|
template<> struct MY_ALIGNED(8) my_alignment_imp<8> {};
|
|
template<> struct MY_ALIGNED(16) my_alignment_imp<16> {};
|
|
/* ... expand as necessary. */
|
|
# else
|
|
template<size_t alignment>
|
|
struct my_alignment_imp { double m1; };
|
|
# endif
|
|
|
|
/**
|
|
A POD type with a given size and alignment.
|
|
|
|
@remark If the compiler does not support a alignment attribute
|
|
(MY_ALIGN macro), the default alignment of a double is
|
|
used instead.
|
|
|
|
@tparam size The minimum size.
|
|
@tparam alignment The desired alignment: 1, 2, 4, 8 or 16.
|
|
*/
|
|
template <size_t size, size_t alignment>
|
|
struct my_aligned_storage
|
|
{
|
|
union
|
|
{
|
|
char data[size];
|
|
my_alignment_imp<alignment> align;
|
|
};
|
|
};
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
#include <my_attribute.h>
|
|
|
|
#endif /* MY_COMPILER_INCLUDED */
|