epoc32/include/stdapis/boost/utility/base_from_member.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
     1 //  boost utility/base_from_member.hpp header file  --------------------------//
     2 
     3 //  Copyright 2001, 2003, 2004 Daryle Walker.  Use, modification, and
     4 //  distribution are subject to the Boost Software License, Version 1.0.  (See
     5 //  accompanying file LICENSE_1_0.txt or a copy at
     6 //  <http://www.boost.org/LICENSE_1_0.txt>.)
     7 
     8 //  See <http://www.boost.org/libs/utility/> for the library's home page.
     9 
    10 #ifndef BOOST_UTILITY_BASE_FROM_MEMBER_HPP
    11 #define BOOST_UTILITY_BASE_FROM_MEMBER_HPP
    12 
    13 #include <boost/preprocessor/arithmetic/inc.hpp>
    14 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
    15 #include <boost/preprocessor/repetition/enum_params.hpp>
    16 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
    17 
    18 
    19 //  Base-from-member arity configuration macro  ------------------------------//
    20 
    21 // The following macro determines how many arguments will be in the largest
    22 // constructor template of base_from_member.  Constructor templates will be
    23 // generated from one argument to this maximum.  Code from other files can read
    24 // this number if they need to always match the exact maximum base_from_member
    25 // uses.  The maximum constructor length can be changed by overriding the
    26 // #defined constant.  Make sure to apply the override, if any, for all source
    27 // files during project compiling for consistency.
    28 
    29 // Contributed by Jonathan Turkanis
    30 
    31 #ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
    32 #define BOOST_BASE_FROM_MEMBER_MAX_ARITY  10
    33 #endif
    34 
    35 
    36 //  An iteration of a constructor template for base_from_member  -------------//
    37 
    38 // A macro that should expand to:
    39 //     template < typename T1, ..., typename Tn >
    40 //     base_from_member( T1 x1, ..., Tn xn )
    41 //         : member( x1, ..., xn )
    42 //         {}
    43 // This macro should only persist within this file.
    44 
    45 #define BOOST_PRIVATE_CTR_DEF( z, n, data )                            \
    46     template < BOOST_PP_ENUM_PARAMS(n, typename T) >                   \
    47     explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \
    48         : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \
    49         {}                                                             \
    50     /**/
    51 
    52 
    53 namespace boost
    54 {
    55 
    56 //  Base-from-member class template  -----------------------------------------//
    57 
    58 // Helper to initialize a base object so a derived class can use this
    59 // object in the initialization of another base class.  Used by
    60 // Dietmar Kuehl from ideas by Ron Klatcho to solve the problem of a
    61 // base class needing to be initialized by a member.
    62 
    63 // Contributed by Daryle Walker
    64 
    65 template < typename MemberType, int UniqueID = 0 >
    66 class base_from_member
    67 {
    68 protected:
    69     MemberType  member;
    70 
    71     base_from_member()
    72         : member()
    73         {}
    74 
    75     BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
    76      BOOST_PRIVATE_CTR_DEF, _ )
    77 
    78 };  // boost::base_from_member
    79 
    80 }  // namespace boost
    81 
    82 
    83 // Undo any private macros
    84 #undef BOOST_PRIVATE_CTR_DEF
    85 
    86 
    87 #endif  // BOOST_UTILITY_BASE_FROM_MEMBER_HPP