$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r62169 - in branches/release: . boost boost/algorithm/string boost/archive boost/bimap boost/config boost/config/compiler boost/detail boost/filesystem boost/functional/hash boost/fusion boost/gil boost/graph boost/integer boost/interprocess boost/intrusive boost/iostreams boost/math boost/numeric/ublas boost/program_options boost/property_tree boost/proto boost/proto/detail boost/python boost/range boost/regex boost/serialization boost/signals boost/signals2 boost/spirit boost/spirit/home boost/spirit/home/karma boost/spirit/home/support boost/statechart boost/system boost/thread boost/tr1 boost/type_traits boost/unordered boost/utility boost/uuid boost/variant boost/wave doc libs libs/array/doc libs/array/test libs/bimap libs/config libs/config/doc libs/filesystem libs/functional/hash libs/fusion libs/graph_parallel libs/integer libs/interprocess libs/intrusive libs/iostreams libs/math libs/mpl/doc/refmanual libs/mpl/doc/src/refmanual libs/numeric/ublas libs/numeric/ublas/doc libs/program_options libs/property_tree libs/proto/doc libs/python libs/range libs/range/doc libs/regex libs/regex/doc libs/serialization libs/signals libs/signals2 libs/spirit libs/spirit/classic/example libs/spirit/doc libs/spirit/example libs/spirit/phoenix libs/spirit/test libs/spirit/test/qi libs/statechart libs/static_assert libs/system libs/thread libs/timer libs/tr1 libs/type_traits libs/unordered libs/utility libs/utility/swap/test libs/uuid libs/wave more more/getting_started people status tools tools/bcp tools/boostbook tools/build/v2 tools/build/v2/tools tools/inspect tools/jam tools/quickbook tools/regression tools/release tools/wave wiki
From: eric_at_[hidden]
Date: 2010-05-23 23:59:00
Author: eric_niebler
Date: 2010-05-23 23:58:59 EDT (Sun, 23 May 2010)
New Revision: 62169
URL: http://svn.boost.org/trac/boost/changeset/62169
Log:
Merged revisions 62139 via svnmerge from 
https://svn.boost.org/svn/boost/trunk
........
  r62139 | eric_niebler | 2010-05-22 07:59:29 -0400 (Sat, 22 May 2010) | 1 line
  
  generalized sub-domain implementation from Daniel Wallin
........
Added:
   branches/release/boost/proto/detail/deduce_domain.hpp
      - copied unchanged from r62139, /trunk/boost/proto/detail/deduce_domain.hpp
