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 
base_from_member()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
88