$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r50250 - trunk/boost/flyweight
From: joaquin_at_[hidden]
Date: 2008-12-12 16:06:02
Author: joaquin
Date: 2008-12-12 16:06:02 EST (Fri, 12 Dec 2008)
New Revision: 50250
URL: http://svn.boost.org/trac/boost/changeset/50250
Log:
rewritten the workaround in rev 50235 in a more maintainable fashion
Text files modified: 
   trunk/boost/flyweight/flyweight.hpp |   136 +++++++++++++++------------------------ 
   1 files changed, 52 insertions(+), 84 deletions(-)
Modified: trunk/boost/flyweight/flyweight.hpp
==============================================================================
--- trunk/boost/flyweight/flyweight.hpp	(original)
+++ trunk/boost/flyweight/flyweight.hpp	2008-12-12 16:06:02 EST (Fri, 12 Dec 2008)
@@ -56,67 +56,14 @@
 
 struct unmatched_arg;
 
-} /* namespace flyweights::detail */
-
-#if BOOST_WORKAROUND(__SUNPRO_CC,<=0x590)
-/* Workaround for http://bugs.sun.com/view_bug.do?bug_id=6782987
- * from Simon Atanasyan.
+/* Boost.Parameter structures for use in flyweight.
+ * NB: these types are derived from instead of typedef'd to force their
+ * instantiation, which solves http://bugs.sun.com/view_bug.do?bug_id=6782987
+ * as found out by Simon Atanasyan.
  */
 
-template struct parameter::parameters<
-  parameter::optional<
-    parameter::deduced<tag<> >,
-    detail::is_tag<boost::mpl::_>
-  >,
-  parameter::optional<
-    parameter::deduced<tracking<> >,
-    is_tracking<boost::mpl::_>
-  >,
-  parameter::optional<
-    parameter::deduced<factory<> >,
-    is_factory<boost::mpl::_>
-  >,
-  parameter::optional<
-    parameter::deduced<locking<> >,
-    is_locking<boost::mpl::_>
-  >,
-  parameter::optional<
-    parameter::deduced<holder<> >,
-    is_holder<boost::mpl::_>
-  >
->;
-
-template struct parameter::parameters<
-  parameter::optional<
-    parameter::deduced<
-      detail::unmatched_arg
-    >,
-    mpl::not_<
-      mpl::or_<
-        detail::is_tag<boost::mpl::_>,
-        is_tracking<boost::mpl::_>,
-        is_factory<boost::mpl::_>,
-        is_locking<boost::mpl::_>,
-        is_holder<boost::mpl::_>
-      >
-    >
-  >
->;
-#endif
-
-template<
-  typename T,
-  typename Arg1,typename Arg2,typename Arg3,typename Arg4,typename Arg5
->
-class flyweight
-{
-private:
-  typedef typename mpl::if_<
-    detail::is_value<T>,
-    T,
-    detail::default_value_policy<T>
-  >::type                                      value_policy;
-  typedef parameter::parameters<
+struct flyweight_signature:
+  parameter::parameters<
     parameter::optional<
       parameter::deduced<tag<> >,
       detail::is_tag<boost::mpl::_>
@@ -137,27 +84,11 @@
       parameter::deduced<holder<> >,
       is_holder<boost::mpl::_>
     >
-  >                                            signature;
-  typedef typename signature::bind<
-    Arg1,Arg2,Arg3,Arg4,Arg5
-  >::type                                      args;
-  typedef typename parameter::binding<
-    args,tag<>,mpl::na
-  >::type                                      tag_type;
-  typedef typename parameter::binding<
-    args,tracking<>,refcounted
-  >::type                                      tracking_policy;
-  typedef typename parameter::binding<
-    args,factory<>,hashed_factory<>
-  >::type                                      factory_specifier;
-  typedef typename parameter::binding<
-    args,locking<>,simple_locking
-  >::type                                      locking_policy;
-  typedef typename parameter::binding<
-    args,holder<>,static_holder
-  >::type                                      holder_specifier;
-  
-  typedef parameter::parameters<
+  >
+{};
+
+struct flyweight_unmatched_signature:
+  parameter::parameters<
     parameter::optional<
       parameter::deduced<
         detail::unmatched_arg
@@ -172,14 +103,51 @@
         >
       >
     >
-  >                                            unmatched_signature;
-  typedef typename unmatched_signature::bind<
+  >
+{};
+
+} /* namespace flyweights::detail */
+
+template<
+  typename T,
+  typename Arg1,typename Arg2,typename Arg3,typename Arg4,typename Arg5
+>
+class flyweight
+{
+private:
+  typedef typename mpl::if_<
+    detail::is_value<T>,
+    T,
+    detail::default_value_policy<T>
+  >::type                                 value_policy;
+  typedef typename detail::
+  flyweight_signature::bind<
+    Arg1,Arg2,Arg3,Arg4,Arg5
+  >::type                                 args;
+  typedef typename parameter::binding<
+    args,tag<>,mpl::na
+  >::type                                 tag_type;
+  typedef typename parameter::binding<
+    args,tracking<>,refcounted
+  >::type                                 tracking_policy;
+  typedef typename parameter::binding<
+    args,factory<>,hashed_factory<>
+  >::type                                 factory_specifier;
+  typedef typename parameter::binding<
+    args,locking<>,simple_locking
+  >::type                                 locking_policy;
+  typedef typename parameter::binding<
+    args,holder<>,static_holder
+  >::type                                 holder_specifier;
+
+  typedef typename detail::
+  flyweight_unmatched_signature::bind<
     Arg1,Arg2,Arg3,Arg4,Arg5
-  >::type                                      unmatched_args;
+  >::type                                 unmatched_args;
   typedef typename parameter::binding<
     unmatched_args,detail::unmatched_arg,
     detail::unmatched_arg
-  >::type                                      unmatched_arg_detected;
+  >::type                                 unmatched_arg_detected;
 
   /* You have passed a type in the specification of a flyweight type that
    * could not be interpreted as a valid argument.