[/ 
  Copyright 2007 John Maddock.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

[section:intrinsics Support for Compiler Intrinsics]

There are some traits that can not be implemented within the current C++ language:
to make these traits "just work" with user defined types, some kind of additional
help from the compiler is required.  Currently (April 2008) Visual C++ 8 and 9,
GNU GCC 4.3 and MWCW 9
provide the necessary intrinsics, and other compilers will no doubt follow in due 
course.  

The Following traits classes always need compiler support to do the right thing 
for all types 
(but all have safe fallback positions if this support is unavailable):

* __is_union
* __is_pod
* __has_trivial_constructor
* __has_trivial_copy
* __has_trivial_assign
* __has_trivial_destructor
* __has_nothrow_constructor
* __has_nothrow_copy
* __has_nothrow_assign
* __has_virtual_destructor

The following traits classes can't be portably implemented in the C++ language, 
although in practice, the implementations do in fact do the right thing on all
the compilers we know about:

* __is_empty
* __is_polymorphic

The following traits classes are dependent on one or more of the above:

* __is_class
* __is_stateless

The hooks for compiler-intrinsic support are defined in 
[@../../../../boost/type_traits/intrinsics.hpp boost/type_traits/intrinsics.hpp], adding support for new compilers is simply
a matter of defining one of more of the following macros:

[table Macros for Compiler Intrinsics
   [[BOOST_IS_UNION(T)][Should evaluate to true if T is a union type]]
   [[BOOST_IS_POD(T)][Should evaluate to true if T is a POD type]]
   [[BOOST_IS_EMPTY(T)][Should evaluate to true if T is an empty struct or union]]
   [[BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)][Should evaluate to true if the default constructor for T is trivial (i.e. has no effect)]]
   [[BOOST_HAS_TRIVIAL_COPY(T)][Should evaluate to true if T has a trivial copy constructor (and can therefore be replaced by a call to memcpy)]]
   [[BOOST_HAS_TRIVIAL_ASSIGN(T)][Should evaluate to true if T has a trivial assignment operator (and can therefore be replaced by a call to memcpy)]]
   [[BOOST_HAS_TRIVIAL_DESTRUCTOR(T)][Should evaluate to true if T has a trivial destructor (i.e. ~T() has no effect)]]
   [[BOOST_HAS_NOTHROW_CONSTRUCTOR(T)][Should evaluate to true if `T x;` can not throw]]
   [[BOOST_HAS_NOTHROW_COPY(T)][Should evaluate to true if `T(t)` can not throw]]
   [[BOOST_HAS_NOTHROW_ASSIGN(T)][Should evaluate to true if `T t, u; t = u` can not throw]]
   [[BOOST_HAS_VIRTUAL_DESTRUCTOR(T)][Should evaluate to true T has a virtual destructor]]

   [[BOOST_IS_ABSTRACT(T)][Should evaluate to true if T is an abstract type]]
   [[BOOST_IS_BASE_OF(T,U)][Should evaluate to true if T is a base class of U]]
   [[BOOST_IS_CLASS(T)][Should evaluate to true if T is a class type]]
   [[BOOST_IS_CONVERTIBLE(T,U)][Should evaluate to true if T is convertible to U]]
   [[BOOST_IS_ENUM(T)][Should evaluate to true is T is an enum]]
   [[BOOST_IS_POLYMORPHIC(T)][Should evaluate to true if T is a polymorphic type]]
   [[BOOST_ALIGNMENT_OF(T)][Should evaluate to the alignment requirements of type T.]]
   
]

[endsect]