Properties modified: 
   branches/release/   (props changed)
   branches/release/INSTALL   (props changed)
   branches/release/Jamroot   (props changed)
   branches/release/LICENSE_1_0.txt   (props changed)
   branches/release/boost/   (props changed)
   branches/release/boost-build.jam   (props changed)
   branches/release/boost.css   (props changed)
   branches/release/boost.png   (props changed)
   branches/release/boost/algorithm/string/   (props changed)
   branches/release/boost/archive/   (props changed)
   branches/release/boost/array.hpp   (props changed)
   branches/release/boost/bimap/   (props changed)
   branches/release/boost/config/   (props changed)
   branches/release/boost/config/compiler/   (props changed)
   branches/release/boost/detail/   (props changed)
   branches/release/boost/filesystem/   (props changed)
   branches/release/boost/functional/hash/   (props changed)
   branches/release/boost/fusion/   (props changed)
   branches/release/boost/gil/   (props changed)
   branches/release/boost/graph/   (props changed)
   branches/release/boost/integer/   (props changed)
   branches/release/boost/interprocess/   (props changed)
   branches/release/boost/intrusive/   (props changed)
   branches/release/boost/iostreams/   (props changed)
   branches/release/boost/math/   (props changed)
   branches/release/boost/numeric/ublas/   (props changed)
   branches/release/boost/program_options/   (props changed)
   branches/release/boost/property_tree/   (props changed)
   branches/release/boost/python/   (props changed)
   branches/release/boost/range/   (props changed)
   branches/release/boost/regex/   (props changed)
   branches/release/boost/serialization/   (props changed)
   branches/release/boost/serialization/factory.hpp   (props changed)
   branches/release/boost/signals/   (props changed)
   branches/release/boost/signals2/   (props changed)
   branches/release/boost/spirit/   (props changed)
   branches/release/boost/spirit/home/   (props changed)
   branches/release/boost/spirit/home/karma/   (props changed)
   branches/release/boost/spirit/home/support/attributes.hpp   (props changed)
   branches/release/boost/statechart/   (props changed)
   branches/release/boost/system/   (props changed)
   branches/release/boost/thread/   (props changed)
   branches/release/boost/thread.hpp   (props changed)
   branches/release/boost/tr1/   (props changed)
   branches/release/boost/type_traits/   (props changed)
   branches/release/boost/unordered/   (props changed)
   branches/release/boost/utility/   (props changed)
   branches/release/boost/utility/value_init.hpp   (props changed)
   branches/release/boost/uuid/   (props changed)
   branches/release/boost/variant/   (props changed)
   branches/release/boost/version.hpp   (props changed)
   branches/release/boost/wave/   (props changed)
   branches/release/bootstrap.bat   (props changed)
   branches/release/bootstrap.sh   (props changed)
   branches/release/doc/   (props changed)
   branches/release/index.htm   (props changed)
   branches/release/index.html   (props changed)
   branches/release/libs/   (props changed)
   branches/release/libs/array/doc/array.xml   (props changed)
   branches/release/libs/array/test/array0.cpp   (props changed)
   branches/release/libs/bimap/   (props changed)
   branches/release/libs/config/   (props changed)
   branches/release/libs/config/doc/   (props changed)
   branches/release/libs/filesystem/   (props changed)
   branches/release/libs/functional/hash/   (props changed)
   branches/release/libs/fusion/   (props changed)
   branches/release/libs/graph_parallel/   (props changed)
   branches/release/libs/integer/   (props changed)
   branches/release/libs/interprocess/   (props changed)
   branches/release/libs/intrusive/   (props changed)
   branches/release/libs/iostreams/   (props changed)
   branches/release/libs/libraries.htm   (props changed)
   branches/release/libs/maintainers.txt   (props changed)
   branches/release/libs/math/   (props changed)
   branches/release/libs/mpl/doc/refmanual/broken-compiler-workarounds.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/categorized-index-concepts.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/cfg-no-preprocessed-headers.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/composition-and-argument-binding.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/data-types-concepts.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/data-types-miscellaneous.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/extensible-associative-sequence.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/inserter-class.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/tag-dispatched-metafunction.html   (props changed)
   branches/release/libs/mpl/doc/refmanual/trivial-metafunctions-summary.html   (props changed)
   branches/release/libs/mpl/doc/src/refmanual/Iterators-Iterator.rst   (props changed)
   branches/release/libs/numeric/ublas/   (props changed)
   branches/release/libs/numeric/ublas/doc/   (props changed)
   branches/release/libs/program_options/   (props changed)
   branches/release/libs/property_tree/   (props changed)
   branches/release/libs/python/   (props changed)
   branches/release/libs/range/   (props changed)
   branches/release/libs/range/doc/   (props changed)
   branches/release/libs/regex/   (props changed)
   branches/release/libs/regex/doc/   (props changed)
   branches/release/libs/serialization/   (props changed)
   branches/release/libs/signals/   (props changed)
   branches/release/libs/signals2/   (props changed)
   branches/release/libs/spirit/   (props changed)
   branches/release/libs/spirit/classic/example/   (props changed)
   branches/release/libs/spirit/doc/   (props changed)
   branches/release/libs/spirit/example/   (props changed)
   branches/release/libs/spirit/phoenix/   (props changed)
   branches/release/libs/spirit/test/   (props changed)
   branches/release/libs/spirit/test/qi/optional.cpp   (props changed)
   branches/release/libs/statechart/   (props changed)
   branches/release/libs/static_assert/   (props changed)
   branches/release/libs/system/   (props changed)
   branches/release/libs/thread/   (props changed)
   branches/release/libs/timer/   (props changed)
   branches/release/libs/tr1/   (props changed)
   branches/release/libs/type_traits/   (props changed)
   branches/release/libs/unordered/   (props changed)
   branches/release/libs/utility/   (props changed)
   branches/release/libs/utility/swap.html   (props changed)
   branches/release/libs/utility/swap/test/std_bitset.cpp   (props changed)
   branches/release/libs/utility/value_init.htm   (props changed)
   branches/release/libs/utility/value_init_test.cpp   (props changed)
   branches/release/libs/uuid/   (props changed)
   branches/release/libs/wave/   (props changed)
   branches/release/more/   (props changed)
   branches/release/more/getting_started/   (props changed)
   branches/release/people/   (props changed)
   branches/release/rst.css   (props changed)
   branches/release/status/   (props changed)
   branches/release/status/Jamfile.v2   (props changed)
   branches/release/tools/   (props changed)
   branches/release/tools/bcp/   (props changed)
   branches/release/tools/boostbook/   (props changed)
   branches/release/tools/build/v2/   (props changed)
   branches/release/tools/build/v2/tools/   (props changed)
   branches/release/tools/inspect/   (props changed)
   branches/release/tools/jam/   (props changed)
   branches/release/tools/quickbook/   (props changed)
   branches/release/tools/regression/   (props changed)
   branches/release/tools/release/   (props changed)
   branches/release/tools/wave/   (props changed)
   branches/release/wiki/   (props changed)
