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: // .) williamr@2: williamr@2: // See 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 williamr@2: #include williamr@2: #include williamr@2: #include 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