$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r80989 - trunk/boost/format
From: steven_at_[hidden]
Date: 2012-10-14 21:28:53
Author: steven_watanabe
Date: 2012-10-14 21:28:53 EDT (Sun, 14 Oct 2012)
New Revision: 80989
URL: http://svn.boost.org/trac/boost/changeset/80989
Log:
Reduce code bloat from boost::format.  Fixes #4700.
Text files modified: 
   trunk/boost/format/feed_args.hpp     |    41 +++++++++++++++++++++++++++++++++++++++ 
   trunk/boost/format/format_class.hpp  |     2                                         
   trunk/boost/format/internals_fwd.hpp |     4 +++                                     
   3 files changed, 45 insertions(+), 2 deletions(-)
Modified: trunk/boost/format/feed_args.hpp
==============================================================================
--- trunk/boost/format/feed_args.hpp	(original)
+++ trunk/boost/format/feed_args.hpp	2012-10-14 21:28:53 EDT (Sun, 14 Oct 2012)
@@ -117,6 +117,39 @@
 #endif
 #endif  // -msvc workaround
 
+    template< class Ch, class Tr, class T>
+    void call_put_head(BOOST_IO_STD basic_ostream<Ch, Tr> & os, const void* x) {
+        put_head(os, *(typename ::boost::remove_reference<T>::type*)x);
+    }
+
+    template< class Ch, class Tr, class T>
+    void call_put_last(BOOST_IO_STD basic_ostream<Ch, Tr> & os, const void* x) {
+        put_last(os, *(T*)x);
+    }
+
+    template< class Ch, class Tr>
+    struct put_holder {
+        template<class T>
+        put_holder(T& t)
+          : arg(&t),
+            put_head(&call_put_head<Ch, Tr, T>),
+            put_last(&call_put_last<Ch, Tr, T>)
+        {}
+        const void* arg;
+        void (*put_head)(BOOST_IO_STD basic_ostream<Ch, Tr> & os, const void* x);
+        void (*put_last)(BOOST_IO_STD basic_ostream<Ch, Tr> & os, const void* x);
+    };
+    
+    template< class Ch, class Tr> inline
+    void put_head( BOOST_IO_STD basic_ostream<Ch, Tr> & os, const put_holder<Ch, Tr>& t) {
+        t.put_head(os, t.arg);
+    }
+    
+    template< class Ch, class Tr> inline
+    void put_last( BOOST_IO_STD basic_ostream<Ch, Tr> & os, const put_holder<Ch, Tr>& t) {
+        t.put_last(os, t.arg);
+    }
+
 
     template< class Ch, class Tr, class Alloc, class T> 
     void put( T x, 
@@ -258,7 +291,7 @@
 
     template<class Ch, class Tr, class Alloc, class T> 
     basic_format<Ch, Tr, Alloc>&  
-    feed (basic_format<Ch,Tr, Alloc>& self, T x) {
+    feed_impl (basic_format<Ch,Tr, Alloc>& self, T x) {
         if(self.dumped_) self.clear();
         distribute<Ch, Tr, Alloc, T> (self, x);
         ++self.cur_arg_;
@@ -268,6 +301,12 @@
         }
         return self;
     }
+
+    template<class Ch, class Tr, class Alloc, class T> inline
+    basic_format<Ch, Tr, Alloc>&  
+    feed (basic_format<Ch,Tr, Alloc>& self, T x) {
+        return feed_impl<Ch, Tr, Alloc, const put_holder<Ch, Tr>&>(self, put_holder<Ch, Tr>(x));
+    }
     
 } // namespace detail
 } // namespace io
Modified: trunk/boost/format/format_class.hpp
==============================================================================
--- trunk/boost/format/format_class.hpp	(original)
+++ trunk/boost/format/format_class.hpp	2012-10-14 21:28:53 EDT (Sun, 14 Oct 2012)
@@ -126,7 +126,7 @@
 
         template<class Ch2, class Tr2, class Alloc2, class T>  
         friend basic_format<Ch2, Tr2, Alloc2>&  
-        io::detail::feed (basic_format<Ch2, Tr2, Alloc2>&, T);
+        io::detail::feed_impl (basic_format<Ch2, Tr2, Alloc2>&, T);
 
         template<class Ch2, class Tr2, class Alloc2, class T>  friend   
         void io::detail::distribute (basic_format<Ch2, Tr2, Alloc2>&, T);
Modified: trunk/boost/format/internals_fwd.hpp
==============================================================================
--- trunk/boost/format/internals_fwd.hpp	(original)
+++ trunk/boost/format/internals_fwd.hpp	2012-10-14 21:28:53 EDT (Sun, 14 Oct 2012)
@@ -50,6 +50,10 @@
     template<class Ch, class Tr, class Alloc, class T> 
     basic_format<Ch, Tr, Alloc>& 
     feed (basic_format<Ch,Tr, Alloc>& self, T x);
+
+    template<class Ch, class Tr, class Alloc, class T> 
+    basic_format<Ch, Tr, Alloc>& 
+    feed_impl (basic_format<Ch,Tr, Alloc>& self, T x);
  
 } // namespace detail