Text files modified: 
   branches/release/boost/proto/domain.hpp              |   454 ++++++++++++++------------------------- 
   branches/release/libs/proto/doc/acknowledgements.qbk |     5                                         
   2 files changed, 169 insertions(+), 290 deletions(-)
Modified: branches/release/boost/proto/domain.hpp
==============================================================================
--- branches/release/boost/proto/domain.hpp	(original)
+++ branches/release/boost/proto/domain.hpp	2010-05-23 23:58:59 EDT (Sun, 23 May 2010)
@@ -1,305 +1,179 @@
-#ifndef BOOST_PP_IS_ITERATING
-    ///////////////////////////////////////////////////////////////////////////////
-    /// \file domain.hpp
-    /// Contains definition of domain\<\> class template and helpers for
-    /// defining domains with a generator and a grammar for controlling
-    /// operator overloading.
-    //
-    //  Copyright 2008 Eric Niebler. Distributed under the Boost
-    //  Software License, Version 1.0. (See accompanying file
-    //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-    #ifndef BOOST_PROTO_DOMAIN_HPP_EAN_02_13_2007
-    #define BOOST_PROTO_DOMAIN_HPP_EAN_02_13_2007
-
-    #include <boost/ref.hpp>
-    #include <boost/mpl/bool.hpp>
-    #include <boost/mpl/assert.hpp>
-    #include <boost/preprocessor/cat.hpp>
-    #include <boost/preprocessor/facilities/intercept.hpp>
-    #include <boost/preprocessor/iteration/iterate.hpp>
-    #include <boost/preprocessor/repetition/repeat.hpp>
-    #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
-    #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
-    #include <boost/preprocessor/repetition/enum_params.hpp>
-    #include <boost/preprocessor/arithmetic/inc.hpp>
-    #include <boost/preprocessor/arithmetic/dec.hpp>
-    #include <boost/preprocessor/arithmetic/add.hpp>
-    #include <boost/preprocessor/control/expr_if.hpp>
-    #include <boost/proto/proto_fwd.hpp>
-    #include <boost/proto/generate.hpp>
-
-    #ifdef _MSC_VER
-    #define BOOST_PROTO_DISABLE_MSVC_C4584 __pragma(warning(disable: 4584))
-    #else
-    #define BOOST_PROTO_DISABLE_MSVC_C4584 
-    #endif
+///////////////////////////////////////////////////////////////////////////////
+/// \file domain.hpp
+/// Contains definition of domain\<\> class template and helpers for
+/// defining domains with a generator and a grammar for controlling
+/// operator overloading.
+//
+//  Copyright 2008 Eric Niebler. Distributed under the Boost
+//  Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_PROTO_DOMAIN_HPP_EAN_02_13_2007
+#define BOOST_PROTO_DOMAIN_HPP_EAN_02_13_2007
+
+#include <boost/config.hpp>
+#include <boost/ref.hpp>
+#include <boost/proto/generate.hpp>
+#include <boost/proto/detail/deduce_domain.hpp>
 
