williamr@2: //  boost utility/base_from_member.hpp header file  --------------------------//
williamr@2: 
williamr@2: //  Copyright 2001, 2003, 2004 Daryle Walker.  Use, modification, and
williamr@2: //  distribution are subject to the Boost Software License, Version 1.0.  (See
williamr@2: //  accompanying file LICENSE_1_0.txt or a copy at
williamr@2: //  <http://www.boost.org/LICENSE_1_0.txt>.)
williamr@2: 
williamr@2: //  See <http://www.boost.org/libs/utility/> for the library's home page.
williamr@2: 
williamr@2: #ifndef BOOST_UTILITY_BASE_FROM_MEMBER_HPP
williamr@2: #define BOOST_UTILITY_BASE_FROM_MEMBER_HPP
williamr@2: 
williamr@2: #include <boost/preprocessor/arithmetic/inc.hpp>
williamr@2: #include <boost/preprocessor/repetition/enum_binary_params.hpp>
williamr@2: #include <boost/preprocessor/repetition/enum_params.hpp>
williamr@2: #include <boost/preprocessor/repetition/repeat_from_to.hpp>
williamr@2: 
williamr@2: 
williamr@2: //  Base-from-member arity configuration macro  ------------------------------//
williamr@2: 
williamr@2: // The following macro determines how many arguments will be in the largest
williamr@2: // constructor template of base_from_member.  Constructor templates will be
williamr@2: // generated from one argument to this maximum.  Code from other files can read
williamr@2: // this number if they need to always match the exact maximum base_from_member
williamr@2: // uses.  The maximum constructor length can be changed by overriding the
williamr@2: // #defined constant.  Make sure to apply the override, if any, for all source
williamr@2: // files during project compiling for consistency.
williamr@2: 
williamr@2: // Contributed by Jonathan Turkanis
williamr@2: 
williamr@2: #ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY
williamr@2: #define BOOST_BASE_FROM_MEMBER_MAX_ARITY  10
williamr@2: #endif
williamr@2: 
williamr@2: 
williamr@2: //  An iteration of a constructor template for base_from_member  -------------//
williamr@2: 
williamr@2: // A macro that should expand to:
williamr@2: //     template < typename T1, ..., typename Tn >
williamr@2: //     base_from_member( T1 x1, ..., Tn xn )
williamr@2: //         : member( x1, ..., xn )
williamr@2: //         {}
williamr@2: // This macro should only persist within this file.
williamr@2: 
williamr@2: #define BOOST_PRIVATE_CTR_DEF( z, n, data )                            \
williamr@2:     template < BOOST_PP_ENUM_PARAMS(n, typename T) >                   \
williamr@2:     explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) )  \
williamr@2:         : member( BOOST_PP_ENUM_PARAMS(n, x) )                         \
williamr@2:         {}                                                             \
williamr@2:     /**/
williamr@2: 
williamr@2: 
williamr@2: namespace boost
williamr@2: {
williamr@2: 
williamr@2: //  Base-from-member class template  -----------------------------------------//
williamr@2: 
williamr@2: // Helper to initialize a base object so a derived class can use this
williamr@2: // object in the initialization of another base class.  Used by
williamr@2: // Dietmar Kuehl from ideas by Ron Klatcho to solve the problem of a
williamr@2: // base class needing to be initialized by a member.
williamr@2: 
williamr@2: // Contributed by Daryle Walker
williamr@2: 
williamr@2: template < typename MemberType, int UniqueID = 0 >
williamr@2: class base_from_member
williamr@2: {
williamr@2: protected:
williamr@2:     MemberType  member;
williamr@2: 
williamr@2:     base_from_member()
williamr@2:         : member()
williamr@2:         {}
williamr@2: 
williamr@2:     BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY),
williamr@2:      BOOST_PRIVATE_CTR_DEF, _ )
williamr@2: 
williamr@2: };  // boost::base_from_member
williamr@2: 
williamr@2: }  // namespace boost
williamr@2: 
williamr@2: 
williamr@2: // Undo any private macros
williamr@2: #undef BOOST_PRIVATE_CTR_DEF
williamr@2: 
williamr@2: 
williamr@2: #endif  // BOOST_UTILITY_BASE_FROM_MEMBER_HPP