[/ 
  (C) Copyright Edward Diener 2011,2012
  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:tti_intro Introduction]

Welcome to the Boost Type Traits Introspection library, abbreviated TTI.

TTI is a library which provides the ability to introspect by name the elements 
of a type at compile time.

TTI works through macros generating metafunctions. Metafunctions are class 
templates of a particular syntax, having a nested 'type' member. So wherever 
in C++ class templates can occur, TTI macros can be used. The metafunctions 
generated by TTI are no different from any other metafunction as defined by
the Boost MPL library.

The metafunctions generated by TTI are used to introspect elements of a type 
at compile time, always passing at minimum to each metafunction the enclosing 
type being introspected.

The name of the library has been chosen because the library offers 
compile time functionality on a type, similar to the Boost Type Traits library, 
and because the functionality the library offers is the ability to introspect 
a type about the existence of a specific element within that type.

I use the word "introspect" in a very broad sense here. Normally computer 
language introspection means initially asking for information to be returned 
by name, which can then further be used to introspect for more specific 
information. In the TTI library one must always know and supply the name, and 
use the functionality provided for the correct type of inner element to find 
out if that particular named entity exists.

You may prefer the term "query" instead of "introspection" to denote what this 
library does, but I use terminology based on the word "introspect" throughout 
this documentation.

The functionality of the library may be summed up as:

* Provide the means to introspect a type at compile time 
  using a set of macros. Each macro takes the name of the 
  type's element and generates a metafunction which can be 
  subsequently invoked to determine whether or not the 
  element exists within the type. These generated metafunctions 
  will be called "macro metafunctions" in the documentation.
  The type to be introspected can be a class, struct, or union.
   
* Provide the means to create a typedef for a type which may
  not exist. If the type does not exist an empty marker type
  is returned as the typedef type. This typedef type can be
  used as a type in the metafunctions of the library without
  producing compile-time errors.
   
The library is dependent on Boost PP, Boost MPL, 
Boost Type Traits, and Boost Function Types. 

The library is also dependent on the variadic macro support 
of the Boost PP library if the variadic macros in the library 
are used. 

The library is a header only library.

Since the dependencies of the library are all header only 
libraries, there is no need to build a library in order to use 
the TTI library.

[section:tti_headers Header Files]

There is a single header file, `boost/tti/tti.hpp`, 
which includes all the header files in the library.

There are also separate specific header files for each of the elements 
to be introspected by the library. This allows for finer-grained inclusion
of the nested elements to be introspected. These header files are:

[table:tbhfiles TTI Header Files
  [
    [Introspected Element]
    [Specific Header File]
  ]
  [
    [Type]
    [[headerref boost/tti/has_type.hpp `has_type.hpp`]]
  ]
  [
    [Class/Struct]
    [[headerref boost/tti/has_class.hpp `has_class.hpp`]]
  ]
  [
    [Enumeration]
    [[headerref boost/tti/has_enum.hpp `has_enum.hpp`]]
  ]
  [
    [Union]
    [[headerref boost/tti/has_union.hpp `has_union.hpp`]]
  ]
  [
    [Class Template]
    [[headerref boost/tti/has_template.hpp `has_template.hpp`]]
  ]
  [
    [Member data]
    [[headerref boost/tti/has_member_data.hpp `has_member_data.hpp`]]
  ]
  [
    [Member function]
    [[headerref boost/tti/has_member_function.hpp `has_member_function.hpp`]]
  ]
  [
    [Member function template]
    [[headerref boost/tti/has_member_function_template.hpp `has_member_function_template.hpp`]]
  ]
  [
    [Static member data]
    [[headerref boost/tti/has_static_member_data.hpp `has_static_member_data.hpp`]]
  ]
  [
    [Static member function]
    [[headerref boost/tti/has_static_member_function.hpp `has_static_member_function.hpp`]]
  ]
  [
    [Static member function template]
    [[headerref boost/tti/has_static_member_function_template.hpp `has_static_member_function_template.hpp`]]
  ]
  [
    [Data]
    [[headerref boost/tti/has_data.hpp `has_data.hpp`]]
  ]
  [
    [Function]
    [[headerref boost/tti/has_function.hpp `has_function.hpp`]]
  ]
  [
    [Function template]
    [[headerref boost/tti/has_function_template.hpp `has_function_template.hpp`]]
  ]
  [
    [Member Type Creation]
    [[headerref boost/tti/member_type.hpp `member_type.hpp`]]
  ]
]

[endsect]

[endsect]