-    namespace boost { namespace proto
-    {
-
-        namespace detail
-        {
-            struct not_a_generator
-            {};
+namespace boost { namespace proto
+{
 
-            struct not_a_grammar
-            {};
+    namespace detail
+    {
+        struct not_a_generator
+        {};
 
-            struct not_a_domain
-            {};
+        struct not_a_grammar
+        {};
 
-            template<typename Super>
-            struct super_domain : super_domain<typename Super::super>
-            {
-                typedef Super super;
-                using super_domain<typename Super::super>::test;
-                super_domain test(super_domain);
-                super_domain test(super_domain<default_domain> const &);
-                super *& get_super();
-            };
-
-            template<>
-            struct super_domain<not_a_domain>
-            {
-                typedef not_a_domain super;
-                super_domain test(...);
-                super *& get_super();
-            };
-
-            template<>
-            struct super_domain<default_domain>
-            {
-                typedef default_domain super;
-                template<typename T> T test(T);
-                super *& get_super();
-            };
-
-            template<typename T, int N> char (&select_domain(T*&))[N];
-            template<typename T, int N> char (&select_domain(...))[1];
-
-            template<
-                int Index
-                BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(
-                    BOOST_PROTO_MAX_ARITY
-                  , typename D
-                  , = void BOOST_PP_INTERCEPT
-                )
-            >
-            struct select_nth
-            {
-                BOOST_MPL_ASSERT_MSG((false), PROTO_DOMAIN_MISMATCH, (select_nth));
-                typedef not_a_domain type;
-            };
-
-            template<typename Void = void>
-            struct deduce_domain0
-            {
-                typedef default_domain type;
-            };
-
-            #define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PROTO_MAX_ARITY, <boost/proto/domain.hpp>))
-            #include BOOST_PP_ITERATE()
-        }
+        struct not_a_domain
+        {};
+    }
 
-        namespace domainns_
-        {
-            /// \brief For use in defining domain tags to be used
-            /// with \c proto::extends\<\>. A \e Domain associates
-            /// an expression type with a \e Generator, and optionally
-            /// a \e Grammar.
-            ///
-            /// The Generator determines how new expressions in the
-            /// domain are constructed. Typically, a generator wraps
-            /// all new expressions in a wrapper that imparts
-            /// domain-specific behaviors to expressions within its
-            /// domain. (See \c proto::extends\<\>.)
-            ///
-            /// The Grammar determines whether a given expression is
-            /// valid within the domain, and automatically disables
-            /// any operator overloads which would cause an invalid
-            /// expression to be created. By default, the Grammar
-            /// parameter defaults to the wildcard, \c proto::_, which
-            /// makes all expressions valid within the domain.
-            ///
-            /// Example:
-            /// \code
-            /// template<typename Expr>
-            /// struct MyExpr;
-            ///
-            /// struct MyGrammar
-            ///   : or_< terminal<_>, plus<MyGrammar, MyGrammar> >
-            /// {};
-            ///
-            /// // Define MyDomain, in which all expressions are
-            /// // wrapped in MyExpr<> and only expressions that
-            /// // conform to MyGrammar are allowed.
-            /// struct MyDomain
-            ///   : domain<generator<MyExpr>, MyGrammar>
-            /// {};
-            ///
-            /// // Use MyDomain to define MyExpr
-            /// template<typename Expr>
-            /// struct MyExpr
-            ///   : extends<Expr, MyExpr<Expr>, MyDomain>
-            /// {
-            ///     // ...
-            /// };
-            /// \endcode
-            ///
-            BOOST_PROTO_DISABLE_MSVC_C4584
-            template<
-                typename Generator // = default_generator
-              , typename Grammar   // = proto::_
-              , typename Super     // = detail::not_a_domain
-            >
-            struct domain
-              : detail::super_domain<Super>
-              , Generator
-            {
-                typedef Generator proto_generator;
-                typedef Grammar proto_grammar;
-
-                /// INTERNAL ONLY
-                typedef void proto_is_domain_;
-            };
-
-            /// \brief The domain expressions have by default, if
-            /// \c proto::extends\<\> has not been used to associate
-            /// a domain with an expression.
-            ///
-            struct default_domain
-              : domain<>
-            {};
-
-            /// \brief A pseudo-domain for use in functions and
-            /// metafunctions that require a domain parameter. It
-            /// indicates that the domain of the parent node should
-            /// be inferred from the domains of the child nodes.
-            ///
-            /// \attention \c deduce_domain is not itself a valid domain.
-            ///
-            struct deduce_domain
-              : domain<detail::not_a_generator, detail::not_a_grammar, detail::not_a_domain>
-            {};
-        }
-
-        namespace result_of
+    namespace domainns_
+    {
+        /// \brief For use in defining domain tags to be used
+        /// with \c proto::extends\<\>. A \e Domain associates
+        /// an expression type with a \e Generator, and optionally
+        /// a \e Grammar.
+        ///
+        /// The Generator determines how new expressions in the
+        /// domain are constructed. Typically, a generator wraps
+        /// all new expressions in a wrapper that imparts
+        /// domain-specific behaviors to expressions within its
+        /// domain. (See \c proto::extends\<\>.)
+        ///
+        /// The Grammar determines whether a given expression is
+        /// valid within the domain, and automatically disables
+        /// any operator overloads which would cause an invalid
+        /// expression to be created. By default, the Grammar
+        /// parameter defaults to the wildcard, \c proto::_, which
+        /// makes all expressions valid within the domain.
+        ///
+        /// Example:
+        /// \code
+        /// template<typename Expr>
+        /// struct MyExpr;
+        ///
+        /// struct MyGrammar
+        ///   : or_< terminal<_>, plus<MyGrammar, MyGrammar> >
+        /// {};
+        ///
+        /// // Define MyDomain, in which all expressions are
+        /// // wrapped in MyExpr<> and only expressions that
+        /// // conform to MyGrammar are allowed.
+        /// struct MyDomain
+        ///   : domain<generator<MyExpr>, MyGrammar>
+        /// {};
+        ///
+        /// // Use MyDomain to define MyExpr
+        /// template<typename Expr>
+        /// struct MyExpr
+        ///   : extends<Expr, MyExpr<Expr>, MyDomain>
+        /// {
+        ///     // ...
+        /// };
+        /// \endcode
+        ///
+        template<
+            typename Generator // = default_generator
+          , typename Grammar   // = proto::_
+          , typename Super     // = detail::not_a_domain
+        >
+        struct domain
+          : Generator
         {
-            /// A metafunction that returns \c mpl::true_
-            /// if the type \c T is the type of a Proto domain;
-            /// \c mpl::false_ otherwise. If \c T inherits from
-            /// \c proto::domain\<\>, \c is_domain\<T\> is
-            /// \c mpl::true_.
-            template<typename T, typename Void  /* = void*/>
-            struct is_domain
-              : mpl::false_
-            {};
+            typedef Generator proto_generator;
+            typedef Grammar   proto_grammar;
+            typedef Super     proto_super_domain;
 
             /// INTERNAL ONLY
-            ///
-            template<typename T>
-            struct is_domain<T, typename T::proto_is_domain_>
-              : mpl::true_
-            {};
-
-            /// A metafunction that returns the domain of
-            /// a given type. If \c T is a Proto expression
-            /// type, it returns that expression's associated
-            /// domain. If not, it returns
-            /// \c proto::default_domain.
-            template<typename T, typename Void /* = void*/>
-            struct domain_of
-            {
-                typedef default_domain type;
-            };
+            typedef void proto_is_domain_;
+        };
 
-            /// INTERNAL ONLY
-            ///
-            template<typename T>
-            struct domain_of<T, typename T::proto_is_expr_>
-            {
-                typedef typename T::proto_domain type;
-            };
+        /// \brief The domain expressions have by default, if
+        /// \c proto::extends\<\> has not been used to associate
+        /// a domain with an expression.
+        ///
+        struct default_domain
+          : domain<>
+        {};
+
+        /// \brief A pseudo-domain for use in functions and
+        /// metafunctions that require a domain parameter. It
+        /// indicates that the domain of the parent node should
+        /// be inferred from the domains of the child nodes.
+        ///
+        /// \attention \c deduce_domain is not itself a valid domain.
+        ///
+        struct deduce_domain
+          : domain<detail::not_a_generator, detail::not_a_grammar, detail::not_a_domain>
+        {};
+    }
 
-            /// INTERNAL ONLY
-            ///
-            template<typename T>
-            struct domain_of<T &, void>
-            {
-                typedef typename domain_of<T>::type type;
-            };
+    namespace result_of
+    {
+        /// A metafunction that returns \c mpl::true_
+        /// if the type \c T is the type of a Proto domain;
+        /// \c mpl::false_ otherwise. If \c T inherits from
+        /// \c proto::domain\<\>, \c is_domain\<T\> is
+        /// \c mpl::true_.
+        template<typename T, typename Void  /* = void*/>
+        struct is_domain
+          : mpl::false_
+        {};
+
+        /// INTERNAL ONLY
+        ///
+        template<typename T>
+        struct is_domain<T, typename T::proto_is_domain_>
+          : mpl::true_
+        {};
+
+        /// A metafunction that returns the domain of
+        /// a given type. If \c T is a Proto expression
+        /// type, it returns that expression's associated
+        /// domain. If not, it returns
+        /// \c proto::default_domain.
+        template<typename T, typename Void /* = void*/>
+        struct domain_of
+        {
+            typedef default_domain type;
+        };
 
-            /// INTERNAL ONLY
-            ///
-            template<typename T>
-            struct domain_of<boost::reference_wrapper<T>, void>
-            {
-                typedef typename domain_of<T>::type type;
-            };
+        /// INTERNAL ONLY
+        ///
+        template<typename T>
+        struct domain_of<T, typename T::proto_is_expr_>
+        {
+            typedef typename T::proto_domain type;
+        };
 
-            /// INTERNAL ONLY
-            ///
-            template<typename T>
-            struct domain_of<boost::reference_wrapper<T> const, void>
-            {
-                typedef typename domain_of<T>::type type;
-            };
-        }
-    }}
-
-    #endif
-
-#else
-
-    #define N BOOST_PP_ITERATION()
-
-            template<BOOST_PP_ENUM_PARAMS(BOOST_PROTO_MAX_ARITY, typename T)>
-            struct select_nth<BOOST_PP_DEC(N), BOOST_PP_ENUM_PARAMS(BOOST_PROTO_MAX_ARITY, T)>
-            {
-                typedef BOOST_PP_CAT(T, BOOST_PP_DEC(N)) type;
-            };
-
-            template<BOOST_PP_ENUM_PARAMS(N, typename D)>
-            struct BOOST_PP_CAT(common_domain, N)
-            {
-                #define M0(Z, M, DATA)                                                              \
-                static detail::super_domain<BOOST_PP_CAT(D, M)> & BOOST_PP_CAT(d, M);               \
-                /**/
-                BOOST_PP_REPEAT(N, M0, ~)
-                #undef M0
-
-                enum e
-                {
-                    value0 = 0
-                    #define M0(Z, M, DATA)                                                          \
-                        BOOST_PP_EXPR_IF(M, .test)(BOOST_PP_CAT(d, M))                              \
-                    /**/
-                    #define M1(Z, M, DATA)                                                          \
-                      , BOOST_PP_CAT(value, BOOST_PP_INC(M)) =                                      \
-                        BOOST_PP_CAT(value, M) ?                                                    \
-                        BOOST_PP_CAT(value, M) :                                                    \
-                        sizeof(detail::select_domain<BOOST_PP_CAT(D, M), BOOST_PP_ADD(M, 2)>(       \
-                            BOOST_PP_REPEAT_ ## Z(N, M0, ~).get_super()                             \
-                        )) - 1                                                                      \
-                    /**/
-                    BOOST_PP_REPEAT(N, M1, ~)
-                    #undef M1
-                    #undef M0
-                  , value = BOOST_PP_CAT(value, N) - 1
-                };
-
-                typedef typename select_nth<value BOOST_PP_ENUM_TRAILING_PARAMS(N, D)>::type type;
-                //typedef BOOST_TYPEOF_TPL(d0.test(d1).test(d2).base()) type;
-            };
-
-            template<BOOST_PP_ENUM_PARAMS(N, typename E)>
-            struct BOOST_PP_CAT(deduce_domain, N)
-              : BOOST_PP_CAT(common_domain, N)<
-                    BOOST_PP_ENUM_BINARY_PARAMS(N, typename domain_of<E, >::type BOOST_PP_INTERCEPT)
-                >
-            {};
+        /// INTERNAL ONLY
+        ///
+        template<typename T>
+        struct domain_of<T &, void>
+        {
+            typedef typename domain_of<T>::type type;
+        };
+
+        /// INTERNAL ONLY
+        ///
+        template<typename T>
+        struct domain_of<boost::reference_wrapper<T>, void>
+        {
+            typedef typename domain_of<T>::type type;
+        };
 
-    #undef N
+        /// INTERNAL ONLY
+        ///
+        template<typename T>
+        struct domain_of<boost::reference_wrapper<T> const, void>
+        {
+            typedef typename domain_of<T>::type type;
+        };
+    }
+}}
 
 #endif
Modified: branches/release/libs/proto/doc/acknowledgements.qbk
==============================================================================
--- branches/release/libs/proto/doc/acknowledgements.qbk	(original)
+++ branches/release/libs/proto/doc/acknowledgements.qbk	2010-05-23 23:58:59 EDT (Sun, 23 May 2010)
@@ -19,6 +19,11 @@
 VM with msvc-7.1 available so I could track down portability issues on that
 compiler.
 
+Many thanks to Daniel Wallin who first implemented the code used to find the
+common domain among a set, accounting for super- and sub-domains. Thanks also
+to Jeremiah Willcock, John Bytheway and Krishna Achuthan who offered alternate
+solutions to this tricky programming problem.
+
 Thanks also to the developers of _PETE_. I found many good ideas there.
 
 [endsect]