diff --git a/base_from_member.html b/base_from_member.html index 9a1e433..90048b0 100644 --- a/base_from_member.html +++ b/base_from_member.html @@ -130,6 +130,10 @@ particular member type does not need to concern itself with the integer.
+#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY +#define BOOST_BASE_FROM_MEMBER_MAX_ARITY 10 +#endif + template < typename MemberType, int UniqueID = 0 > class boost::base_from_member { @@ -171,6 +175,14 @@ the template parameters of a templated constructor, make sure that the arguments are already close as possible to the actual type used in the data member's desired constructor. +The BOOST_BASE_FROM_MEMBER_MAX_ARITY macro constant specifies +the maximum argument length for the constructor templates. The constant +may be overridden if more (or less) argument configurations are needed. The +constant may be read for code that is expandable like the class template and +needs to maintain the same maximum size. (Example code would be a class that +uses this class template as a base class for a member with a flexible set of +constructors.)
+Usage
With the starting example, the
IOStream example classes. +fdoutbuf
sub-object needs @@ -337,6 +349,11 @@ with the exact pointer type used inswitcher
's constructor.Jonathan Turkanis + Supplied an implementation of generating the constructor templates that + can be controlled and automated with macros. The implementation uses + the Preprocessor library. + Daryle Walker Started the library. Contributed the test file base_from_member_test.cpp. @@ -344,9 +361,9 @@ with the exact pointer type used in switcher
's constructor.
-Revised: 14 June 2003
+Revised: 28 August 2004
-Copyright 2001, 2003 Daryle Walker. Use, modification, and distribution +
Copyright 2001, 2003, 2004 Daryle Walker. Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
diff --git a/include/boost/utility/base_from_member.hpp b/include/boost/utility/base_from_member.hpp index cde7571..4a95521 100644 --- a/include/boost/utility/base_from_member.hpp +++ b/include/boost/utility/base_from_member.hpp @@ -10,6 +10,44 @@ #define BOOST_UTILITY_BASE_FROM_MEMBER_HPP #include// required for parameter defaults +#include +#include +#include +#include + + +// Base-from-member arity configuration macro ------------------------------// + +// The following macro determines how many arguments will be in the largest +// constructor template of base_from_member. Constructor templates will be +// generated from one argument to this maximum. Code from other files can read +// this number if they need to always match the exact maximum base_from_member +// uses. The maximum constructor length can be changed by overriding the +// #defined constant. Make sure to apply the override, if any, for all source +// files during project compiling for consistency. + +// Contributed by Jonathan Turkanis + +#ifndef BOOST_BASE_FROM_MEMBER_MAX_ARITY +#define BOOST_BASE_FROM_MEMBER_MAX_ARITY 10 +#endif + + +// An iteration of a constructor template for base_from_member -------------// + +// A macro that should expand to: +// template < typename T1, ..., typename Tn > +// base_from_member( T1 x1, ..., Tn xn ) +// : member( x1, ..., xn ) +// {} +// This macro should only persist within this file. + +#define BOOST_PRIVATE_CTR_DEF( z, n, data ) \ + template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ + explicit base_from_member( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ + : member( BOOST_PP_ENUM_PARAMS(n, x) ) \ + {} \ + /**/ namespace boost @@ -34,66 +72,16 @@ protected: : member() {} - template< typename T1 > - explicit base_from_member( T1 x1 ) - : member( x1 ) - {} - - template< typename T1, typename T2 > - base_from_member( T1 x1, T2 x2 ) - : member( x1, x2 ) - {} - - template< typename T1, typename T2, typename T3 > - base_from_member( T1 x1, T2 x2, T3 x3 ) - : member( x1, x2, x3 ) - {} - - template< typename T1, typename T2, typename T3, typename T4 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4 ) - : member( x1, x2, x3, x4 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5 ) - : member( x1, x2, x3, x4, x5 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6 ) - : member( x1, x2, x3, x4, x5, x6 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7 ) - : member( x1, x2, x3, x4, x5, x6, x7 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8 ) - : member( x1, x2, x3, x4, x5, x6, x7, x8 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8, - T9 x9 ) - : member( x1, x2, x3, x4, x5, x6, x7, x8, x9 ) - {} - - template< typename T1, typename T2, typename T3, typename T4, typename T5, - typename T6, typename T7, typename T8, typename T9, typename T10 > - base_from_member( T1 x1, T2 x2, T3 x3, T4 x4, T5 x5, T6 x6, T7 x7, T8 x8, - T9 x9, T10 x10 ) - : member( x1, x2, x3, x4, x5, x6, x7, x8, x9, x10 ) - {} + BOOST_PP_REPEAT_FROM_TO( 1, BOOST_PP_INC(BOOST_BASE_FROM_MEMBER_MAX_ARITY), + BOOST_PRIVATE_CTR_DEF, _ ) }; // boost::base_from_member } // namespace boost +// Undo any private macros +#undef BOOST_PRIVATE_CTR_DEF + + #endif // BOOST_UTILITY_BASE_FROM_MEMBER_HPP